当前位置:文档之家› Bezier曲线的绘制和拼接实验报告

Bezier曲线的绘制和拼接实验报告

Bezier曲线的绘制实验报告 一、程序实现环境 1操作系统:Windows XP 、Windows7 2.编程语言:C++ 3.程序实现环境:Visual C++ 6.0 二、算法思想

三、使用说明 程序界面如下图:

用户可以在编辑框中输入4个控制点的坐标,也可以通过在绘图区内直接通过鼠标的单击指定4个控制点的位置,输入4个控制端点后,单击“画Bezier曲线”按钮即可绘制Bezier曲线。 四、实验结果

五、程序代码(关键代码) void CMFC_BezierCurve2Dlg::OnLButtonDown(UINT nFlags, CPoint point) { if(pointOrd==1) //原点(490,270) { m_p1_x = point.x - 490; m_p1_y = 270 - point.y; } if(pointOrd==2) { CDC *pDC=GetDC(); pDC->MoveTo(490+m_p1_x, 270-m_p1_y); pDC->LineTo(point.x, point.y);

m_p2_x = point.x - 490; m_p2_y = 270 - point.y; } if(pointOrd==3) { CDC *pDC=GetDC(); pDC->MoveTo(490+m_p2_x, 270-m_p2_y); pDC->LineTo(point.x, point.y);

m_p3_x = point.x - 490; m_p3_y = 270 - point.y; } if(pointOrd==4) { CDC *pDC=GetDC(); pDC->MoveTo(490+m_p3_x, 270-m_p3_y); pDC->LineTo(point.x, point.y);

m_p4_x = point.x - 490; m_p4_y = 270 - point.y; } pointOrd++; UpdateData(FALSE);

CDialog::OnLButtonDown(nFlags, point); }

voidGetCnk (int n, int *c) { inti,k; for(k=0; k<=n; k++) { c[k]=1; for(i=n; i>=k+1; i--) c[k]=c[k]*i; for(i=n-k; i>=2; i--) c[k]=c[k]/i; } }

void CMFC_BezierCurve2Dlg::GetPointPos(intControlN, double t, int *c) { int k, n=ControlN-1; double Bernstein; Pt.x=0.0; Pt.y=0.0; for(k=0; k{ Bernstein=c[k]*pow(t,k)*pow(1-t,n-k); Pt.x += ControlP[0][k].x * Bernstein; Pt.y += ControlP[0][k].y * Bernstein; } }

void CMFC_BezierCurve2Dlg::OnButtonDrawBeziercurve() { UpdateData(); pointOrd=1; CDC *pDC=GetDC(); ControlP[0][0].x=m_p1_x;ControlP[0][0].y=m_p1_y; ControlP[0][1].x=m_p2_x;ControlP[0][1].y=m_p2_y; ControlP[0][2].x=m_p3_x;ControlP[0][2].y=m_p3_y; ControlP[0][3].x=m_p4_x;ControlP[0][3].y=m_p4_y;

pDC->MoveTo(490+m_p1_x, 270-m_p1_y); pDC->LineTo(490+m_p2_x, 270-m_p2_y); pDC->LineTo(490+m_p3_x, 270-m_p3_y); pDC->LineTo(490+m_p4_x, 270-m_p4_y); int *C, i; intControlN=4, m=500; C=new int[ControlN]; GetCnk (ControlN-1, C); for(i=0; i<=m; i++) { GetPointPos(ControlN, (double)i/(double)m, C); pDC->SetPixel(490+Pt.x, 270-Pt.y, 255); } } 两段Bezier曲线的拼接实验报告 一、程序实现环境 1操作系统:Windows XP 、Windows7 2.编程语言:C++ 3.程序实现环境:Visual C++ 6.0 二、算法思想

三、使用说明 程序界面如下图:

用户可以在编辑框中输入4个控制点的坐标,也可以通过在绘图区内直接通过鼠标的单击指定4个控制点的位置,输入4个控制端点后,单击“画Bezier曲线”按钮即可绘制Bezier曲线。 分别绘制完两段Bezier曲线后,单击拼接即可实现两段曲线的拼接。 四、实验结果 五、程序代码(关键代码) void CMFC_BezierCurve2Dlg::OnLButtonDown(UINT nFlags, CPoint point) { if(pointOrd==1) //原点(490,270) { m_p1_x = point.x - 490; m_p1_y = 270 - point.y; } if(pointOrd==2) { CDC *pDC=GetDC(); pDC->MoveTo(490+m_p1_x, 270-m_p1_y); pDC->LineTo(point.x, point.y);

m_p2_x = point.x - 490; m_p2_y = 270 - point.y; } if(pointOrd==3) { CDC *pDC=GetDC(); pDC->MoveTo(490+m_p2_x, 270-m_p2_y); pDC->LineTo(point.x, point.y); m_p3_x = point.x - 490; m_p3_y = 270 - point.y; } if(pointOrd==4) { CDC *pDC=GetDC(); pDC->MoveTo(490+m_p3_x, 270-m_p3_y); pDC->LineTo(point.x, point.y);

m_p4_x = point.x - 490; m_p4_y = 270 - point.y; }

pointOrd++; UpdateData(FALSE);

CDialog::OnLButtonDown(nFlags, point); }

voidGetCnk (int n, int *c) { inti,k; for(k=0; k<=n; k++) { c[k]=1; for(i=n; i>=k+1; i--) c[k]=c[k]*i; for(i=n-k; i>=2; i--) c[k]=c[k]/i; } }

void CMFC_BezierCurve2Dlg::GetPointPos(intControlN, double t, int *c) { int k, n=ControlN-1; double Bernstein; Pt.x=0.0; Pt.y=0.0; for(k=0; k{ Bernstein=c[k]*pow(t,k)*pow(1-t,n-k); Pt.x += ControlP[pointGroup][k].x * Bernstein; Pt.y += ControlP[pointGroup][k].y * Bernstein; } }

void CMFC_BezierCurve2Dlg::BezierCurve() { CDC *pDC=GetDC(); pDC->MoveTo(490 + ControlP[pointGroup][0].x, 270 - ControlP[pointGroup][0].y); pDC->LineTo(490 + ControlP[pointGroup][1].x, 270 - ControlP[pointGroup][1].y); pDC->LineTo(490 + ControlP[pointGroup][2].x, 270 - ControlP[pointGroup][2].y); pDC->LineTo(490 + ControlP[pointGroup][3].x, 270 - ControlP[pointGroup][3].y);

int *C, i; intControlN=4, m=500; C=new int[ControlN]; GetCnk (ControlN-1, C); for(i=0; i<=m; i++) { GetPointPos(ControlN, (double)i/(double)m, C); pDC->SetPixel(490+Pt.x, 270-Pt.y, 255); } }

void CMFC_BezierCurve2Dlg::OnButtonDrawBeziercurve() { UpdateData(); pointOrd=1;

ControlP[pointGroup][0].x=m_p1_x; ControlP[pointGroup][0].y=m_p1_y; ControlP[pointGroup][1].x=m_p2_x; ControlP[pointGroup][1].y=m_p2_y; ControlP[pointGroup][2].x=m_p3_x; ControlP[pointGroup][2].y=m_p3_y; ControlP[pointGroup][3].x=m_p4_x; ControlP[pointGroup][3].y=m_p4_y;

BezierCurve(); pointGroup++; }

void CMFC_BezierCurve2Dlg::OnButtonMatch() { pointGroup--;

double dx, dy; double k1, k2, s, s1, s2; int i; CPoint temp;

相关主题