VC++.net/MFC绘制一条曲线(比如y=0.1x+2)的实现。
要求:1. 有坐标轴,坐标轴上要显示坐标。 
2. 图像可以缩放 
3. 鼠标停留在曲线上时显示坐标。

解决方案 »

  1.   

    整个比较简单
    1.坐标轴用直线画
    2.方程已经定了,缩放很容易
    3.一个鼠标消息即可
    /////////////////////画曲线函数////////////////////////////
    ////////////////////直角坐标下的////////////////////////
    //y=fun(x)
    //p---绘图设备指针
    //fun---函数指针
    //StartP1---x的起始值
    //StartP2---x的终止值
    //PX---坐标原点x方向位置
    //PY---坐标原点y方向位置
    //Mx---x方向放大倍数
    //My---y方向放大倍数
    /////////////////////////////////////////////////////////
    void DrawCurve(HDC hDC,double (*fun)(double),double StartP1,double EndP1,int PX,int PY,double Mx,double My)
    {
    int i,N=int(Mx*(EndP1-StartP1));
    double x,y,dx;
    dx=(EndP1-StartP1)/N;
    x=StartP1;
    y=(*fun)(x);
    MoveToEx(hDC,PX+int(x*Mx),PY-int(y*My),NULL);
    for(i=1;i<=N;i++)
    {
    x=StartP1+i*dx;
    y=(*fun)(x);
    LineTo(hDC,PX+int(x*Mx),PY-int(y*My));
    }

    }
    ////////////////////任意坐标下的////////////////////////
    void DrawCurve(HDC hDC,double (*funX)(double),double (*funY)(double),double StartT,double EndT,int PX,int PY,double M)
    {
    int i,N=int(M*(EndT-StartT));
    double t,x,y,dt;
    dt=(EndT-StartT)/N;
    t=StartT;
    x=(*funX)(t);
    y=(*funY)(t);
    MoveToEx(hDC,PX+int(x*M),PY-int(y*M),NULL);
    for(i=1;i<=N;i++)
    {
    t=StartT+i*dt;
    x=(*funX)(t);
    y=(*funY)(t);
    LineTo(hDC,PX+int(x*M),PY-int(y*M));
    }

    }