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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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个控制端点

相关文档
最新文档