目的:
通过SPI从硬件上采集数据点,然后通过这些点绘制平滑的曲线,最后可以根据该曲线计算精度,要求精度能达到0.01以上!
基本思路:
1.采集原始数据集,即point点集; 
2.对这些点进行曲线拟合处理后,产生新的曲线点集; 
3.用新点集进行绘制,保证是连续光滑的曲线.但是用最小二乘法拟合曲线的时候出现了点问题,拟合后还是和我直接用Moveto,lineto连接的一样效果,并没有变呈平滑的曲线!是什么原因呢?//绘制平滑抛物线
const int  Clip=10;
void Draw2DGraph::DrawFreeLine()
{
HPEN mhPen = CreatePen(PS_SOLID,1,RGB(255,0,0));
HPEN mOldPen = (HPEN)SelectObject(hMem,mhPen);
// int i=0,j=0;
    int n=12;    //采样点个数
POINT point[12];
POINT Pt[12];
double t1,t2,t3,t,a,b,c,d,x,y; point[0].x = 0;
point[0].y = 0;
         
         /*用户坐标转换成屏幕坐标*/
for (int k = 1;k<SEGMENTS;k++)
{
point[k].x = rectClient.left+100+(CTTestpointSet[m_Index][k-1]/m_dXMaxValue)*5*STEP_LEN_X;
point[k].y = rectClient.bottom-100-50-(CTTestpointVoltage[m_Index][k-1]/m_dYMaxValue)*5*STEP_LEN_Y;
}          point[0].x = point[1].x;
point[0].y = point[1].y;
POINT pt = point[10];
point[11] = pt;
t=0.5f/Clip; MoveToEx(hMem,point[1].x,point[1].y,NULL);
for (int i=0;i<n-2;i++)
    {              for(int j=1;j<Clip;j++)
              {                     t1=j*t;                     t2=t1*t1;                     t3=t2*t1;                     a=4.0*t2-t1-4.0*t3;                     b=1.0-10.0*t2+12.0*t3;                     c=t1+8.0*t2-12.0*t3;                     d=4.0*t3-2.0*t2;                     x=a*point[i].x+b*point[i+1].x+c*point[i+2].x+d*point[i+3].x;                     y=a*point[i].y+b*point[i+1].y+c*point[i+2].y+d*point[i+3].y;;  LineTo(hMem,x,y);              }              LineTo(hMem,point[i+2].x,point[i+2].y);       }       for(i=0;i<n;i++)       {              pt=point[i];              Ellipse(hMem,pt.x-2,pt.y-2,pt.x+2,pt.y+2);       }   BitBlt(hdc,0,0,rectClient.right,rectClient.bottom,hMem,0,0,SRCCOPY);
  SelectObject(hMem,mOldPen);}新手上路,恳请各位大侠多多指点,不胜感激!

解决方案 »

  1.   

    GDI+ 双缓存  bezier曲线
      

  2.   

    贝塞尔曲线?现在我已经是用的双缓存+GDI了 只是GDI没绘制成功?
    能否直接给个连接地址,我是在查询机上!谢谢
      

  3.   

    所谓的“平滑”是?
    用 MoveTo LineTo 绘制的线 只要你的“察看区域”足够的小,你看到的还是“直线”
    直线算不算“平滑”?
      

  4.   

    这个急不? 如果不是很急就先学习下GDI+里的bezier曲线的画法,很简单,才几行代码,但不熟就可能要几天才能弄好。
    moveto lineto 这样的画法在拐点永远是不平的。
      

  5.   

    有一离散型值点列Pi(i=1,2,……,n),每经过相邻三点作一段抛物线我是想这样绘制平滑的,不知道能行?
    刚学,什么都不懂。
      

  6.   

    还是用最小二乘拟合曲线?只是连接的时候换GDI?
      

  7.   

    不可能在无限放大的时候还能平滑的!你只有调节精度,使得更平滑,当然,比如bezier曲线是必要的
      

  8.   

    重新设置了下特征点,用抛物线通过最小二乘拟合的,但是效果不是很好,精度条高了又会影响速度。还是考虑用bezier曲线,不知道有无那方面的DEMO,还有绘制后计算拐点的方法!
      

  9.   

    貌似在GDI+中,也没办法花处处平滑曲线 ,用bizier好像有点不好改