Bezier曲线的绘制和拼接实验报告_bezier曲线绘制实验
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.xpoint.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.xpoint.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.xpoint.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.xpoint.y;} pointOrd++;UpdateData(FALSE);
CDialog::OnLButtonDown(nFlags, point);}
voidGetCnk(int n, int *c){ inti,k;for(k=0;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;iSetPixel(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.xpoint.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.xpoint.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.xpoint.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.xpoint.y;}
pointOrd++;UpdateData(FALSE);
CDialog::OnLButtonDown(nFlags, point);}
voidGetCnk(int n, int *c){ inti,k;for(k=0;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, 270ControlP[pointGroup][1].y);pDC->LineTo(490 + ControlP[pointGroup][2].x, 270ControlP[pointGroup][3].y);
int *C, i;intControlN=4, m=500;C=new int[ControlN];GetCnk(ControlN-1, C);for(i=0;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;dx = ControlP[pointGroup][0].xControlP[pointGroup-1][3].y;for(i=0;i
ControlP[pointGroup][i].x-= dx;
ControlP[pointGroup][i].y-= dy;}
k1=1.0*(ControlP[pointGroup-1][3].y-ControlP[pointGroup-1][2].y)/(ControlP[pointGroup-1][3].x-ControlP[pointGroup-1][2].x);k2=1.0*(ControlP[pointGroup][1].y-ControlP[pointGroup][0].y)/(ControlP[pointGroup][1].x-ControlP[pointGroup][0].x);if(k1>0){
if(ControlP[pointGroup-1][2].x
s1 = atan(k1);
else
s1 = PI + atan(k1);} else if(k1
if(ControlP[pointGroup-1][2].x
s1 = 2*PI + atan(k1);
else
s1 = PI + atan(k1);}
if(k2>0){
if(ControlP[pointGroup][0].x
s2 = atan(k2);
else
s2 = PI + atan(k2);} else if(k2
if(ControlP[pointGroup][0].x
s2 = 2*PI + atan(k2);
else
s2 = PI + atan(k2);} s = s1(ControlP[pointGroup][i].y-ControlP[pointGroup-1][3].y)* sin(s)+ ControlP[pointGroup-1][3].x;
temp.y =(ControlP[pointGroup][i].x-ControlP[pointGroup-1][3].x)* sin(s)+(ControlP[pointGroup][i].y-ControlP[pointGroup-1][3].y)* cos(s)+ ControlP[pointGroup-1][3].y;
ControlP[pointGroup][i].x = temp.x;
ControlP[pointGroup][i].y = temp.y;}
BezierCurve();}