实验报告四bezier曲线(共4页)_第1页
实验报告四bezier曲线(共4页)_第2页
实验报告四bezier曲线(共4页)_第3页
实验报告四bezier曲线(共4页)_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验四 Bezier曲线的绘制1. 实验目的练习Bezier曲线的绘制和de Casteljau算法。2. 实验内容和要求按要求完成如下一个作业,提交纸质实验报告,同时提交实验报告和代码的电子版。实现Bezier曲线的de Casteljau递推算法,能够对任意介于0和1之间的参数t计算Bezier曲线上的点,然后依次连接这些点生成Bezier曲线。要求:对0,1参数区间进行100等分。控制点的数目至少为5个,即Bezier曲线的次数不低于4次。de Casteljau算法用一个函数单独实现。绘制Bezier曲线的同时还要绘制其控制多边形。至少绘制两条Bezier曲线,具有不同的次数,颜色和曲

2、线宽度。3. 算法描述Bezier Curve(贝塞尔曲线)是应用于二维图形应用程序的。 曲线定义:起始点、终止点、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bezier第一个研究了这种绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。以下公式中:B(t)为t时间下 点的坐标;P0为起点,Pn为终点,Pi为控制点。一阶贝塞尔曲线如下,意义由 P0 至 P1 的连续点, 描述的是一条线段:二阶贝塞尔曲线(抛物线:P1-P0为曲线在P0处的切线):原理:由 P0 至 P1 的连续点 Q0,描述

3、一条线段。      由 P1 至 P2 的连续点 Q1,描述一条线段。      由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。4. 源程序代码#include<C:IncludeGLglut.h>#include<stdlib.h>#include<math.h>GLsizei winWidth = 600, winHeight = 600;GLfloat xwcMin = -150.0, xwcMax = 150.0

4、;GLfloat ywcMin = -300.0, ywcMax = 300.0;class wcPt3Dpublic: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+

5、)Ck = 1;for (j = n; j >= k + 1; j-)Ck *= j;for (j = n - k; j >= 2; j-)Ck /= 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+)bezBle

6、ndFcn = Ck * pow(u, k) * pow(1 - u, n - k);bezPt->x += CtrlPtsk.x * bezBlendFcn;bezPt->y += CtrlPtsk.y * bezBlendFcn;bezPt->z += CtrlPtsk.z * bezBlendFcn; void bezier(wcPt3D * ctrlPts, GLint nCtrlPts, GLint nBezCurvePts)wcPt3D bezCurvePt;GLfloat u;GLint *C, k;C = new GLintnCtrlPts;binomiaCo

7、effs(nCtrlPts - 1, C);for (k = 0; k <= nBezCurvePts; k+)u = GLfloat(k) / GLfloat(nBezCurvePts);computeBezPt(u, &bezCurvePt, nCtrlPts, ctrlPts, C);plotPoint(bezCurvePt); deleteC; void displayFcn(void)GLint nCtrlPts = 5, nCtrlPts2 = 6, nBezCurvePts = 1000;wcPt3D ctrlPts5 = -135.0, -59.0, 0.0 ,

8、-59.0, 95.0, 0.0 , 0.0, -40.0, 0.0 , 70.0, 120.0, 0.0 , 78, -125.0, 0.0 ;wcPt3D ctrlPts26 = -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, nCtrlPt

9、s, 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.

10、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(); voi

11、d 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. 实验体会最后一次

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论