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

2020-02-27 其他范文 下载本文

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();}

《Bezier曲线的绘制和拼接实验报告.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
Bezier曲线的绘制和拼接实验报告
点击下载文档
相关专题 bezier曲线绘制实验 实验报告 曲线 Bezier bezier曲线绘制实验 实验报告 曲线 Bezier
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文