Bezier曲线的算法实现

合集下载

三次Bezier曲线原理及实现代码

三次Bezier曲线原理及实现代码

Bezier曲线原理及实现代码(c++)一、原理:贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。

贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau 算法开发,以稳定数值的方法求出贝塞尔曲线。

线性贝塞尔曲线给定点P0、P1,线性贝塞尔曲线只是一条两点之间的直线。

这条线由下式给出:且其等同于线性插值。

二次方贝塞尔曲线的路径由给定点P0、P1、P2的函数B(t) 追踪:。

TrueType字型就运用了以贝塞尔样条组成的二次贝塞尔曲线。

P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝塞尔曲线。

曲线起始于P0走向P1,并从P2的方向来到P3。

一般不会经过P1或P2;这两个点只是在那里提供方向资讯。

P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。

曲线的参数形式为:。

现代的成象系统,如PostScript、Asymptote和Metafont,运用了以贝塞尔样条组成的三次贝塞尔曲线,用来描绘曲线轮廓。

一般化P0、P1、…、P n,其贝塞尔曲线即。

例如:。

如上公式可如下递归表达:用表示由点P0、P1、…、P n所决定的贝塞尔曲线。

则用平常话来说,阶贝塞尔曲线之间的插值。

一些关于参数曲线的术语,有即多项式又称作n阶的伯恩斯坦基底多项式,定义00 = 1。

点P i称作贝塞尔曲线的控制点。

多边形以带有线的贝塞尔点连接而成,起始于P0并以P n终止,称作贝塞尔多边形(或控制多边形)。

贝塞尔多边形的凸包(convex hull)包含有贝塞尔曲线。

线性贝塞尔曲线函数中的 t 会经过由 P 0 至P 1 的 B(t ) 所描述的曲线。

例如当 t=0.25 时,B(t ) 即一条由点 P 0 至 P 1 路径的四分之一处。

就像由 0 至 1 的连续 t ,B(t ) 描述一条由 P 0 至 P 1 的直线。

Bezier曲线原理及实现代码(c++)

Bezier曲线原理及实现代码(c++)

Bezier曲线原理及实现代码(c++)Bezier曲线原理及实现代码(c++)2009-06-30 18:50:09| 分类: |字号⼀、原理:贝塞尔曲线于,由⼯程师(Pierre Bézier)所⼴泛发表,他运⽤贝塞尔曲线来为的主体进⾏设计。

贝塞尔曲线最初由于运⽤开发,以的⽅法求出贝塞尔曲线。

线性贝塞尔曲线给定点 P0、P1,线性贝塞尔曲线只是⼀条两点之间的。

这条线由下式给出:且其等同于。

⼆次⽅贝塞尔曲线的路径由给定点 P0、P1、P2的函数 B(t) 追踪:。

字型就运⽤了以组成的⼆次贝塞尔曲线。

P0、P1、P2、P3四个点在平⾯或在三维空间中定义了三次⽅贝塞尔曲线。

曲线起始于 P0⾛向 P1,并从 P2的⽅向来到 P3。

⼀般不会经过 P1或 P2;这两个点只是在那⾥提供⽅向资讯。

P0和 P1之间的间距,决定了曲线在转⽽趋进 P3之前,⾛向 P2⽅向的“长度有多长”。

形式为:。

现代的成象系统,如、和,运⽤了以组成的三次贝塞尔曲线,⽤来描绘曲线轮廓。

P0、P1、…、P n,其贝塞尔曲线即。

例如:。

如上公式可如下递归表达:⽤表⽰由点 P0、P1、…、P n所决定的贝塞尔曲线。

则⽤平常话来说,阶贝塞尔曲线之间的插值。

⼀些关于参数曲线的术语,有即多项式,定义 00 = 1。

点 P i称作贝塞尔曲线的控制点。

以带有的贝塞尔点连接⽽成,起始于 P0并以 P n终⽌,称作贝塞尔多边形(或控制多边形)。

贝塞尔多边形的(convex hull)包含有贝塞尔曲线。

线性贝塞尔曲线函数中的t会经过由 P0⾄P1的 B(t) 所描述的曲线。

例如当t=0.25时,B(t) 即⼀条由点 P0⾄ P1路径的四分之⼀处。

就像由0 ⾄ 1 的连续t,B(t) 描述⼀条由 P0⾄ P1的直线。

为建构⼆次贝塞尔曲线,可以中介点 Q0和 Q1作为由 0 ⾄ 1 的t:由 P0⾄ P1的连续点 Q0,描述⼀条线性贝塞尔曲线。

bezier 曲线拟合算法

bezier 曲线拟合算法

bezier 曲线拟合算法
贝塞尔曲线(Bezier Curve)是一种数学曲线,常用于图形设计和计算机图形学中的曲线拟合。

贝塞尔曲线可以通过控制点来描述曲线的形状。

在曲线拟合中,常用的一种算法是贝塞尔曲线拟合算法,其基本想是通过调整控制点的位置来逼近给定的数据点集合。

以下是一个简单的贝塞尔曲线拟合算法的步骤:
1.给定一组数据点集合,这些点将成为贝塞尔曲线要拟合的目标。

2.选起始控制点和结束控制点,这两个控制点定义了曲线的起始和
结束位置。

3.根据需求选择其他控制点的数量,每个控制点都会对曲线形状产
生影响。

4.根据控制点的位置,使用贝塞尔曲线公式计算出曲线上的各个点。

5.使用某种误差度量方法(例如最小二乘法),将拟合曲线与原始数
据点进行比较,并调整控制点的位置以减小误差。

6.重复步骤4和步骤5,直至达到满意的拟合效果或收敛。

需要注意的是,贝塞尔曲线拟合算法的具体实现方式可能因应用环境和需求而有所差异,这里只是提供了一种基本的算法框架。

在实际应用中,您可以根据具体情况进行调整和优化。

同时,还有其他的曲线拟合算法,如多项式拟合、样条曲线等,您也可以根据自己的需求选择适合的算法。

Bezier 曲线绘制实验文档

Bezier 曲线绘制实验文档

Bezier 曲线绘制实验文档
2005.10
一、实验目的
编程实现中点分割法绘制Bezier曲线。

二、实现功能
实验程序通过OpenGL实现,可以通过鼠标单击左键绘制Bezier控制点,单击右键结束控制点绘制并显示Bezier曲线。

单击控制点可以选择控制点,这个时候可以通过拖拽移动控制点,同时Bezier曲线的变化也将反应;按键盘上的d可以删除控制点,i可以在这个控制点和下一个控制点的中点位置增加一个新的控制点。

按c可以清除所有内容以重新绘制。

通过上下键可以增加或者缩小阈值。

三、程序实现
1、Bezier曲线绘制算法
函数calBezier通过中点分割法绘制Bezier曲线。

利用递归的方法实现,calPiece是递归子函数。

算法伪码描述如下:
考虑到最后需要求出2n-1个控制点,因此预先将n个控制点间隔排列放到大小为2n-1的数组中。

之后对于每一层次的求解,将两个控制点的中点求出来的结果放到这两个控制点所在数组序号中间的位置即可。

如下表所示(4个控制点)。

表中红色的内容为每一个循环中需要计算的内容,使用其上一行中序号在前一位和后一位的控制点的中点。

最后结果前4项就是第一段Bezier曲线的控制点,后4项就是第二段Bezier曲线的控制点。

3、OpenGL函数
四、实验结果
在VS2003+WinXP平台下实现了程序。

Bezier曲线和样条曲线的生成算法

Bezier曲线和样条曲线的生成算法

计算机图形学实验报告实验名称 Bezier曲线和样条曲线的生成算法评分实验日期年月日指导教师姓名专业班级学号一、实验目的1、复习Bezier曲线和B样条曲线的参数表示法。

2、编程实现用二次Bezier曲线绘制。

3、编程实现用三次Bezier曲线绘制和分段光滑Bezier曲线图形的绘制。

4、用三次B样条函数绘制曲线。

二、实验要求1、编程实现在屏幕上绘制出两次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。

2、现在屏幕上绘制出三次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。

1、编程实现用分段三次Bezier曲线绘制光滑Bezier曲线图形。

1、编程实现在屏幕上绘制出三次B样条函数绘制曲线。

2、编程实现在屏幕上绘制出光滑连接的三次B样条曲线。

三、关键算法及实现原理1、二次Bezier曲线的计算公式为:P(t)=(P0-2P1+P2)t2+(-2P0+2P1)t+P0X(t)=(X0-2X1+X2)t2+(-2X0+2X1)t+X0Y(t)=(Y0-2Y1+Y2)t2+(-2Y0+2Y1)t+Y0其中P0、P1、P2为三个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2)。

2、次Bezier曲线的计算公式为:P(t)=(-P0+3P1-3P2+P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P1)t+P0X(t)= (-X0+3X1-3X2+X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X1)t+X0Y(t)= (-Y0+3Y1-3Y2+Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y1)t+Y0其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。

3、三次B样条函数绘制曲线的计算公式为:P(t)=[(-P0+3P1-3P2+3P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P2)t+(P0+4P1+P2)]/6X(t)=[(-X0+3X1-3X2+3X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X2)t+(X0+4X1+X2)]/6Y(t)=[(-Y0+3Y1-3Y2+3Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y2)t+(Y0+4Y1+Y2)]/6其中P0、P1、P2、P3为四个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2) 、(X3、Y3)。

计算机图形学Bezeir算法实验报告

计算机图形学Bezeir算法实验报告

实验四 自由曲线绘制算法1. 实验目的:1.掌握曲线的表示形式、曲线的连续性条件、拟合和逼近的基本概念2.掌握Bezier 曲线的性质3.编程实现Bezier 曲线生成算法2. 实验描述:绘制三次Bezier 曲线,可以采用公式法或德卡斯特里奥(De Casteliau )算法绘制。

3. 算法设计:在空间给定1n +个点012,,,,n PP P P ,称下列参数曲线为n 次Bezier 曲线:,0()(),01ni i n i P t P B tt ==≤≤∑其中,()i n B t 是Bernstein 基函数,其表达式为:,!()(1)!()!i n ii n n B t t ti n i -=--,接着我们讨论3次Bezier 曲线,我们也采用将表达式改写为矩阵形式的方法,我们得到:3303!()(1)!(3)!i i ii P t P t t i i -==--∑32230123(1)3(1)3(1)t P t t P t t P t P =-+-+-+01323232323331,363,33,P P t t t t t t t t t P P ⎡⎤⎢⎥⎢⎥⎡⎤=-+-+-+-+⎣⎦⎢⎥⎢⎥⎣⎦01322313313630,,,133001000P P t t t P P --⎡⎤⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⎡⎤=⎣⎦⎢⎥⎢⎥-⎢⎥⎢⎥⎣⎦⎣⎦4. 源程序://1)TestView.hclass CTestView : public CView {…….protected:bool Flag;//标志CPoint *pt;//顶点int CtrlPoint;//控制多边形顶点……..}2) //TestView.cpp#include "math.h"//数学头文件#define N_MAX_POINT 10//控制多边形的最大顶点数#define ROUND(a) int(a+0.5) //四舍五入。

Bezier曲线

Bezier曲线

1Bezier曲线绘制算法的实现林小青, 冯琦(西北工业大学,中国西安710129)摘要:首先阐述了Bezier曲线的原理及算法,进而研究了在Visual C++6.0环境下开发基于OpenGL绘制Bezier 曲线的函数实现。

该实现方法简单快捷,并且可以实现高阶Bezier曲线。

实例说明设计效果良好。

关键字:Bezier曲线,程序开发,Visual C++,OpenGL中图分类号:TP311.11 文献标识码:AOpenGL-based synthetic vision research and simplifiedimplementationLIN Xiao-qing,FENG Qi(Northwestern Polytechnical University, xi’an 710129, China)Abstract: This synthetic vision system by studying the composition and the basic principles, introducesthe data acquisition, 3D modeling, texture mapping and other key technologies in 3D graphics, and implemented a simple OpenGL-based applications. Experimental results show that the shape of the realistic modeling results, the resolution obviously, is an efficient and practical modeling. In this paper,the idea of the real terrain simulation has important reference value.Key words: synthetic vision; texture mapping; DEM0 引言Bezier曲线是由法国雷诺汽车公司的工程师贝齐尔在上世纪60年代提出的,该方法采用折线组成的多边形来定义一条曲线,设计者先用折线多边形描绘出这条曲线的大致轮廓,再用Bezier曲线表达式产生一条光滑的曲线。

广工图形学实验Bezier曲线生成

广工图形学实验Bezier曲线生成

计算机学院计算机科学与技术专业7 班学号3109006191姓名刘英双协作者教师评定实验四Bezier曲线生成1、实验目的与要求1.通过实验掌握理解并会自己编程实现二维Bezier曲线的画图;2.实现二维2、3、4阶Bezier曲线的绘制。

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

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

2、实验方案1.实验1:○1Bezier曲线定义:给定n+1个控制顶点Pi(i=0~n) ,则Bezier曲线定义为:P(t)=∑Bi,n(t)Pi u∈[0,1]其中:Bi,n(t)称为基函数。

Bi,n(t)=Ci nti (1-t)n-iCi n=n!/(i!*(n-i)!)○2Bezier曲线性质✧端点性质:a)P(0)=P0, P(1)=Pn, 即:曲线过二端点。

b)P’(0)=n(P1-P0), P’(1)=n(Pn-Pn-1)即:在二端点与控制多边形相切。

✧凸包性:Bezier曲线完成落在控制多边形的凸包内。

✧对称性:由Pi与Pn-i组成的曲线,位置一致,方向相反。

✧包络性:Pn (t)=(1-t)Pn-1 (t)+tPn-1 (t)2.实验2✧实现了在菜单【曲线】->生成,弹出一个对话框,要求用户输入Bezier曲线的次数。

✧实现了在菜单【曲线】->计算,去掉点,计算生成Bezier曲线的控制点✧在界面中用鼠标左键点击,确定控制点,输入完控制点后,系统自动生成Bezier曲线3、实验结果和数据处理1.实验1实验结果:○1实验的代码如下:#include <GL/glut.h>#include <stdlib.h>#include <vector>using namespace std;struct Point {int x, y;};Point pt[4], bz[11];vector<Point> vpt;bool bDraw;int nInput;void CalcBZPoints(){float a0,a1,a2,a3,b0,b1,b2,b3;a0=pt[0].x;a1=-3*pt[0].x+3*pt[1].x;a2=3*pt[0].x-6*pt[1].x+3*pt[2].x;a3=-pt[0].x+3*pt[1].x-3*pt[2].x+pt[3].x;b0=pt[0].y;b1=-3*pt[0].y+3*pt[1].y;b2=3*pt[0].y-6*pt[1].y+3*pt[2].y;b3=-pt[0].y+3*pt[1].y-3*pt[2].y+pt[3].y;float t = 0;for(int i = 0; t<1.1; t+=0.1, i++){bz[i].x = a0+a1*t+a2*t*t+a3*t*t*t;bz[i].y = b0+b1*t+b2*t*t+b3*t*t*t;}}void ControlPoint(vector<Point> vpt){glPointSize(2);for(int i=0; i<vpt.size(); i++){glBegin (GL_POINTS);glColor3f (1.0f, 0.0f, 0.0f); glV ertex2i (vpt[i].x,vpt[i].y);glEnd ();}}void PolylineGL(Point *pt, int num){glBegin (GL_LINE_STRIP);for(int i=0;i<num;i++){glColor3f (1.0f, 1.0f, 1.0f);}glEnd ();}void myDisplay(){glClear(GL_COLOR_BUFFER_BIT);glColor3f (1.0f, 1.0f, 1.0f);if (vpt.size() > 0) {ControlPoint(vpt);}if(bDraw){PolylineGL(pt, 4);CalcBZPoints();PolylineGL(bz, 11);}glFlush();}void Init(){glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);}void Reshape(int w, int h){glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h); }void mouse(int button, int state, int x, int y){switch (button){case GLUT_LEFT_BUTTON:if (state == GLUT_DOWN){if (nInput == 0){pt[0].x = x;pt[0].y = 480 - y;nInput = 1;vpt.clear();vpt.push_back(pt[0]);glutPostRedisplay();// }else if (nInput == 1){pt[1].x = x;pt[1].y = 480 - y;vpt.push_back(pt[1]);nInput = 2;glutPostRedisplay();// }else if (nInput == 2){pt[2].x = x;pt[2].y = 480 - y;vpt.push_back(pt[2]);nInput = 3;glutPostRedisplay();// }else if (nInput == 3){pt[3].x = x;pt[3].y = 480 - y;vpt.push_back(pt[3]);nInput = 0;glutPostRedisplay();//}}break;default:break;}}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(640, 480);glutCreateWindow("Hello World!");Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutMouseFunc(mouse);glutMainLoop();}○2实验的截图:2.实验2:○1实验代码附在代码文件夹中,关键代码如下:// Bezier.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "Bezier.h"#include "MainFrm.h"#include "BezierDoc.h"#include "BezierView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////BEGIN_MESSAGE_MAP(CBezierApp, CWinApp)//{{AFX_MSG_MAP(CBezierApp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard file based document commandsON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)// Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CBezierApp constructionCBezierApp::CBezierApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}///////////////////////////////////////////////////////////////////////////// // The one and only CBezierApp objectCBezierApp theApp;///////////////////////////////////////////////////////////////////////////// // CBezierApp initializationBOOL CBezierApp::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endif// Change the registry key under which our settings are stored.// TODO: You should modify this string to be something appropriate// such as the name of your company or organization.SetRegistryKey(_T("Local AppWizard-Generated Applications"));LoadStdProfileSettings(); // Load standard INI file options (including MRU)// Register the application's document templates. Document templates// serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CBezierDoc),RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CBezierView));AddDocTemplate(pDocTemplate);// Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo))return FALSE;// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)virtual void OnOK();//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)//}}AFX_MSG_MAPEND_MESSAGE_MAP()// App command to run the dialogvoid CBezierApp::OnAppAbout(){CAboutDlg aboutDlg;aboutDlg.DoModal();}///////////////////////////////////////////////////////////////////////////// // CBezierApp message handlersvoid CAboutDlg::OnOK()// TODO: Add extra validation hereCDialog::OnOK();}○2实验结果截图:输入n:鼠标输入控制点:计算曲线:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
(ⅲ)在OnDraw(CDC* pDC)函数中添加如下代码:
int i,j,k,n=3; //n=3表示三次Bezier曲线
double curx,cury,t,b;
double dt=0.01;
int array[4][2]={{30,100},{100,30},{50,150},{200,40}};
实验六:Bezier曲线的算法实现
(1)算法描述
根据Q(t)=∑Pi•Bi,n(t) =∑Pi•C in ti(1-t)n-i
并且C in =C(n,k)= C(n,k-1)
在主程序中提供特征多边形的各个顶点坐标放入controls[]数组中,ncontrols为顶点的个数,m为曲线上取的样点数,比如m=100表示取100个样点。计算出曲线上的各个样点坐标放入curve[]数组中,这样可以通过相邻点连线绘出生成的Bezier曲线。
图1 Bezier曲线程序结果
这时Bezier曲线的通用程序设计。通过这个程序,我们绘出二次、三次甚至高次Bezier曲线。
(3)思考下面情况的程序实现:
取样点数改变,例如:改为50或者80或者120等;
a=a*i;
for (j=1;j<=n-m;j++) //求(n-m)!和C mn
a=a/j;
return a;
}
else
return 1;
}
(ⅱ)伯恩斯坦多项式Bm,n(t)的函数实现
Bm,n(t)= C mn tm(1-t)n-m
Double Bernstein(int m,int n,double t)
for (i=0;i<=n;i++)
pDC->LineTo(array[i][0],array[i][1]);
//绘制Bezier曲线
pDC->MoveTo(array[0][0],array[0][1]); //回到起点
pDC->SelectObject(&PenRed);
t=0.0;
for (i=0;i<=(int)1/dt;i++)
CPen PenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔
CPen PenBlue(PS_SOLID,1,RGB(0,0,255))ctObject(&PenBlue);
pDC->MoveTo(array[0][0],array[0][1]);
程序实现步骤:(工程名:BezierCurve)
(ⅰ)C m n的函数实现,定义成成员函数,命名为Multiply_n。
C mn = =
int Multiply_n(int m,n)
{
int i,j,a;
if (m!=0)
{
a=1;
for (i=m+1;i<=n;i++) //求(m+1)(m+2)…(n-1).n
{
int i,j;
double sum;
sum=Multiply_n(m,n); //求C mn
for (i=1;i<=m;i++)
sum=sum*t; // C mn tm
for (j=1;j<=n-m;j++)
sum=sum*(1-t); // C mn tm(1-t)n-m
return sum;
{
curx=0; cury=0;
for(j=0;j<=n;j++)
{
b=Bernstein(j,n,t);
curx=curx+array[j][0]*b;
cury=cury+array[j][1]*b;
}
pDC->LineTo(curx,cury);
t=t+dt;
}
(2)编译、运行后查看结果,如图1所示。
相关文档
最新文档