当前位置:文档之家› 实验三 自由曲线的生成

实验三 自由曲线的生成

实验三 Bezier曲线生成
一、实验目的
1. 理解并会自己编程实现二维Bezier曲线的画图
二、实验内容和要求
1.选择自己熟悉的任何编程语言, 建议使用VB,VC或JAVA。

2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。

3.实现二维2、3、4阶Bezier曲线的描画。

4.将生成算法以菜单或按钮形式集成到用户界面上。

5.坐标参数可以用鼠标或键盘输入。

三.实验报告
1.用户界面的设计思想和框图。

2.各种实现算法的算法思想。

3.算法验证例子。

4.上交源程序。

四.Bezier曲线生成程序设计的步骤如下:
1.创建工程名称为“Test”单文档应用程序框架
(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。

(2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“Test”作为工程名称,单击“确定”按钮,出现Step 1对话框。

(3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。

(4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。

(5)在Step 6对话框中单击“完成”按钮,即完成“Test”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。

图1-2 信息程序基本
2.编辑菜单资源
设计如图1-1所示的菜单项。

在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-1中的定义编辑菜单资源。

此时VC已自动建好程序框架,如图1-2所示。

表1-1菜单资源表
3.添加消息处理函数
利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CTestView,根据表1-2建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。

表1-2菜单项的消息处理函数
onRButtonDown()。

4.添加一组自定义公有函数和变量
为CTestView类添加一组自定义公有函数和变量:
void DrawCharPolygon();//绘制特征多边形函数
int Factorial(int m);//阶乘函数
double Cnk(const int &n,const int &i);//Bernstein第一项
void DrawBezier();//绘制Bezier函数
bool Flag;//标志
CPoint *pt;//顶点
int CtrlPoint;//控制多边形顶点
方法:右击类条目CTestView。

5.程序结构代码,在CTestView文件中相应位置添加如下代码
(1)在#include "stdafx.h"
#include "Test.h"
#include "TestDoc.h"
#include "TestView.h"下添加如下预处理语句:
#include "math.h"//数学头文件
#define N_MAX_POINT 10//控制多边形的最大顶点数
#define ROUND(a) int(a+0.5)//四舍五入
(2)在CTestView::CTestView()中添加语句:
Flag=false;
(3)在void CTestView::DrawCharPolygon()中添加语句:
CClientDC dc(this);
CPen MyPen,*pOldPen;
MyPen.CreatePen(PS_SOLID,3,RGB(0,0,0));//控制多边形
pOldPen=dc.SelectObject(&MyPen);
for(int i=0;i<CtrlPoint;i++)
{
if(i==0)
{
dc.MoveTo(pt[i]);
dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);
}
else
{
dc.LineTo(pt[i]);
dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);
}
}
dc.SelectObject(pOldPen);
MyPen.DeleteObject();
(4)在int CTestView::Factorial(int m)中添加语句:
int f=1;
for(int i=1;i<=m;i++)
f*=i;
return f;
(5)在double CTestView::Cnk(const int &n, const int &i)中添加语句:
return double(Factorial(n)/(Factorial(i)*Factorial(n-i)));
(6)在void CTestView::DrawBezier()中添加语句:
CClientDC dc(this);
double x,y;
int rate=800,n;
n=CtrlPoint-1;
for(double t=0;t<=1;t+=1.0/rate)
{
x=0;y=0;
for(int i=0;i<=n;i++)
{
x+=pt[i].x*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);
y+=pt[i].y*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);
}
dc.SetPixel(ROUND(x),ROUND(y),RGB(0,0,255));//曲线颜色
}
(7)在void CTestView::OnLButtonDown(UINT nFlags, CPoint point)中添加语句:if(Flag)
{
pt[CtrlPoint].x=point.x;
pt[CtrlPoint].y=point.y;
if(CtrlPoint<N_MAX_POINT)
CtrlPoint++;
else
Flag=false;
DrawCharPolygon();
}
(8)在void CTestView::OnRButtonDown(UINT nFlags, CPoint point)中添加语句:Flag=false;
DrawBezier();
(9) 在void CTestView::OnMENUBezier()中添加语句:
RedrawWindow();
pt=new CPoint[N_MAX_POINT];
Flag=true;CtrlPoint=0;。

相关主题