威尼斯www.9778.com-威尼斯正版官方网站

MFC中使用teechart绘制两条曲线,x轴为时间,两条曲线的x轴区间不同,y轴基本相似,请问应该如何编写?多谢

日期:2019-12-25编辑作者:编程人生

图片 1

两个正规的3次贝塞尔曲线必要4个点:起头点、终止点以致多少个互相分开的中间点。

// 绘制曲线和坐标系

mfc连接数据库,使用teechar控件t绘制两条曲线,x轴坐标为时间,两条曲线x轴的间距不一样,希望曲线能遵照时间点绘制,实际不是依照曲线点数顺序绘制,请问该怎么编写代码?如图,浅米色曲线x轴区间应该在2017-05-1815:29:03:056到2017-05-1820:53:35:981之间,但在图中国远洋运输总公司远抢先了该区间。灰色曲线的x轴区间为图上2017-05-1815:29:03:056到2017-05-2116:29:44:970里面。请问怎么着让两条曲线可以显得相应的x轴区间中,并非坚守点数来绘制。谢谢

三遍贝塞尔曲线指令:C x1 y1, x2 y2, x y,多少个调控点和,代表曲线的尖峰。字母C表示一定动作与作为,这里需求大写,表示专门的职业一回方贝塞尔曲线。cubic-bezier, 直译为“立方-贝塞尔”,实际上正是指的正规一次方贝塞尔曲线。

    

个中 P0, P1 ,P2, P3 都为两维 xy 向量。

    {

别的,稳重察看曲线的斜率简单开掘,曲线y=x2的斜率在每每加码,表达变化越来越快,作用在View组件上就是刚最初挺慢的,然后不断加快的法力;而曲线y=x的斜率在任何时间任何地点减小,表明变化尤为慢,成效在View组件上正是刚初始挺快的,然后不断减速的功能。

图片 2  

无意见到了介绍运动曲线的叁个很有意思的网址cubic-bezier,在cubic-bezier.com网址中简易绘制要求形状的曲线,然后选用线性曲线作为参照他事他说加以考察,就足以查看方块的运动变化情形。借着那个机会,大家就来聊后生可畏聊一些动漫中的运动曲线吧!

图2 显示坐标提醒

linear:float LinearTween(float t, float start, float end){return t * start +  * end; }ease in:float QuadraticEaseIn(float t, float start, float end){return LinearTween(t * t, start, end); } ease in out:float QuadraticEaseInOut(float t, float start, float end){float middle = (start + end) / 2;t = 2 * t;if (t <= 1) return LinearTween(t * t, start, middle);t -= 1;return LinearTween(t * t, middle, end); }

类名字为CChart,其基类为CChartBase。CChartBase首要用来体现,设置坐标系的片段性质,比方x,y轴能够显得的约束、坐标系边框颜色、背景颜色等;而CChart则用于展示坐标系和多条曲线,曲线颜色、线宽、等凡是可以预知的品质都足以设定。用法如下:

图片 3

示范代码:

大家都通晓时间是风度翩翩秒生机勃勃秒过去的,也正是线性的,匀速前行的。要是属性值从起首值到告竣值是匀速变化的话,那么全体动漫看起来正是慢慢地均匀地变化着。可是,要是大家想让动漫片变得不慢恐怕变得非常慢如何是好?答案是大家能够透过“点窜时间”来达成那些职责!实际上正是一条函数曲线。

图3 坐标系呈现范围缩放

cubic-bezier(.25,.1,.25,1)

 

cubic-bezier 公式不是简单的 y= x 公式,而是引进了第三个变量 t,由于动漫中关键在于总括比例,即在总时间的有个别时间点百分比得到相应的值相对于最后值的比重,那么只必要得到0,1 区间的曲线就可以。 而 [x,y] -> [0,1] 内的曲线则是通过 t 在 0,1 内接连变化而获取:

   if( m_ptLeftButtonDown.x != -1)

.25,.1那些坐标对于源点连接的那些锚点;.25,1那个坐标对于极端头上那根天线顶上部分那几个点。有人会疑窦,动漫这一个cubic-bezier值好像唯有三个点诶~~那是因为动漫贝塞尔曲线的起源和终端已经固定了,分别是和。

5. 在WM_PAINT音信或任哪个地方方绘制曲线。先安装显示在此些地点,然后绘制。

图片 4活动曲线

  方今在做四个课题,要来得几条数值曲线。可是不想依赖其他控件,或别的合营社提供的开采包,如MATCOM,用这一个的话就太简单但是了。上边是三个和睦安插的二个类,用API堆的,那样不只能够在依靠SDK应用开拓使用,又有啥不可在MFC框架中动用。下边多少个图是测验时截的。在这里声澳优(Ausnutria Hyproca卡塔尔国(Beingmate卡塔尔下,小编是风姿罗曼蒂克新手,难免设计的不客观以致错误,敬请谅解!点此下载源代码和演示代码。

linear是线性运动,ease 规定慢速起首,然后变快,然后慢速停止的过渡效果(cubic-bezier(0.25,0.1,0.25,1卡塔尔(英语:State of Qatar)); ease-in 规定以慢速开首的联网效果; ease-out 规定以慢速结束的接入效果(等于 cubic-bezier(0.42,0,1,1卡塔尔(قطر‎); ease-in-out 规定以慢速起头和终止的连片效果(等于 cubic-bezier(0.42,0,0.58,1卡塔尔国)。

case WM_LBUTTONDOWN:

        chart.OnLeftButtonDown(LOWORD(lParam), HIWORD(lParam));
        break;
    case WM_LBUTTONUP:
        chart.OnLeftButtonUp(LOWORD(lParam), HIWORD(lParam));
        break;
    case WM_RBUTTONDOWN:
        chart.OnRightButtonDown(LOWORD(lParam), HIWORD(lParam));
        break;
    case WM_RBUTTONUP:
        chart.OnRightButtonUp(LOWORD(lParam), HIWORD(lParam));
        break;
    case WM_MOUSEMOVE:
        chart.OnMouseMove(LOWORD(lParam), HIWORD(lParam));
        break;
    case 0x020A/*WM_MOUSEWHEEL*/:
        {
            POINT pt = { LOWORD(lParam), HIWORD(lParam) };
            ScreenToClient( hWnd,&pt );
            chart.OnMouseWheel(wParam, pt.x, pt.y);
        }
        break;

那就是说,大家用代码完毕正是那样:

1. 将DispChart.h和DispChart.cpp满含至用利用该类的Project中,若为基于MFC项目,则在DispChart.cpp中增加#include ”stdafx.h”。

cubic_bezier 曲线节制了来因去果两调控点的地点,通过调治个中两调节点的岗位能够灵活得到常用的卡通片效果。动漫所做的事体就是把 x 轴充任时刻比例,依据曲线获得 y 轴对应的值,并更正到动漫对象中去。

图片 5
图1  展现多条曲线

平时来讲图所示,x轴表示时间的比值,y轴代表属性值。如若属性值是从0变化到1,暗中同意境况下线性插值器就和曲线y=x同样,在时间t的地点上的值为f=t。可是,当我们设置函数y=x2大概y=x时,动漫的功效就全盘不相同啊。在t=0.5的时刻,y=x^2=0.25 < 0.5,表示它将时间推移了;而y=x^=0.71 > 0.5,表示它将时间提前了。

      std::vector<double> data[3];

注:t为时间,start为源点,end为截止点

             chart.SetGridColor(RGB(255,0,0));    // 设置网格颜色
              chart.SetGriddx(10);                 // 设置网格x轴间隔
              chart.SetClrLabel(RGB(0,0,255));     // 标尺颜色
              chart.SetXLabel("t/min");            // 轴标文字
              chart.SetYLabel("V/v");
              chart.SetRulerXFormat("%.2f");       // x轴标尺显示精度
              chart.SetGriddy( 0.01);
              chart.SetXRange( 0, 100);            // x轴可以显示的范围
             chart.SetYRange( -5, 5); 

图片 6移动图例图片 7次第表示linear,ease in甚至ease in out

图片 8

图片 94个点

 头文件定义如下:

#ifndef _DISPCHART_H
#define _DISPCHART_H
#include 
#include 
#include 

// 图表基类:用于绘制坐标系和曲线
class CChartBase
{
protected:
    HDC       m_hChartDC;       // 图表绘制的DC
    RECT      m_rtWindow;       // 坐标窗口,其中包含图表显示区和坐标标尺,轴标等    
    RECT      m_rtChart;        // 图标显示区(依赖域m_rtWindow)

    // 坐标显示边界
    double    m_xStart;         // 实数域内x轴起点
    double    m_xEnd;           //         x轴终点
    double    m_yStart;         //         y轴起点
    double    m_yEnd;           //         y轴终点

    // 显示图表区
    COLORREF  m_clrChartBg;     // 显示区背景色
    COLORREF  m_clrChartBorder; //       边框色

    // 网格
    bool      m_bGridOn;        // 控制网格是否显示
    double    m_dxGrid;         // 网格单元宽
    double    m_dyGrid;         // 网格单元高
    COLORREF  m_clrGrid;        // 网格线颜色

    // 坐标轴,轴标,标尺
    char      m_xLabel[20];
    char      m_yLabel[20];
    bool      m_bxLabelOn; 
    bool      m_byLabelOn;

    bool      m_bxRulerOn;
    bool      m_byRulerOn;
    char      m_szRulerXFormat[128];
    char      m_szRulerYFormat[128];

    COLORREF  m_clrLabel;      // 轴标文字和刻度文字颜色

    // 文字字体
    LOGFONT     m_logFont;

    // 曲线数据

public:

    // 辅助函数
    void SetChartDC(HDC hdc);
    HDC  GetChartDC() const ;
    void SetChartWindowPosition(RECT rect);
    void SetChartWindowPosition(int left, int top, int right, int bottom);
    RECT GetChartWindowPosition() const;
    void SetChartPosition(RECT rect);
    void SetChartPosition(int left, int top, int right, int bottom);

    RECT GetChartPosition() const;
    int  GetChartWidth()const  { return m_rtChart.right - m_rtChart.left ; };
    int  GetChartHeight()const { return m_rtChart.bottom - m_rtChart.top ; };
    int  GetChartWindowWidth() const { return m_rtWindow.right - m_rtWindow.left; };
    int  GetChartWindowHeight() const{ return m_rtWindow.bottom - m_rtWindow.top; };

    // 坐标显示边界
    double SetXStart(double xStart);
    double SetXEnd(double xEnd);
    void   SetXRange(double xStart,double xEnd);
    double SetYStart(double yStart);
    double SetYEnd(double yEnd);
    void   SetYRange(double yStart,double yEnd);
    double GetXStart()const;
    double GetXEnd()const;
    double GetYStart()const;
    double GetYEnd()const;

    // 显示图表区
    void      SetClrChartBg(COLORREF clr);
    COLORREF  GetClrChartGb()const;
    void      SetClrChartBorder(COLORREF clr);
    COLORREF  GetClrChartBorder()const;

    // 网格
    double   SetGriddx(double dxGrid);              // 设置网格宽度,返回前一个值
    double   SetGriddy(double dyGrid);              // 设置网格高度,返回前一个值
    void     SetGridxy(double dxGrid,double dyGrid);
    COLORREF SetGridColor(COLORREF color);          // 设置网格颜色,返回前一个值
    void SetGridOn();                               // 设置网格为显示状态
    void SetGridOff();                              // 设置网格为关闭状态

    double   GetGriddx()const;
    double   GetGriddy()const;
    COLORREF GetGridColor()const;
    bool     GetGridStatus()const;

    // 坐标轴,轴标,标尺
    void    SetXLabel(const char* xLabel);
    void    SetYLabel(const char* yLabel);
    void    SetXLabelOn();
    void    SetXLabelOff();
    BOOL    GetXLabelStatus()const;
    void    SetYLabelOn();
    void    SetYLabelOff();
    BOOL    GetYLabelStatus()const;

    void    SetXRulerOn();
    void    SetXRulerOff();
    BOOL    GetXRulerStatus()const;
    void    SetYRulerOn();
    void    SetYRulerOff();
    BOOL    GetYRulerStatus()const;

    void    SetRulerXFormat(const char str[]) { strcpy(m_szRulerXFormat, str);};
    void    SetRulerYFormat(const char str[]) { strcpy(m_szRulerXFormat, str);};

    void     SetClrLabel(COLORREF clr);
    COLORREF GetClrLabel()const;

    // 字体
    void    SetLogFont(LOGFONT logFont);
    LOGFONT GetLogFont()const;


    // 每一个象素所代表的实数值
    double GetYPerPix() const;
    double GetXPerPix() const;

protected:
    int  ShowChartBg();
    int  ShowGrid();
    int  ShowRuler();
    int  ShowLabel();

public:
    CChartBase();
    ~CChartBase();

    int ShowAt(int left, int top, int right, int bottom); // 在rect中显示该图标窗口,外部最好用该函数
    int ShowAt(RECT rect);
    int Show();                                           // 通过设置各种参数显示

    // 坐标转换 r--real  s--screen 2--to
    int rx2sx(double rx);  
    int ry2sy(double ry);
    double sx2rx(int sx);
    double sy2ry(int sy);

    // 坐标变换
    void Move(double drx, double dry);                   // 坐标系平移
    void ScaleCenter(double times);                      // 坐标以坐标框的中心放缩
                                                         // times>1时,显示范围扩大,起到缩小的作用
                                                         // times<1时,显示范围缩小,起到放大的作用
    void ScaleX(double times);                           // X轴范围缩放(以x轴中心)
    void ScaleY(double times);                           // Y轴范围缩放(以y轴中心)
};

class CChart:public CChartBase
{
private:
    HWND       m_hWnd;           // 图表所在的窗口,该窗口可以处理消息(用于实现坐标变换等)
    HDC        m_memDCWindow;    // 存储整个绘图窗用的内存句柄
    HBITMAP    m_bmpInDCWindow;  
    HDC        m_memDCChart;     // 存储chart的内存设备句柄
    HBITMAP    m_bmpInDCChart;   // 图表所对应的位图句柄

    // 曲线数据
public:

    std::vector

 

      int length = 1000;
   double amp = 5;
   for(int i=0;i<length;i++)
   {
    double t = (20 * 3.1415926 / length) * i;
    double y1 = amp*sin(t);
    double y2 = (amp/2)*cos(t);
    data[0].push_back(t);
    data[1].push_back(y1);
    data[2].push_back(y2);
   }
    chart.AddMCurves(data,3);
    chart.SetCurveColor(0,RGB(0,0,0));

     

 

 }

3. (可选)设置相应的品质。如:    

case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: 在此添加任意绘图代码..
        RECT rect;
        GetClientRect(hWnd,&rect);

        chart.SetChartDC(hdc);

        chart.SetChartAndWindowPosition(rect);

         chart.ShowCurves();

        EndPaint(hWnd, &ps);
        break;

 

2. 概念八个此类的变量,CChart chart(hWnd卡塔尔; hWnd是该坐标所在窗口的句柄。

4. 增加曲线数据连接,曲线数据必得是vector<double>型的。如:

 

 m_ptLeftButtonDown.y = y;

 

 

 

 m_ptLeftButtonDown.x = x;

 

 Move( -(x - m_ptLeftButtonDown.x) * GetXPerPix() , -(y - m_ptLeftButtonDown.y) * GetYPerPix());

 ShowCurves();

6. (可选)若要动态缩放、平移、左键点击呈现坐标提示窗口、右键框选缩放,则只需在对应的消息管理处增多相关操作就能够。注意:由于本身是用该类绘制周期性的曲线的,所以平移和缩放只是x轴的;若要同临时间活动或缩放,在CChart::OnMouseWheel函数少将ScaleX校订为ScaleCenter即能够做到x,y轴同时缩放,在CChart::OnMouseMove函数中期维更正Move的第二参数为-(y - m_ptLeftButtonDown.y) * GetYPerPix(卡塔尔(قطر‎即能够成功x,y轴同时活动。

    

本文由威尼斯www.9778.com发布于编程人生,转载请注明出处:MFC中使用teechart绘制两条曲线,x轴为时间,两条曲线的x轴区间不同,y轴基本相似,请问应该如何编写?多谢

关键词:

求助 cannot convert parameter 4 from &#x27;char [260]&#x27; to &#x2

CDatabasedb;charDB[MAX_PATH];sprintf(DB,"ODBC;DSN=User_odbc;UID="",PWD=""");//LPCTSTRch=(LPCTSTR)DB[MAX_PATH];//db.Open(NULL,FALSE,FALSE,ch);db.Open(NU...

详细>>

ActiveX控件的基本操作方法以及如何在VS2010下使用控件

vc做了个工程,加了一个ActiveX的控件,添加成功,控件也出来了,然后我想修改一些属性需要关联控件,然后我在d...

详细>>

被控件Zorder难点烦扰几天

第九章 、 TreePanel 我们做iOS开发是一定会有很多的页面跳转,用代码写是不是很烦呢,特别使我们已经了解storyboard的...

详细>>

求助:MFC静态嵌套拆分窗口的问题

在初始分隔四个视图,然后左上视图是树状结构,通过节点改变左下和右下视图;;;;左下视图可以输入数字,并...

详细>>