VC++画BEZIER曲线
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int CtrlPoint;//控制多边形顶点
……..
}
2) //TestView.cpp
#include "math.h"//数学头文件
#define N_MAX_POINT 10//控制多边形的最大顶点数
#define ROUND(a) int(a+0.5) //Baidu Nhomakorabea舍五入
。。。。。。
CTestView::CTestView()
其中 是Bernstein基函数,其表达式为:
,接着我们讨论3次Bezier曲线,我们也采用将表达式改写为矩阵形式的方法,我们得到:
4.源程序:
//1)TestView.h
class CTestView : public CView
{
…….
protected:
bool Flag;//标志
CPoint *pt;//顶点
}
dc.SetPixel(ROUND(x),ROUND(y),RGB(255,0,255));//曲线颜色
}
}
double CTestView::Cnk(const int &n, const int &i)//Bernstein第一项
{
return double(Factorial(n)/(Factorial(i)*Factorial(n-i)));
}
int CTestView::Factorial(int m)//阶乘函数
{
int f=1;
for(int i=1;i<=m;i++)
f*=i;
return f;
}
void CTestView::DrawCharPolygon()//绘制控制多边形
{
CClientDC dc(this);
CPen MyPen,*pOldPen;
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);
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
if(Flag)
{
pt[CtrlPoint].x=point.x;
pt[CtrlPoint].y=point.y;
实验四自由曲线绘制算法
1.实验目的:
掌握曲线的表示形式、曲线的连续性条件、拟合和逼近的基本概念
掌握Bezier曲线的性质
编程实现Bezier曲线生成算法
2.实验描述:
绘制三次Bezier曲线,可以采用公式法或德卡斯特里奥(De Casteliau)算法绘制
3.算法设计:
在空间给定 个点 ,称下列参数曲线为 次Bezier曲线:
MessageBox("单击左键绘制控制多边形,单击右键绘制曲线","提示",MB_OK);
pt=new CPoint[N_MAX_POINT];
Flag=true;CtrlPoint=0;
}
void CTestView::DrawBezier()//绘制Bezier曲线
{
CClientDC dc(this);
MyPen.CreatePen(PS_SOLID,3,RGB(0,255,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);
if(CtrlPoint<N_MAX_POINT)
CtrlPoint++;
else
Flag=false;
DrawCharPolygon();
}
}
void CTestView::OnRButtonDown(UINT nFlags, CPoint point)//调用绘制函数
{
// TODO: Add your message handler code here and/or call default
Flag=false;
DrawBezier();
CView::OnRButtonDown(nFlags, point);
}
5.运行结果:(屏幕截图)
{
Flag=false;
}
void CTestView::OnMENUBezierCurve()
{
// TODO: Add your command handler code here
RedrawWindow();
AfxGetMainWnd()->SetWindowText("三次Bezier曲线");//显示标题
}
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();
}
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)//获得屏幕控制点坐标
……..
}
2) //TestView.cpp
#include "math.h"//数学头文件
#define N_MAX_POINT 10//控制多边形的最大顶点数
#define ROUND(a) int(a+0.5) //Baidu Nhomakorabea舍五入
。。。。。。
CTestView::CTestView()
其中 是Bernstein基函数,其表达式为:
,接着我们讨论3次Bezier曲线,我们也采用将表达式改写为矩阵形式的方法,我们得到:
4.源程序:
//1)TestView.h
class CTestView : public CView
{
…….
protected:
bool Flag;//标志
CPoint *pt;//顶点
}
dc.SetPixel(ROUND(x),ROUND(y),RGB(255,0,255));//曲线颜色
}
}
double CTestView::Cnk(const int &n, const int &i)//Bernstein第一项
{
return double(Factorial(n)/(Factorial(i)*Factorial(n-i)));
}
int CTestView::Factorial(int m)//阶乘函数
{
int f=1;
for(int i=1;i<=m;i++)
f*=i;
return f;
}
void CTestView::DrawCharPolygon()//绘制控制多边形
{
CClientDC dc(this);
CPen MyPen,*pOldPen;
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);
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
if(Flag)
{
pt[CtrlPoint].x=point.x;
pt[CtrlPoint].y=point.y;
实验四自由曲线绘制算法
1.实验目的:
掌握曲线的表示形式、曲线的连续性条件、拟合和逼近的基本概念
掌握Bezier曲线的性质
编程实现Bezier曲线生成算法
2.实验描述:
绘制三次Bezier曲线,可以采用公式法或德卡斯特里奥(De Casteliau)算法绘制
3.算法设计:
在空间给定 个点 ,称下列参数曲线为 次Bezier曲线:
MessageBox("单击左键绘制控制多边形,单击右键绘制曲线","提示",MB_OK);
pt=new CPoint[N_MAX_POINT];
Flag=true;CtrlPoint=0;
}
void CTestView::DrawBezier()//绘制Bezier曲线
{
CClientDC dc(this);
MyPen.CreatePen(PS_SOLID,3,RGB(0,255,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);
if(CtrlPoint<N_MAX_POINT)
CtrlPoint++;
else
Flag=false;
DrawCharPolygon();
}
}
void CTestView::OnRButtonDown(UINT nFlags, CPoint point)//调用绘制函数
{
// TODO: Add your message handler code here and/or call default
Flag=false;
DrawBezier();
CView::OnRButtonDown(nFlags, point);
}
5.运行结果:(屏幕截图)
{
Flag=false;
}
void CTestView::OnMENUBezierCurve()
{
// TODO: Add your command handler code here
RedrawWindow();
AfxGetMainWnd()->SetWindowText("三次Bezier曲线");//显示标题
}
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();
}
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)//获得屏幕控制点坐标