目的:
通过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);}新手上路,恳请各位大侠多多指点,不胜感激!
通过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);}新手上路,恳请各位大侠多多指点,不胜感激!
能否直接给个连接地址,我是在查询机上!谢谢
用 MoveTo LineTo 绘制的线 只要你的“察看区域”足够的小,你看到的还是“直线”
直线算不算“平滑”?
moveto lineto 这样的画法在拐点永远是不平的。
刚学,什么都不懂。