cad cam实验报告 贝齐尔(Bezier)曲线曲面的生成方法

合集下载

cadcam课程设计实验报告

cadcam课程设计实验报告

cadcam课程设计实验报告一、课程目标知识目标:1. 学生能理解CAD/CAM的基本概念,掌握其应用领域及发展历程。

2. 学生能掌握CAD/CAM软件的基本操作,如绘图、编辑、建模、渲染等。

3. 学生能了解CAD/CAM技术在制造业中的实际应用,如模具设计、数控编程等。

技能目标:1. 学生能运用CAD软件进行二维和三维图形的绘制,具备一定的设计能力。

2. 学生能运用CAM软件对设计好的图形进行加工路径的生成和仿真,具备基本的加工操作能力。

3. 学生能通过CAD/CAM软件解决实际问题,具备一定的创新能力和实践能力。

情感态度价值观目标:1. 学生通过学习CAD/CAM课程,培养对制造业的兴趣和热情,增强职业认同感。

2. 学生在学习过程中,培养团队协作、沟通交流的能力,养成良好的学习习惯。

3. 学生能认识到CAD/CAM技术在现代制造业中的重要性,树立正确的科技观和创新意识。

课程性质:本课程为实验课程,注重实践操作和实际应用,结合理论教学,提高学生的实际操作能力和创新能力。

学生特点:本课程面向初中年级学生,学生对新鲜事物充满好奇,动手能力强,但理论知识相对薄弱。

教学要求:教师应注重理论与实践相结合,引导学生主动参与实践,提高学生的操作技能和解决问题的能力。

同时,关注学生的个体差异,因材施教,使每个学生都能在课程中收获成果。

通过课程目标的分解和实施,确保教学设计和评估的有效性。

二、教学内容1. CAD/CAM基本概念与历史发展- CAD/CAM定义及其相互关系- CAD/CAM发展历程及趋势2. CAD软件操作与绘图技巧- 软件界面及基本工具介绍- 二维图形绘制与编辑- 三维建模与渲染3. CAM软件加工路径生成与仿真- 数控加工基础知识- 加工路径策略及参数设置- 加工仿真与优化4. CAD/CAM技术在制造业的应用实例- 模具设计与制造- 数控编程与加工- 产品设计与创新5. 实践操作与案例分析- 实践项目设计与实施- 学生作品展示与评价- 行业案例分析及讨论教学内容安排与进度:第一周:CAD/CAM基本概念与历史发展第二周:CAD软件操作与绘图技巧第三周:CAM软件加工路径生成与仿真第四周:CAD/CAM技术在制造业的应用实例第五周:实践操作与案例分析教材章节关联:《CAD/CAM技术与应用》第一章:CAD/CAM概述《CAD/CAM技术与应用》第二章:CAD软件操作《CAD/CAM技术与应用》第三章:CAM软件加工《CAD/CAM技术与应用》第四章:CAD/CAM应用实例教学内容确保科学性和系统性,注重理论与实践相结合,引导学生掌握CAD/CAM技术的基本知识和操作技能,提高实际应用能力。

Bezier曲线实验报告

Bezier曲线实验报告

Bezier曲线实验报告1015403072 任茜一、.实验目的1、了解服装CAD中Bezier曲线的应用。

2、掌握Bezier曲线的基本原理和方法,了解Bezier曲线的特点。

3、运用Visual Basic 6.0软件编写程序实现曲线的成功绘制,并认识Bezier曲线的形状及特点。

二、实验原理在空间给定n+1个点P0,P1,P2,,,Pn,称下列参数曲线为n次的Bezier曲线。

其中Ji,n(t)是Bernstein基函数,即一般称折线P0P1P2…Pn为曲线P(t)的控制多边形;称点P0,P1,P2,…,Pn为P(t)的控制顶点。

在空间曲线的情况下,曲线P(t)=(x(t),y(t),z(t))和控制顶点Pi=(Xi,Yi,Zi)的关系用分量写出即当t在区间[0,1]上变动时,就产生了Bezier曲线。

若只考虑x和y,就是平面上的Bezier曲线。

以三次Bezier曲线为例,它可用矩阵形式表示如下三、实验程序Private pt() As mypointPrivate Sub Form_Load()ReDim pt(1)End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) Dim s As Integerpt(UBound(pt)).x = xpt(UBound(pt)).y = yPicture1.Circle (x, y), 15s = Val(UBound(pt))Select Case sCase 1Picture1.Print "P0"Case 2Picture1.Print "P1"Case 3Picture1.Print "P2"Case 4Picture1.Print "P3"Case 5Picture1.Print "P4"Case 6Picture1.Print "P5"Case 7Picture1.Print "P6"Case 8Picture1.Print "P7"Case 9Picture1.Print "P8"Case 10Picture1.Print "P9"Case 11Picture1.Print "P10"End SelectIf UBound(pt) > 1 ThenPicture1.Line (pt(UBound(pt) - 1).x, pt(UBound(pt) - 1).y)-(pt(UBound(pt)).x, pt(UBound(pt)).y)End IfReDim Preserve pt(UBound(pt) + 1)End SubPrivate Sub Command1_Click()Dim i%, t#Dim j, n As IntegerDim s, x, y As Singlen = UBound(pt) - 1 - 1For j = 1 To 1000x = 0y = 0For i = 0 To nt = j / 1000x = x + pt(i + 1).x * B(i, n, t)y = y + pt(i + 1).y * B(i, n, t)Next iPicture1.PSet (x, y)Next jEnd SubPrivate Function fact(n As Integer)Dim i As IntegerDim s As Longs = 1For i = 1 To ns = s * iNext ifact = sEnd FunctionPrivate Function B(i%, n%, t#) As SingleB = (fact(n) * t ^ i * (1 - t) ^ (n - i)) / (fact(i) * fact(n - i)) End FunctionPrivate Sub Command2_Click()Picture1.ClsReDim pt(1) 'pt(1)为第一个点P0End SubPrivate Sub Command3_Click()EndEnd Sub四、实验结果。

CADCAM综合实验报告catia操作资料.doc

CADCAM综合实验报告catia操作资料.doc

CAD/CAM技术综合实验报告(一)CAD/CAM技术试验综合报告一、试验目的1.熟悉CAXA制造工程师软件2.学会用CAXA软件进行实体造型和复杂曲面造型3.学会CAXA软件加工模块中刀具的选择、毛坯的设置、加工轨迹的生成、加工的可视化模拟和数控加工代码生成的基本方法。

4.学会数控加工中心操作模拟软件。

5.了解并验证CAD/CAM在实际数控加工中的应用过程。

二、试验设备及所用软件1.计算机2.CAXA制造工程师————数控加工软件3.Yhcnc-FANUC 0D(网络版)软件三、试验原理(说明CAD/CAPP/CAM各自的作用及怎样利用其相关的理论进行集成制造的)CAD的作用:工程技术人员在人和计算机组成的系统中以计算机为工具,辅助人类完成产品的设计、分析、绘图等工作,并达到提高产品设计质量、缩短产品开发周期、降低产品成本的目的。

CAPP的作用:在人和计算机组成的系统中,根据产品设计阶段给出的信息,人机交互的或自动的完成产品加工方法的选择和工艺过程的设计。

CAM的作用:利用计算机辅助完成从生产准备到产品制造整个过程的活动,包括工艺过程设计、工装设计、NC自动编程、生产作业计划、生产控制、质量控制等。

CAD设计产品结构,绘制产品图样,为CAPP、CAM过程准备数据;经数据转换接口,将产品数据转换成中性文件;CAPP系统读入中性文件,并将其转换为系统所需格式后生成零件工艺过程;CAD,CAPP系统生成数控编程所需数据,并按一定标准转换成相应的中性文件;CAM系统读入中性文件,并将其转换为本系统所需格式后生成数控程序。

四、试验内容(一)CAD造型1.CAD软件(CAXA)学习及草图绘制(自选图形进行练习,简要说明绘制草图的过程)(1)点击零件特征,选取面XY(2)点击草图绘制,点击矩行,设置长为45,宽为25,拖至XY面中心。

2.三维实体造型(用曲面裁剪法完成鼠标的三维造型,并简要说明其过程)(1)在上一画好的草图中,点击拉伸,拉伸伸度为65CM。

bezier曲线生成算法

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曲线等步骤,可以生成出各种美妙的曲线和曲面。

CADCAM实验报告

CADCAM实验报告

实验报告实验课程:CAD/CAM原理及应用学生姓名:学号:专业班级:年月日目录一、实验一二维图形复合变换编程二、实验二三次B样条曲线生成三、实验三CAD/CAM集成南昌大学实验报告学生姓名: 徐馨 学 号: 5901115192 专业班级: 机制157班 实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩:实验一 二维图形复合变换编程一、实验目的:1.掌握CAD 图形处理的原理和方法。

2.理解CAD 对图形进行复合变换的过程。

二、实验要求在二维模式下,将三角形绕任意点旋转θ角。

三角形三点的坐标、旋转点坐标和旋转角度可由用户任意输入。

原图形和变换后的图形必须同时显示在显示器上。

三、实验设备 1.计算机系统2.安装Turbo C 或其他C 语言集成开发工具 四、实验原理 1、变换原理基本旋转矩阵是相对坐标原点的,为了满足这一要求,必须先将旋转点和需要处理的图形向原点平移,使旋转点与原点重合,然后对图形进行旋转变换。

旋转变换后,再将旋转点和旋转后的图形平移到旋转点。

基本变换矩阵如下:1 0 0 0 1 0 l m 1平移T=cos θ sin θ 0 -sin θ cos θ 0 0 0 1旋转T=根据上述图形变换原理,对二维图形绕任意点(旋转点)旋转的复合变换矩阵M 为2、编程基本要领1)、将显卡设置为图形模式函数为 #include(graphics.h) #include(conio.h) main( ){ int driver,mode;driver=VGA; mode=VGAMED; initgraph(&driver,& mode,””); }2) 画直线函数为 line(x 1,y 1, x 2,y 2) 3) 4*4界矩阵相乘函数float py[4][4],xz[4][4];m[4][4] float xc(a,b) float a[4][4],b[4][4]; { int i , j,k;for(i=0;i<=3;i++) for (j=0;j<=3;j++) for(k=0;k<=3;k++)1 0 0 0 1 0-x -y 1M= cos θ sin θ 0 -sin θ cos θ 0 0 0 11 0 0 0 1 0 x y 1m[i][j]= m[i][j]+ a[i][k]* b[k][j];}五、实验步骤1、在C语言集成开发工具的编辑器中输入源程序2、利用编译器编译源程序3、连接生成执行文件4、运行程序六、实验数据及处理结果clearclca=input('');b=input('');c=input('');d=input('');e=input('');f=input('');g=input('');h=input('');p=input('');x=[a c e a];y=[b d f b];q=(p/180)*3.14plot(x,y);hold onaxis equalaxis([-5 8 -5 8])plot(g,h,'p')M=[1 0 0;0 1 0;-g -h 1;];R(:,1)=x;R(:,2)=y;R(:,3)=1%将二维坐标表示成(x,y,1)的形式%R1=M*RM1=[cos(q) sin(q) 0;-sin(q) cos(q) 0;0 0 1];R1=M*M1;%R1=M\R2%M的逆矩阵inv(M)*R2 M2=[1 0 0 ;0 1 0;g h 1;];R2=R1*M2R3=R*R2m=[a g R3(1,1) ];n=[b h R3(1,2)];plot(m,n,'')plot(R3(:,1),R3(:,2),'k')南昌大学实验报告学生姓名:徐馨学号:5901115192 专业班级:机制157班实验类型:□验证□综合□设计□创新实验日期:实验成绩:实验二B样条曲线的生成一、实验目的:1、掌握参数化曲线曲面的原理和方法。

实验报告(贝塞尔曲线生成算法的设计与调试)

实验报告(贝塞尔曲线生成算法的设计与调试)

实验报告贝塞尔曲线生成算法的设计与调试一、实验目的在掌握曲线、曲面数学理论的基础上,通过调试,绘制Bezier 曲线。

加深同学对数学理论的理解。

通过二条Bezier曲线的拼接设计,掌握自由曲线的拟合方法。

二、实验原理1、由三次Bezier曲线的公式:P(t)=∑P i B i,3(t) 出发,编写生成Bezier曲线的程序,要求如下:(1)用鼠标输入特征多边形的四点。

然后调用Bezier曲线生成算法绘出曲线。

(2)重复上步3—4遍,验证编写的算法的正确性。

2、将特征多边形改为五个控制点,修改程序后绘出四次曲线。

3、实现二条三次Bezier的拼接,并使连接点处保持一阶连续。

三、实验程序typedef cptype float[4][4];float cc (int n,int i) //计算n!/(i!(n-i)!){int j;float a;a=1;for(j=i+1;j<=n;j++) a*=j;for(j=2;j<=n-i;j++) a/=j;return a;}float b_lend(Int i,int n,float t2) //计算B i,n(t){float v;v=cc(n,i);for(j= 1;j<=i;j++) v*=t2;for(j=1;j<=n-i;j++) v*=(1-t2);return v;}void bezier(float x0,float y0,float z0,float t0,int n,cptype cp2)//给定t0,计算f(t0){int i;float b1,g;for(i=0;i<=n;i++){b1=b_lend(i,n,t0);x0=x0+cp2[i,1]*b1;y0=y0+cp2[i,2]*b1;z0=z0+cp2[i,3]*b1;}}void draw_curv(int k,cptype cp1)//将t分成k等份,循环迭代,绘出曲线。

计算机图形学实验报告-实验3Bezier曲线

计算机图形学实验报告-实验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;}}编译运行得到如下结果:。

CG_实验5_Bezier曲线

CG_实验5_Bezier曲线

实验5 Bezier曲线1.实验目的:了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法。

2.实验内容:(1)结合示范代码了解曲线生成原理与算法实现,尤其是Bezier曲线;(2)调试、编译、修改示范程序。

(3)尝试实现B样条曲线算法。

3.实验原理:Bezier曲线是通过一组多边形折线的顶点来定义的。

如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一的。

在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次。

曲线的形状趋向于多边形折线的形状,要修改曲线,只要修改折线的各顶点就可以了。

因此,多边形折线又称Bezier曲线的控制多边形,其顶点称为控制点。

三次多项式,有四个控制点,其数学表示如下:4.实验代码:#include <glut.h>#include <stdio.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;float dt = 0.01;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){ int i;glPointSize(2);for(i=0; i<vpt.size(); i++){glBegin (GL_POINTS);glColor3f (1.0f, 0.0f, 0.0f); glVertex2i (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);glVertex2i (pt[i].x,pt[i].y);}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);printf("Please Click left button of mouse to input control point of Bezier Curve!\n");}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]);bDraw = false;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;bDraw = true;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();return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CAD / CAM 技术实验报告
实验三贝齐尔(Bezier)曲线曲面的生成方法
实验类型:综合型
一、目的与任务
目的:通过学生上机,了解贝齐尔(Bezier)曲线德卡斯特里奥的递推算法和贝齐尔(Bezier)曲线的几何作图法。

任务:熟悉线框建模、表面建模的基本方法。

二、内容、要求与安排方式
1、实验内容与要求:
贝齐尔(Bezier)曲线曲面的德卡斯特里奥的递推算法P(t)=∑Bi,n(t)Q(i)和几何作图法;
要求用熟悉的编程语言编制、调试和运行程序,并打印程序清单和输出结果。

2、实验安排方式:课外编写好程序清单,按自然班统一安排上机。

三、实验步骤
1、熟悉贝齐尔(Bezier)的贝齐尔基函数和贝齐尔的性质
2、贝齐尔(Bezier)曲线的德卡斯特里奥的递推算法;
3、贝齐尔(Bezier)曲线的几何作图法;
4、贝齐尔(Bezier)曲线的德卡斯特里奥的递推算法;
5、贝齐尔(Bezier)曲线的几何作图法。

6、对几何作图法绘制出图,对德卡斯特里奥的递推算法编出程序。

四、实验要求
1.在规定的时间内完成上机任务。

2.必须实验前进行复习和预习实验内容。

3.在熟悉命令过程中,注意相似命令在操作中的区别。

4.指定图形完成后,需经指导教师认可后,方可关闭计算机。

5.完成实验报告一份。

五、试验具体内容
1,Bezier 曲线的描述
在空间给定n + 1 个点P0 ,P1 ,P2 , ⋯,Pn ,称下列参数曲线为n 次的Bezier 曲线。

P(t) = 6n
t = 0
PiJ i ,n (t) , 0 ≤t ≤1
其中J i ,n (t) 是Bernstein 基函数,即
B i ,n (t) = n !/i !(n - i) *t(1-t);
i = 0 , ⋯⋯,n
一般称折线P0P1P2 ⋯Pn 为曲线P(t) 的控制多边形;称点P0 ,P1 ,P2 , ⋯,Pn 为P(t) 的控制顶点。

在空间曲线的情况下,曲线P(t) = (x(t) ,y(t) ,z (t) ) 和控制顶点Pi = (Xi ,Yi ,Zi) 的关系用分量写出即为:
X(t) = 6n
i = 0
XiJ i ,n (t)
Y(t) = 6
n
i = 0
YiJ i ,n (t)
Z(t) = 6n
i = 0
ZiJ i ,n (t)
当t 在区间[0 ,1 ] 上变动时,就产生了Bezier 曲线。

若只考虑x和y ,就是平面上的Bezier 曲线。

以三次Bezier 曲线为例,它可用矩阵形式表示如下:
P(t) = [t3 t2 t 1]
- 1 3 - 3 1
3 - 6 3 0
- 3 3 0 0
1 0 0 0
Q(0)
Q(1)
Q(2)
Q(3)
0 ≤t ≤1
2, Bezier 曲线的性质
Bezier 曲线具有以下性质:
当t = 0 时,P(0) = P0 ,故P0 决定曲线的起点,当t = 1 时,P(1) = Pn ,故Pn 决定曲线的终点。

Bezier 曲线的起点、终点与相应的特征多边形的起点、终点重合。

Bezier 曲线P(t) 在P0 点与边P0P1 相切,在Pn点与边Pn- 1Pn 相切。

Bezier 曲线P(t) 位于其控制顶点P0 ,P1 ,P2 ,⋯,Pn 的凸包之内。

Bezier 曲线P(t) 具有几何不变性。

Bezier 曲线P(t) 具有变差缩减性。

3, Bezier曲线的de Casteljau算法
Paul de Casteljau 发现了一个Bezier 曲线非常有趣的特性,任何的Bezier 曲线都能很容易地分成两个同样阶次的Bezier 曲线。

图1 定比分割
如图1 所示,当P0 ,P2 固定,引入参数t ,令
P0P10
P10
P1
=
P1P11
P11
P2
=
P10
P20
P20
P11
的比值为t : (1 - t) ,即有:
P10= (1 - t) P0 + tP1P11= (1 - t) P1 + tP2P20= (1 - t) P10+ tP11t 从0变到1 ,第一、二式是两条一次Bezier 曲线。

将一、二式代入第三式得:
P20= (1 - t) 2P0 + 2t (1 - t) P1 + t2P2
当t 从0 变到1 时,它表示了由P0 、P1 、P2 三个控制顶点形成的一条二次Bezier 曲线。

并且表明:这个二次Bezier 曲线P02 可以定义为分别由前两个顶点(P0 ,P1) 和后两个顶点(P1 ,P2) 决定的一次Bezier 曲线的线性组合。

依次类推,由四个控制点定义的三次Bezier 曲线P03 可被定义为分别由(P0 ,P1 ,P2) 和(P1 ,P2 ,P3) 确定的二条二次Bezier曲线的线性组合,由(n + 1) 个控制点Pi (i = 0 ,1 ,⋯,n) 定义的n 次Bezier 曲线P0n 可被定义为分别由前、后n 个控制点定义的两条(n - 1) 次Bezier曲线P0n- 1 与P1n- 1 的线性组合:
Pn0 = (1 - t) Pn- 10 + tPn- 11 t ∈[0 ,1 ]
由此得到Bezier 曲线的递推计算公式:
Pki =Pi k = 0
(1 - t)Pk- 1
i + tPk- 1
i+1 k = 1 ,2 , ⋯,n ,i = 0 ,1 , ⋯,n - k
这便是de Casteljau 算法。

用这一递推公式,在给定参数下,求Bezier 曲线上一点P (t) 非常有效。

上式中:Pi0 = Pi 是定义Bezier 曲线的控制点,P0n 即为曲线P(t) 上具有参数t 的点。

这一算法可通过简单的几何作图来实现,给定参数t ∈[0 ,1 ] ,把定义域分成长度为t : (1 - t)的两段。

依次对原始控制多边形每一边执行同样的定比分割,所得分点就是第一级递推生成的中间顶点Pi1 (i = 0 ,1 , ⋯,n - 1) ,对这些中间顶点构成的控制多边形再执行同样的定比分割,得第二级中间顶点Pi2 (i = 0 ,1 , ⋯,n - 2) 。

重复进行下去,直到n 级递推得到一个中间顶点P0n 即为
所求曲线上的点P(t) 。

当t = 1/ 2 时,从(2) 式可知,求Pik 只需进行加法和除2 运算,在计算机内除2 运算只需右移1位,计算速度快。

所以通常取t = 1/ 2 最方便,
即每次求得Bezier
曲线的中点。

如图2 所示,有0 ,1 ,2 ,3 四个控制点,计算每条线的中点01 ,12 ,23 ,再得中点012 ,123 ,最后得到的中点0123 即在曲线上。

四个控制点0 ,01 ,012 ,0123 又定义
了左边的曲线, 四个控
制点0123 ,123 ,23 ,3 又定义了右边的曲线,重复对左右的两条曲线再进行定比分
割,多次进
行定比分割后,就可以用直线段代替曲线段[3 ] 。

图2 de Casteljau 算法的几何作图(t = 1/ 2)
六、贝齐尔(Bezier)曲线德卡斯特里奥的递推算法程序清单
#include<stdio.h>
#include<math.h>
void main()
{
int i,j,k,f,u,d,n,m,w,g,h;
char c1;
i=0;j=1;k=1;w=1;g=1;h=1;f=1;u=1;d=1;
printf(" please input n number:\n");
scanf("%d",&n);
for(i=0;i<=n;i++)
{
{ for(g=1;g<=n;g++)
f=f*g;
for(h=1;h<=i;h++)
u=u*h;
for(w=1;w<=(n-i);w++)
d=d*w;
m=f/u/d;
printf("%d",m);
f=1;u=1;d=1;
}
for(j=1;j<=i;j++)
printf("t");
for(k=1;k<=(n-i);k++)
printf("(1-t)");
printf("Q(%d)",i);
if(i==n)break;else printf("+");
}
}
七、运行结果
八,MATLAB曲面生成程序:
[th,r]=meshgrid((0:5:360)*pi/180,0:.05:1); %在极坐标系下设置一个73×21的网格矩阵,
[X,Y]=pol2cart(th,r); %转化为笛卡儿坐标系%
Z=X+i.*Y;
F=abs((Z.^4-1).^(1/4));
surf(X,Y,F); %显示曲面的立体图形%
S=[X(:) Y(:) F(:)]; %把X、Y、F 3个矩阵中的数据存储到矩阵S中%
b=size(S);
S=[floor(1:b(1,1));S']';
save flcxq.ibl S –ascii
图像为:。

相关文档
最新文档