计算机图形学——绘制Bezier曲线
bezier曲线或b样条曲线的绘制

淮阴工学院计算机科学系实验报告书课程名:《计算机图形学》题目:实验4 BEZIER曲线或B样条曲线的绘制班级:学号:姓名:评语:成绩:指导教师:批阅时间:年月日1、实验内容或题目编程实现三次BEZIER或B样条曲线的绘制。
2、实验目的与要求(1) 通过实验,进一步理解和掌握生成BEZIER或B样条曲线的算法;(2) 掌握BEZIER或B样条曲线的基本生成过程;(3) 通过编程,会在TC环境下编程实现三次BEZIER或B样条曲线的绘制。
3、实验步骤与源程序错误!未找到引用源。
实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行特殊模式的运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、打印源程序或把源程序以文件的形式提交;7、按格式书写实验报告。
错误!未找到引用源。
源代码#include "graphics.h"float px[4]={ 50,80,120,140 };float py[4]={100,230,230,160};void Bezier(){float a0,a1,a2,a3,b0,b1,b2,b3;int k,x,y;float i,t,n=4;setcolor(15);for(k=0;k<3;k++){moveto(px[k],py[k]);lineto(px[k+1],py[k+1]);}setcolor(4);a0=px[0];a1=-3*px[0]+3*px[1];a2=3*px[0]-6*px[1]+3*px[2];a3=-px[0]+3*px[1]-3*px[2]+px[3];b0=py[0];b1=-3*py[0]+3*py[1];b2=3*py[0]-6*py[1]+3*py[2];b3=-py[0]+3*py[1]-3*py[k+2]+py[3];for(i=0;i<n;i+=0.001){t=i;x=a0+a1*t+a2*t*t+a3*t*t*t;y=b0+b1*t+b2*t*t+b3*t*t*t;if(i==0)moveto(x,y);lineto(x,y);}}void main(){int driver,mode;driver=DETECT;initgraph(&driver,&mode,"..\\bgi");Bezier();}4、测试数据与实验结果5、结果分析与实验体会通过这次实验,我初步熟悉了turboc 的运行环境。
bezier曲线

Bezier 曲线什么是 Bezier 曲线?Bezier 曲线是一种数学曲线,由法国工程师 Pierre Bézier 于20世纪50年代发明。
它是计算机图形学中最基本和最常用的曲线之一。
由于其简单性和灵活性,Bezier 曲线被广泛应用于计算机图形、工业设计、动画制作等领域。
Bezier 曲线的特点Bezier 曲线由一系列控制点确定,并通过调整这些控制点的位置和参数来定义曲线的形状。
以下是 Bezier 曲线的一些特点:1.可调节性:调整控制点的位置和参数可以改变曲线的形状、弯曲程度和速度。
2.平滑性:Bezier 曲线能够平滑连接控制点,使得曲线在控制点之间呈连续曲率。
3.参数化形状:Bezier 曲线可以通过调整参数来生成无限多种形状,从简单的直线到复杂的曲线。
4.逼近性:Bezier 曲线可以用来逼近其他复杂的曲线,如圆弧、椭圆等。
Bezier 曲线的数学表达Bezier 曲线是通过插值和多项式生成的数学曲线。
根据控制点的个数,可以确定 Bezier 曲线的阶数。
一般情况下,Bezier 曲线的阶数等于控制点数减1。
对于一维的 Bezier 曲线,它可由以下公式表示:Bezier 1DBezier 1D其中,n 为阶数,t 为参数,Pi 为控制点,Bi, n(t) 为 Bezier 基函数。
对于二维的 Bezier 曲线,它可由以下公式表示:Bezier 2DBezier 2D其中,n 为阶数,t 为参数,Pi 为控制点,Bi, n(t) 为 Bezier 基函数。
Bezier 曲线的应用Bezier 曲线的应用非常广泛,以下是一些常见的应用场景:1.计算机图形学:Bezier 曲线可以用来绘制平滑的曲线和曲面,用于构建2D和3D图形。
2.工业设计:Bezier 曲线可以用来设计平滑的汽车车身、家具等产品。
3.动画制作:Bezier 曲线可以用来定义动画路径,使得动画流畅而自然。
bezier 曲线拟合算法

bezier 曲线拟合算法
贝塞尔曲线(Bezier Curve)是一种数学曲线,常用于图形设计和计算机图形学中的曲线拟合。
贝塞尔曲线可以通过控制点来描述曲线的形状。
在曲线拟合中,常用的一种算法是贝塞尔曲线拟合算法,其基本想是通过调整控制点的位置来逼近给定的数据点集合。
以下是一个简单的贝塞尔曲线拟合算法的步骤:
1.给定一组数据点集合,这些点将成为贝塞尔曲线要拟合的目标。
2.选起始控制点和结束控制点,这两个控制点定义了曲线的起始和
结束位置。
3.根据需求选择其他控制点的数量,每个控制点都会对曲线形状产
生影响。
4.根据控制点的位置,使用贝塞尔曲线公式计算出曲线上的各个点。
5.使用某种误差度量方法(例如最小二乘法),将拟合曲线与原始数
据点进行比较,并调整控制点的位置以减小误差。
6.重复步骤4和步骤5,直至达到满意的拟合效果或收敛。
需要注意的是,贝塞尔曲线拟合算法的具体实现方式可能因应用环境和需求而有所差异,这里只是提供了一种基本的算法框架。
在实际应用中,您可以根据具体情况进行调整和优化。
同时,还有其他的曲线拟合算法,如多项式拟合、样条曲线等,您也可以根据自己的需求选择适合的算法。
bezier曲线绘制算法

bezier曲线绘制算法
摘要:
1.贝塞尔曲线简介
2.贝塞尔曲线的计算方法
3.贝塞尔曲线的应用
4.贝塞尔曲线的优缺点
正文:
贝塞尔曲线是一种以四个控制点定义的平滑曲线,它具有很好的局部性和全球性,广泛应用于计算机图形学、动画设计等领域。
计算贝塞尔曲线的方法有多种,其中比较常见的是使用de Casteljau 算法。
该算法通过计算两个分段贝塞尔曲线的交点,来求解原始贝塞尔曲线上的点。
具体来说,假设我们有四个控制点A、B、C、D,我们首先计算出AB、BC 两条线段的贝塞尔曲线,然后求解这两条贝塞尔曲线的交点P,接着以P 为控制点,计算出PB、PC 两条线段的贝塞尔曲线,最后求解这两条贝塞尔曲线与AC 的交点,该交点即为所求的贝塞尔曲线上的点。
贝塞尔曲线的应用非常广泛,例如在计算机图形学中,它可以用于绘制任意形状的曲线,还可以用于控制物体的动画运动路径;在计算机辅助设计中,它可以用于精确控制设计曲线的形状,提高设计的准确性和效率。
贝塞尔曲线的优点在于其具有很好的局部性和全球性,可以很好地描述出各种复杂的曲线形状。
同时,贝塞尔曲线的计算方法相对简单,易于实现和控制。
然而,贝塞尔曲线也存在一些缺点,例如其计算过程中需要处理复杂的数
学运算,对计算机的计算能力有一定的要求。
此外,贝塞尔曲线的控制点数量较多,调整起来比较麻烦,需要一定的技巧和经验。
总的来说,贝塞尔曲线是一种重要的曲线描述方法,其在计算机图形学、动画设计等领域有着广泛的应用。
bezier曲线生成算法

bezier曲线生成算法Bezier曲线是一种重要的曲线生成算法,被广泛应用于计算机图形学、CAD、动画等领域。
它是Bernstein多项式的线性组合,利用微积分和矩阵运算等数学知识进行计算。
下面将分步骤介绍Bezier曲线生成算法。
1.选择控制点决定Bezier曲线形状的有多个控制点。
一条曲线至少需要两个控制点,但大部分曲线使用的是三到四个控制点。
选择控制点要根据实际需要来确定,例如需要画一个弧度比较小的圆弧,那么就只需要选择少数几个点。
2.计算Bezier曲线的轨迹根据控制点求解Bezier曲线的轨迹有多种方法,如迭代法、递推法等。
这里我们使用递推公式,可具体分为三步:(1)首先计算Bezier曲线的一阶导数,即B0'(u)、B1'(u)、B2'(u)、B3'(u);(2)然后根据一阶导数计算Bezier曲线的二阶导数,即B0''(u)、B1''(u)、B2''(u)、B3''(u);(3)最后根据二阶导数计算Bezier曲线的轨迹,即B(u)=B0(u)、B1(u)、B2(u)、B3(u)。
其中B0(u)、B1(u)、B2(u)、B3(u)是Bezier基函数,u为Bezier曲线的参数。
3.绘制Bezier曲线根据Bezier曲线轨迹的坐标可以用直线或者曲线来连接,从而得到Bezier曲线的效果。
当然,为了获得更光滑、更细腻的曲线效果,我们一般使用二次或三次Bezier曲线。
4.应用Bezier曲线Bezier曲线有着广泛的应用,如计算机图形学中的曲面建模、动画制作中的路径控制、CAD绘图等。
在绘制曲线和曲面时,Bezier曲线可以很好的展现出几何图形的优美形态,所以在计算机辅助绘图和工程制图中被广泛应用。
综上所述,Bezier曲线生成算法是一种强大而优美的数学方法。
通过选择控制点、计算Bezier曲线的轨迹、绘制Bezier曲线以及应用Bezier曲线等步骤,可以生成出各种美妙的曲线和曲面。
用四个顶点的函数表示bezier曲线代码

用四个顶点的函数表示Bezier曲线一、Bezier曲线简介Bezier曲线是计算机图形学中常用的曲线类型,它通过定义一组控制点来描述曲线的路径。
其中,使用四个顶点来表示Bezier曲线是一种较为常见的方式。
二、Bezier曲线的表示方法在计算机图形学中,Bezier曲线通常使用参数方程来表示。
而使用四个顶点来定义Bezier曲线的参数方程为:B(t) = (1-t)^3 * P0 + 3*(1-t)^2 * t * P1 + 3*(1-t) * t^2 * P2 + t^3 * P3其中: - P0、P1、P2、P3分别代表四个控制点的坐标; - t是一个介于0和1之间的参数。
三、Bezier曲线的控制点选择选择合适的控制点是绘制出符合需求的Bezier曲线的关键。
由于Bezier曲线的性质,曲线会通过起始点P0和结束点P3,而中间的两个控制点P1和P2则决定了曲线的形状。
四、Bezier曲线的性质Bezier曲线具有以下特点: 1. 平滑性:Bezier曲线具有良好的平滑性,可以绘制出流畅的曲线。
2. 局部控制性:通过调整控制点的位置和权重,可以灵活地调整Bezier曲线的形状。
3. 可递推性:Bezier曲线的参数方程可以通过递推公式进行计算,从而实现高效绘制。
4. 可与直线相连:由于参数t的取值范围为0到1之间,因此Bezier曲线的起始点和结束点可以与其他直线段相连,实现复杂形状的绘制。
五、绘制Bezier曲线的算法绘制Bezier曲线的算法主要包括以下几个步骤: 1. 确定四个控制点P0、P1、P2、P3的坐标; 2. 将t的取值范围划分为一系列小的步长,例如0.01; 3. 对于每个t值,根据参数方程计算Bezier曲线上的点坐标; 4. 将计算得到的点坐标连接起来,即可绘制出Bezier曲线。
六、示例代码下面是一个使用Python编写的绘制Bezier曲线的示例代码:import matplotlib.pyplot as pltimport numpy as npdef bezier_curve(P0, P1, P2, P3, t):u = 1 - treturn u**3 * P0 + 3 * u**2 * t * P1 + 3 * u * t**2 * P2 + t**3 * P3# 设置四个控制点的坐标P0 = np.array([0, 0])P1 = np.array([1, 3])P2 = np.array([4, 2])P3 = np.array([6, 5])# 设置t的取值范围t = np.linspace(0, 1, 100)# 计算Bezier曲线上的点坐标x = bezier_curve(P0[0], P1[0], P2[0], P3[0], t)y = bezier_curve(P0[1], P1[1], P2[1], P3[1], t)# 绘制Bezier曲线plt.plot(x, y)plt.scatter([P0[0], P1[0], P2[0], P3[0]], [P0[1], P1[1], P2[1], P3[1]], c='red ')plt.xlabel('x')plt.ylabel('y')plt.title('Bezier Curve')plt.show()七、总结通过四个顶点的函数可以轻松地表示和绘制Bezier曲线。
实验报告四bezier曲线

实验四Bezier曲线的绘制1. 实验目的练习Bezier曲线的绘制和de Casteljau算法。
2. 实验内容和要求按要求完成如下一个作业,提交纸质实验报告,同时提交实验报告和代码的电子版。
实现Bezier曲线的de Casteljau递推算法,能够对任意介于0和1之间的参数t计算Bezier曲线上的点,然后依次连接这些点生成Bezier曲线。
要求:对[0,1]参数区间进行100等分。
控制点的数目至少为5个,即Bezier曲线的次数不低于4次。
de Casteljau算法用一个函数单独实现。
绘制Bezier曲线的同时还要绘制其控制多边形。
至少绘制两条Bezier曲线,具有不同的次数,颜色和曲线宽度。
3.算法描述Bezier Curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。
曲线定义:起始点、终止点、控制点。
通过调整控制点,贝塞尔曲线的形状会发生变化。
1962年,法国数学家Pierre Bezier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。
以下公式中:B(t)为t时间下点的坐标;P0为起点,Pn为终点,Pi为控制点。
一阶贝塞尔曲线如下,意义由 P0 至 P1 的连续点,描述的是一条线段:二阶贝塞尔曲线(抛物线:P1-P0为曲线在P0处的切线):原理:由 P0 至 P1 的连续点 Q0,描述一条线段。
由 P1 至 P2 的连续点 Q1,描述一条线段。
由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。
4. 源程序代码#include<C:\Include\GL\glut.h>#include<stdlib.h>#include<math.h>GLsizei winWidth = 600, winHeight = 600;GLfloat xwcMin = -150.0, xwcMax = 150.0;GLfloat ywcMin = -300.0, ywcMax = 300.0;class wcPt3D{public:GLfloat x, y, z; };void init(){glClearColor(1.0, 1.0, 1.0, 1.0); }void plotPoint(wcPt3D bezCurevePt){glBegin(GL_POINTS);glVertex2f(bezCurevePt.x, bezCurevePt.y);glEnd(); }void binomiaCoeffs(GLint n, GLint * C){GLint k, j;for (k = 0; k <= n; k++)C[k] = 1;for (j = n; j >= k + 1; j--)C[k] *= j;for (j = n - k; j >= 2; j--)C[k] /= j; }void computeBezPt(GLfloat u, wcPt3D * bezPt, GLint nCtrlPts, wcPt3D *CtrlPts, GLint *C){ GLint k, n = nCtrlPts - 1;GLfloat bezBlendFcn;bezPt->x = bezPt->y = bezPt->z = 0.0;for (k = 0; k<nCtrlPts; k++){bezBlendFcn = C[k] * pow(u, k) * pow(1 - u, n - k);bezPt->x += CtrlPts[k].x * bezBlendFcn;bezPt->y += CtrlPts[k].y * bezBlendFcn;bezPt->z += CtrlPts[k].z * bezBlendFcn; } }void bezier(wcPt3D * ctrlPts, GLint nCtrlPts, GLint nBezCurvePts){wcPt3D bezCurvePt;GLfloat u;GLint *C, k;C = new GLint[nCtrlPts];binomiaCoeffs(nCtrlPts - 1, C);for (k = 0; k <= nBezCurvePts; k++){u = GLfloat(k) / GLfloat(nBezCurvePts);computeBezPt(u, &bezCurvePt, nCtrlPts, ctrlPts, C);plotPoint(bezCurvePt); }delete[]C; }void displayFcn(void){GLint nCtrlPts = 5, nCtrlPts2 = 6, nBezCurvePts = 1000;wcPt3D ctrlPts[5] = { { -135.0, -59.0, 0.0 }, { -59.0, 95.0, 0.0 }, { 0.0, -40.0, 0.0 }, { 70.0, 120.0, 0.0 }, { 78, -125.0, 0.0 } };wcPt3D ctrlPts2[6] = { { -118.0, 20.0, 0.0 }, { -85.0, 45.0, 0.0 }, { -26.0, -126.0, 0.0 }, { 38.0, 88.0, 0.0 }, { 58.0, 188.0, 0.0 }, { 108.0, 98.0, 0.0 } }; glClear(GL_COLOR_BUFFER_BIT);glPointSize(6);glColor3f(0.0, 1.0, 1.0);bezier(ctrlPts, nCtrlPts, nBezCurvePts);glPointSize(5);glColor3f(1.0, 0.0, 1.0);bezier(ctrlPts2, nCtrlPts2, nBezCurvePts);glColor3f(0.0, 0.0, 1.0);glBegin(GL_LINES);glVertex2f(-135.0, -59.0);glVertex2f(-59.0, 95.0);glVertex2f(-59.0, 95.0);glVertex2f(0.0, -40.0);glVertex2f(0.0, -40.0);glVertex2f(70.0, 120.0);glVertex2f(70.0, 120.0);glVertex2f(78.0, -125.0);glVertex2f(-118.0, 20.0);glVertex2f(-85.0, 45.0);glVertex2f(-85.0, 45.0);glVertex2f(-26.0, -126.0);glVertex2f(-26.0, -126.0);glVertex2f(38.0, 88.0);glVertex2f(38.0, 88.0);glVertex2f(58.0, 188.0);glVertex2f(58.0, 188.0);glVertex2f(108.0, 98.0);glEnd();glFlush(); }void winReshapeFcn(GLint newWidth, GLint newHeight){glViewport(0, 0, newWidth, newHeight);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(xwcMin, xwcMax, ywcMin, ywcMax);glClear(GL_COLOR_BUFFER_BIT); }void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50, 50);glutInitWindowSize(winWidth, winHeight);glutCreateWindow("yxl 实验四 Bezier曲线");init();glutDisplayFunc(displayFcn);glutReshapeFunc(winReshapeFcn);glutMainLoop(); }5. 实验结果6.实验体会最后一次实验报告了,老师要求我们做Bezier曲线,需要我们对函数去理解的一次实验,对于数学比较差的我来说还是很有困难的,理解起来比较吃力。
计算机图形学实验报告-实验3Bezier曲线

计算机图形学实验报告班级计算机工硕班学号 2011220456姓名王泽晶实验三:Bezier 曲线实验目的:通过本次试验,学生可以掌握Bezier 曲线的求值、升阶算法及Bezier 曲线绘制方法。
实验内容:1. 绘制控制多边形(使用鼠标左键指定多边形顶点,右键结束),使用白色折线段表示。
2. 绘制Bezier 曲线,使用红色,线宽为2,在右键结束控制多边形顶点指定时即执行。
Bezier 曲线是一种广泛应用于外形设计的参数曲线,它通过对一些特定点的控制来控制曲线的形状,我们称这些点为控制顶点。
现在我们来给出Bezier 曲线的数学表达式。
在空间给定1n +个点012,,,,n P P 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 t i 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 --⎡⎤⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⎡⎤=⎣⎦⎢⎥⎢⎥-⎢⎥⎢⎥⎣⎦⎣⎦试验步骤:添加成员函数,编写成员数代码为public class Al_deCasteljau {public function Al_deCasteljau(){}// de Casteljau递推算法的实现public function recursion( ctrlPts:Array, k:int , i:int ,t:Number ):Point {if ( k==0 ) return ctrlPts[i];return addPoints(multiplyNumToPoint((1 - t),recursion(ctrlPts, k-1, i, t)), multiplyNumToPoint(t , recursion(ctrlPts, k-1, i+1, t)));}public function multiplyNumToPoint(n:Number,p:Point):Point{return new Point(p.x * n,p.y * n);}public function addPoints(p1:Point,p2:Point):Point{return new Point(p1.x + p2.x,p1.y + p2.y);}public function minusPoints(p1:Point,p2:Point):Point{return new Point(p1.x - p2.x,p1.y - p2.y);}public function algorithm_deCasteljau(t:Number, ctrlPts:Array ):Point{var size:int = ctrlPts.length;return recursion( ctrlPts, size-1, 0, t );}public function upgradePoints(ctrlPts:Array):Array{var size:int = ctrlPts.length;var newPts:Array = new Array();newPts[0] = ctrlPts[0]; // i = 0for ( var i:int =1; i<size; ++i ){var factor:Number = i / size;newPts[i] = addPoints(multiplyNumToPoint( factor , ctrlPts[i-1] ) , multiplyNumToPoint((1 - factor) , ctrlPts[i]));}newPts[size] = ctrlPts[ctrlPts.length-1]; // i = n+1return newPts;}public function downgradePoints(ctrlPts:Array):Array{var size:int = ctrlPts.length;var newPts:Array = new Array();newPts[0] = ctrlPts[0]; // i = 0for ( var i:int=1; i<size-1; ++i ){var factor:Number = 1.0 /(size-1 - i);newPts[i] = multiplyNumToPoint(factor,minusPoints(multiplyNumToPoint(size-1 , ctrlPts[i]), multiplyNumToPoint(i , newPts[i-1])));}return newPts;}}编译运行得到如下结果:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学
实验报告
专业:信息与计算科学
班级: 1002班
学号: **********
姓名: ****
实验目的:
(1)掌握直线的参数表示法。
(2)掌握德卡斯特里奥算法的几何意义。
(3)掌握绘制二维Bezier曲线的方法。
实验要求:
(1)使用鼠标左键绘制个数为10以内的任意控制点,使用直线连接构成控制多边形。
(2)使用鼠标右键绘制Bezier曲线。
(3)在状态栏显示鼠标的位置坐标。
(4)B ezier曲线使用德卡斯特里奥算法绘制。
实验算法:
Bezier曲线的分割递推德卡斯特里奥算法
给定空间n+1个点P i(i=0,1,2,…,n)及参数t,有
P r i(t)=(1-t)P1-r i(t)+t P1-r1i+(t)
式中,r=1,2,…,n;i=0,1,…,n-r;t∈[0,1]。
且规定当r=0时,P0i(t)=P i, P n0(t)是在曲线上具有参数t的点。
德卡斯特里奥算法的基础就是在矢量−
−→
−
P
P10
上选择一个点P,使
得P点划分矢量−
−→
−
P
P10为|P
P0|:|P
P1|=t:1-t,给定点P0、P1
的坐标以及t的值,点P的坐标为P=P0+t(P1-P0)=(1-t)P0+tP1。
式中,t∈[0,1]。
定义贝塞尔曲线的控制点编号为P r i,其中,r表示迭代次数。
德卡斯特里奥证明了,当r=n时,P n0表示Bezier曲线上的点。
函数功能介绍
1.德卡斯特里奥函数:
long CMy12View::DeCasteliau(double t,long *p)
{
double P[N_MAX_POINT][N_MAX_POINT];
int n=CtrlPNum-1;
for(int k=0;k<=n;k++)
{
P[0][k]=p[k];
}
for(int r=1;r<=n;r++)
{
for(int i=0;i<=n-r;i++)
{
P[r][i]=(1-t)*P[r-1][i]+t*P[r-1][i+1];
}
}
return(long(P[n][0]));
}
函数功能介绍:此函数为德卡斯特里奥算法函数。
在绘制Bezier 曲线时,需调用两次此函数,分别关于x方向和y方向上的调用。
由DrawBezier()函数调用。
2. void CMy12View::DrawBezier()
函数功能介绍:此函数为绘制Bezier曲线。
绘制二维Bezier曲线,需要对x方向和y方向进行计算。
这个函数就是解决这个问题,然后通过OnRButtonDown(UINT nFlags,CPoint point)调用进行绘制。
3 .void CMy12View::DrawCtrPolygon()
函数功能介绍:此函数为绘制控制多边形。
定义一个CPen型NewPen,和CPen*型PoldPen,进行绘制多边形,为了突出控制点,使用黑色填充边长为4个像素的正方形块代表控制点。
4. void CMy12View::OnLButtonDown(UINT nFlags,CPoint point)
函数功能介绍:此函数为鼠标左键按下函数。
按下鼠标左键,将鼠
标位置点作为控制点,并调用CMy12View::DrawCtrPolygon()函数绘制控制多边形
5. void CMy12View::OnRButtonDown(UINT nFlags,CPoint point)
函数功能介绍:此函数为鼠标右键按下函数。
通过一个BOOL型的变量,控制多边形的绘制,由鼠标右键绘制Bezier曲线。
实验结果:。