贝齐尔曲面绘制
- 格式:doc
- 大小:246.00 KB
- 文档页数:23
昆明理工大学理学院信息与计算科学专业操作性实验报告年级: 10级姓名:刘陈学号: 201011101128 指导教师:胡杰实验课程名称:计算机图形学程序设计开课实验室:理学院机房216实验内容:1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制2.实验/作业课时:2学时3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:(1)硬件:每人一台PC机(2)软件:windows OS,VC++6.0或以上版本。
试验内容及步骤:(1)在VC++环境下创建MFC应用程序工程(单文档)(2)编辑菜单资源(3)添加菜单命令消息处理函数(4)添加成员函数(5)编写函数内容试验要求:(1)掌握Bezier曲线、Bezier曲面、及另一个曲面的算法。
(2)实现对Bezier曲线、Bezier曲面、及另一个曲面。
(3)试验中调试、完善所编程序,能正确运行出设计要求结果。
(4)书写试验报告上交。
4.程序结构(程序中的函数调用关系图)5.算法描述、流程图或操作步骤:在lab4iew.cpp文件中添加如下头文件及变量int flag_2=0;int n_change;#define M 30#define PI 3.14159 //圆周率#include "math.h" //数学头文件在lab4iew.h文件中的public内添加变量:int move;int graflag;void Tiso(float p0[3],float x0, float y0, float p[3]);void OnBezierface();在lab4iew.h文件中的protected内添加变量:int n;//控制点数const int N;//控制点数的上限CPoint* a;//控制点存放的数组double result[4][2];在lab4iew.cpp文件中的函数Clab4iew::OnDraw(CDC* pDC)下添加如下代码:int i,j;for(i=0;i<n;i++){pDC->FillSolidRect(a[i].x-2,a[i].y-2,4,4,RGB(255,55,255));}pDC->MoveTo(a[0]);for(j=0;j<n;j++){ pDC->LineT o(a[j]); }if(n<2) return;//如果控制点数少于2,则不用画CPen pen(0,2,RGB(255,0,255)),*p1;p1=pDC->SelectObject(&pen);……在Lab4iew.cpp文件中添加如下的各个消息处理函数及代码:void CLab4View::OnLButtonDown(UINT nFlags, CPoint point){ if(flag_2==0) //flag_2等于0,此时是输入控制点状态{ CClientDC dc(this); //实时输入一个控制点,在屏幕上显示此点dc.FillSolidRect(point.x-2,point.y-2,4,4,RGB(0,0,255));if(n<N){a[n++]=point;} //给控制点数组a[]赋值else {MessageBox("控制点太多!","waring",MB_OK|MB_ICONINFORMATION);}}else if(flag_2==1) //flag_2等于1,此时是修改控制点状态{ int i;for(i=0;i<n;i++) {if((abs(point.x-a[i].x)<10)&&(abs(point.y-a[i].y)<10)) //给定一个范围,如果在范围内,则选中该控制点{ n_change=i; }}CClientDC dc(this); //如果选中该点,则该点的颜色发生变化dc.FillSolidRect(a[n_change].x-2,a[n_change].y-2,4,4,RGB(255,255,0));}CView::OnLButtonDown(nFlags, point);}void CLab4View::OnLButtonUp(UINT nFlags, CPoint point){ if(flag_2==1) {a[n_change]=point; //给变换的点赋值Invalidate(true); //调用OnDraw函数,重新画控制多边形}CView::OnLButtonUp(nFlags, point);}void CLab4View::OnMouseMove(UINT nFlags, CPoint point){ if(flag_2==1) {if(nFlags==MK_LBUTTON){ a[n_change]=point;Invalidate(true); }}CView::OnMouseMove(nFlags, point);}void CLab4View::Ondrawbezier(){ move=0; graflag=1; Invalidate(true); flag_2=1;}void CLab4View::OnRButtonDown(UINT nFlags, CPoint point){ CRect rc; //点右键,刷新屏幕,使控制定点数归零,并且所有开关变量变为初试值GetClientRect(&rc);CClientDC dc(this);dc.Rectangle(0,0,rc.right,rc.bottom); //清屏n=0; //控制点数归零flag_2=0; //开关变量变为初试值CView::OnRButtonDown(nFlags, point);}void CLab4View::OnMove(){ move=1; flag_2=1;CClientDC dc(this);int i=0;while (i<n){ a[i].y=a[i].y+50; i++; }Invalidate(true); }void CLab4View::OnBezierface(){ Invalidate(true);UpdateWindow();CClientDC dc(this);dc.SetTextColor(RGB(0,0,255));dc.TextOut(160,160,"Bezier曲面");CPen pen1,pen2;pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));pen2.CreatePen(PS_SOLID,3,RGB(0,0,255));int a[24][2]={{100,400},{110,300},{130,250},{150,350}, {200,300},{210,280},{250,200},{280,250},{300,320},{300,280},{330,180},{360,250},{400,400},{380,320},{410,200},{480,280}};int i,j;dc.SelectObject(&pen2);for(i=0;i<16;i=i+4){ dc.MoveTo(a[i][0],a[i][1]);for(j=0;j<4;j++){ dc.LineT o(a[i+j][0],a[i+j][1]); }}for(i=0;i<4;i++){ dc.MoveTo(a[i][0],a[i][1]);for(j=0;j<16;j=j+4){ dc.LineT o(a[i+j][0],a[i+j][1]); }dc.SelectObject(&pen2);}double x,y; x=a[0][0]; y=a[0][1]; dc.MoveTo(x,y);dc.SelectObject(&pen1);double u,w;for(u=0;u<1;u=u+0.01){ double U0=-u*u*u+3*u*u-3*u+1;double U1=3*u*u*u-6*u*u+3*u;double U2=-3*u*u*u+3*u*u;double U3=u*u*u;x=U0*a[0][0]+U1*a[4][0]+U2*a[8][0]+U3*a[12][0];y=U0*a[0][1]+U1*a[4][1]+U2*a[8][1]+U3*a[12][1];dc.MoveTo(x,y);for(w=0;w<1;w=w+0.01){ double W0=-w*w*w+3*w*w-3*w+1;double W1=3*w*w*w-6*w*w+3*w;double W2=-3*w*w*w+3*w*w;double W3=w*w*w;x=((U0*a[0][0]+U1*a[4][0]+U2*a[8][0]+U3*a[12][0])*W0+(U0*a[1][0]+U1*a[5][0]+U2*a[9][0]+U3*a[13][0])*W1+(U0*a[2][0]+U1*a[6][0]+U2*a[10][0]+U3*a[14][0])*W2+(U0*a[3][0]+U1*a[7][0]+U2*a[11][0]+U3*a[15][0])*W3);y=((U0*a[0][1]+U1*a[4][1]+U2*a[8][1]+U3*a[12][1])*W0+(U0*a[1][1]+U1*a[5][1]+U2*a[9][1]+U3*a[13][1])*W1+(U0*a[2][1]+U1*a[6][1]+U2*a[10][1]+U3*a[14][1])*W2+(U0*a[3][1]+U1*a[7][1]+U2*a[11][1]+U3*a[15][1])*W3);dc.LineT o(x,y);Sleep(1);}}for(w=0;w<1;w=w+0.01){ double W0=-w*w*w+3*w*w-3*w+1;double W1=3*w*w*w-6*w*w+3*w;double W2=-3*w*w*w+3*w*w;double W3=w*w*w;x=W0*a[0][0]+W1*a[1][0]+W2*a[2][0]+W3*a[3][0];y=W0*a[0][1]+W1*a[1][1]+W2*a[2][1]+W3*a[3][1];dc.MoveTo(x,y);for(u=0;u<1;u=u+0.01){ double U0=-u*u*u+3*u*u-3*u+1;double U1=3*u*u*u-6*u*u+3*u;double U2=-3*u*u*u+3*u*u;double U3=u*u*u;x=((U0*a[0][0]+U1*a[4][0]+U2*a[8][0]+U3*a[12][0])*W0+(U0*a[1][0]+U1*a[5][0]+U2*a[9][0]+U3*a[13][0])*W1+(U0*a[2][0]+U1*a[6][0]+U2*a[10][0]+U3*a[14][0])*W2+(U0*a[3][0]+U1*a[7][0]+U2*a[11][0]+U3*a[15][0])*W3);y=((U0*a[0][1]+U1*a[4][1]+U2*a[8][1]+U3*a[12][1])*W0+(U0*a[1][1]+U1*a[5][1]+U2*a[9][1]+U3*a[13][1])*W1+(U0*a[2][1]+U1*a[6][1]+U2*a[10][1]+U3*a[14][1])*W2。
bezier曲面法向量-回复bezier曲面法向量(Bezier Surface Normal Vectors)引言:Bezier曲面是计算机图形领域中一种常用的曲面表示方法。
根据给定的控制点和权重,Bezier曲面可以生成平滑且逼真的曲面形状。
但是,在进行光照和渲染等计算时,我们需要计算曲面上每个点的法向量,以便进行光照模型计算等。
本文将详细介绍如何计算Bezier曲面的法向量,以及其中的数学背景和计算方法。
第一部分:Bezier曲面简介Bezier曲面是利用Bezier曲线在二维或三维空间中进行变形和组合而成的。
Bezier曲线由一系列控制点和权重定义,在曲线上的点是通过使用Bernstein多项式进行插值计算得到的。
Bezier曲线在绘制曲线和表面、CAD建模等领域得到广泛应用。
而Bezier曲面则是由多个Bezier曲线组成的曲面。
第二部分:Bezier曲面的参数化表示在图形学中,我们通常使用参数化表示来描述曲线和曲面。
Bezier曲面可以通过控制点和权重来进行参数化表示。
对于二维的Bezier曲面,我们可以用以下方式来定义:S(u,v) = ∑Bi(u)Bj(v)Pi,j其中,S(u,v)表示曲面上的一点,Bi(u)和Bj(v)是u和v参数所对应的一维Bezier曲线的基函数,而Pi,j表示控制点。
第三部分:Bezier曲面的切向量在计算曲面上某一点的法向量之前,我们首先需要计算该点的切向量。
切向量是描述曲面上某点在该点处切平面上的一个向量。
为了计算切向量,我们可以计算参数u和v分别增加一个微小值时,曲面上相应的两个点。
然后,通过这两个点及其切向量进行差值运算,得到该点的切向量。
计算切向量公式如下:Ts(u,v) = ∂S(u,v)/∂uTv(u,v) = ∂S(u,v)/∂v其中,Ts和Tv分别表示u和v方向上的切向量。
第四部分:Bezier曲面的法向量在得到切向量后,我们可以使用叉乘运算得到曲面上某点的法向量。
课程名称:《计算机图形学》论文题目:双三次Bezier曲面的绘制教学部:年级:班级:学号:姓名:摘 要:本文主要讨论了在VC++中使用OpenGL 绘制Bezier 、NURBS 等典型曲面的一般性方法和OpenGL 的特点及功能,OpenGL 可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性 。
关键词:Bezier 曲面;OpenGL ;曲面绘制一、设计概述1.设计要求1)掌握双三次Bezier 曲面定义:Bezier 曲面与 Bezier 曲线有相同的性质,Bezier 曲面片是由特征多面体的顶点决定的,利用两组正交的 Bezier 曲线逼近由控制点网格描述的曲面。
给定(n+1)*(m+1)个点Pjk (i=0,1…n ;j=0,1,...m ),则可以生成一个n*m 次的Bezier 曲面片,其表示形式为其中Pij 是Bezier 曲面片的特征多面体。
当m=n=3时,特征多面体有16个顶点,其相应的Bezier 曲面片称为双三次Bezier 曲面片。
2)实现矩阵相关运算;双三次Bezier 曲面片的矩阵表示为其中2.设计方案∑∑===m i n j n j m i j i Q v B u B p v u 00,,,)()(),([0,1]v)(u,∈T T bb Q V GM UM v u =),(⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----=0001003303631331b M ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=44434241343332312423222114131211P P P P P P P P P P P P P P P P G []123u u u U =[]123v v v V =1)给定16个三维控制点如下:P00(200,20,0),P01(150,0,100),P02(50,-130,100),P03(0,-250,50);P10(150,100,100),P11(100,30,100),P12(50,-40,100),P13(0,-110,100);P20(140,280,90),P21(80,110,120),P22(30,30,130),P23(-50,-100,150);P30(150,350,30),P31(50,200,150),P32(0,50,200),P33(-70,0,100);2)实现键盘控制曲面旋转效果二、环境需求分析开发环境:Windows XP开发工具:Microsoft Visual Studio 2005运行环境:本系统是基于OpenGL软件接口和VC++应用程序开发的一套管理系统,本系统可以在装有Windows 98 /2000/XP/NT的操作系统下运行。
目录1 绪论 (1)1.1贝齐尔曲面的介绍 (1)1.2贝齐尔曲面的应用 (2)2 贝齐尔曲面设计 (3)2.1 贝齐尔曲面定义 (3)2.2 贝齐尔曲面性质 (4)2.3 贝齐尔曲面算法 (5)2.4 程序设计步骤 (5)2.4.1 Bezier曲面的生成 (5)2.4.2 绘制网格曲面 (6)2.4.3 绘制一个填充曲面 (8)2.4.4 三次贝齐尔曲面 (9)2.5 主程序 (10)3 总结 (20)参考文献 (21)致谢 (22)1 绪论1.1贝齐尔曲面的介绍到了70年代,法国雷诺汽车公司的工程师贝齐尔(Bezier)创造出一种适用于几何体外形设计的新的曲线表示法。
这种方法的优越性在于:对于在平面上随手勾画出的一个多边形(称为特征多边形),只要把其顶点坐标输入计算机,经过不到一秒钟的计算,绘图机就会自动画出同这个多边形很相像、又十分光滑的一条曲线。
这种方法被人们称为贝齐尔(Bezier)方法(以下统称为Bezier方法)。
贝齐尔曲线的形状是通过一组多边折线(也称为贝齐尔控制多边形)的各顶点惟一地定义出来的。
在该多边折线的各顶点中,只有第一点和最后一点在曲线上,其余的顶点则用来定义曲线的形状。
图1-1列举了一些Bezier多边折线和相应的Bezier曲线的形状关系。
图1-1 Bezier 曲线曲线和曲面是计算机图形学中研究的重要内容之一,他们在实际工作中有着广泛的应用。
例如,实验数据的曲线表示,设计、优化的曲面表示等。
为了外形美观和物理性能最佳,汽车飞机等的外型设计十分重要。
由于实际问题不断对曲线和曲面提出新的要求,近几十年来,曲线和曲面理论及其应用得到了很大的发展。
1963年,波音飞机公司的Ferguson将曲线曲面表示成参数矢量形式,并用3次参数曲线来构造组合曲线,用4个角点的位置矢量及其两个方向的切向矢量来构造3次曲面。
1964年,麻省理工学院的coons用封闭的曲线的4条边界定义一个曲面。
实验七 3D编程及Bezier曲线曲面绘制一、实验目的1.3D编程:熟悉视点观察函数的设置和使用;熟悉投影变换函数的设置和使用;熟悉基本3D 图元的绘制2.了解OpenGL绘制Bezier曲线的方法二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。
软件环境:操作系统:Windows XP。
语言开发工具:VC6.0。
三、实验要求:按照实验内容做实验,保留所作步骤效果截图或演示程序,当场检查,现场计分四、实验内容1.3D编程3D Cube.cpp 为一静止3D立方体,3D Cube2.cpp 为正交投影下的旋转3D立方体,按下鼠标可实现不同方向的旋转。
分析3D编程代码与程序结构。
图7-1 静止立方体效果图图7-2 旋转立方体效果图图7-3 旋转茶壶和圆环效果图1.让静止的立方体绕Z轴不停旋转2.修改视点,目标点不变,观看显示效果3. 修改目标点,视点不动,观看显示效果4. 视点与目标点同时修改,观看显示效果5. 视点与目标点不变,修改观察体大小,观看显示效果6. 将正交投影观察体改为透视投影观察体,并设置其大小,观察显示效果7. 将立方体替换为茶壶,观看显示效果.选做2.Bezier曲线绘制BezierCurve.cpp为绘制bezier曲线的源程序,仔细研读源程序,并作如下修改1).改变控制点,观察曲线和曲面形状的变化,控制点起什么作用?2).改写bezier.cpp,增加控制点数目,修改控制点位置,使之成为空间封闭曲线,写出修改的关键代码及注释(TIPS:OpenGLBezier曲线绘制方法最多只能有8个控制点)3).根据bezier曲线的性质,改写程序,使之成为两段曲线光滑连接。
每段曲线用不同颜色表示,并画出控制点。
图7-2·Bezier曲线绘制效果五、函数参考(一)3D编程1.视点设置函数void gluLookAt(GLdouble eyex, GLdouble eyey,GLdouble eyez,GLdouble atx,GLdouble aty,GLdouble atz,GLdouble upx,GLdouble upy,GLdouble upz)给出矩阵作用于当前矩阵,定义相机位置和方向视点:eyex, eyey, eyez目标点:atx,aty,atz相机向上方向:upx,upy,upz如果不引用该函数,则eyex=0,eyey=0,eyez=0,atx=0,aty=0,atz=-1,Upx=0,upy=1,upz=0此函数放在display函数中调用参考坐标系:世界坐标系2.正交投影变换设置函数. void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far),建立正交投影矩阵,定义一个正平行观察体。
bezier曲线绘制算法贝塞尔曲线绘制算法贝塞尔曲线是一种常用于计算机图形学中的数学曲线,具有平滑弯曲的特性。
通过控制点的位置和数量,可以绘制出各种形状的曲线,如圆弧、曲线等。
本文将介绍贝塞尔曲线绘制算法的基本原理和实现方法。
1. 贝塞尔曲线的基本概念贝塞尔曲线由两个或多个控制点决定,通过这些控制点的位置,可以确定曲线的形状和轨迹。
其中,起始点和结束点称为锚点,而其他点称为控制点。
贝塞尔曲线的形状由控制点之间的插值和权重决定,权重决定了每个控制点对曲线形状的影响程度。
2. 二次贝塞尔曲线绘制算法二次贝塞尔曲线由三个点决定,分别是起始点P0、控制点P1和结束点P2。
绘制二次贝塞尔曲线的算法如下:(1) 将曲线分为若干个线段,每段用t从0到1进行插值。
(2) 根据插值参数t,计算控制点P0、P1和P2在x和y轴上的值。
(3) 绘制连接P0和P1的线段,连接P1和P2的线段。
3. 三次贝塞尔曲线绘制算法三次贝塞尔曲线由四个点决定,分别是起始点P0、控制点P1、P2和结束点P3。
绘制三次贝塞尔曲线的算法如下:(1) 将曲线分为若干个线段,每段用t从0到1进行插值。
(2) 根据插值参数t,计算控制点P0、P1、P2和P3在x和y轴上的值。
(3) 绘制连接P0和P1的线段,连接P1和P2的线段,以及连接P2和P3的线段。
4. 高阶贝塞尔曲线的绘制算法除了二次和三次贝塞尔曲线,还存在更高阶的贝塞尔曲线。
对于n 阶贝塞尔曲线,需要n+1个点来确定。
其绘制算法与二次和三次贝塞尔曲线类似,通过插值参数t来计算各个控制点的值,并连接相邻控制点。
5. 贝塞尔曲线的应用贝塞尔曲线在计算机图形学中有广泛的应用,常用于绘制平滑曲线、图形变形、字体设计等方面。
在计算机动画、游戏开发等领域,贝塞尔曲线的应用也非常广泛。
贝塞尔曲线是一种常用于计算机图形学中的数学曲线,通过控制点的位置和数量,可以绘制出各种形状的曲线。
本文介绍了贝塞尔曲线的基本概念,以及二次、三次和高阶贝塞尔曲线的绘制算法。
目录1 绪论 (1)1.1贝齐尔曲面的介绍 (1)1.2贝齐尔曲面的应用 (2)2 贝齐尔曲面设计 (3)2.1 贝齐尔曲面定义 (3)2.2 贝齐尔曲面性质 (4)2.3 贝齐尔曲面算法 (5)2.4 程序设计步骤 (5)2.4.1 Bezier曲面的生成 (5)2.4.2 绘制网格曲面 (6)2.4.3 绘制一个填充曲面 (8)2.4.4 三次贝齐尔曲面 (9)2.5 主程序 (10)3 总结 (20)参考文献 (21)致谢 (22)1 绪论1.1贝齐尔曲面的介绍到了70年代,法国雷诺汽车公司的工程师贝齐尔(Bezier)创造出一种适用于几何体外形设计的新的曲线表示法。
这种方法的优越性在于:对于在平面上随手勾画出的一个多边形(称为特征多边形),只要把其顶点坐标输入计算机,经过不到一秒钟的计算,绘图机就会自动画出同这个多边形很相像、又十分光滑的一条曲线。
这种方法被人们称为贝齐尔(Bezier)方法(以下统称为Bezier方法)。
贝齐尔曲线的形状是通过一组多边折线(也称为贝齐尔控制多边形)的各顶点惟一地定义出来的。
在该多边折线的各顶点中,只有第一点和最后一点在曲线上,其余的顶点则用来定义曲线的形状。
图1-1列举了一些Bezier多边折线和相应的Bezier曲线的形状关系。
图1-1 Bezier 曲线曲线和曲面是计算机图形学中研究的重要内容之一,他们在实际工作中有着广泛的应用。
例如,实验数据的曲线表示,设计、优化的曲面表示等。
为了外形美观和物理性能最佳,汽车飞机等的外型设计十分重要。
由于实际问题不断对曲线和曲面提出新的要求,近几十年来,曲线和曲面理论及其应用得到了很大的发展。
1963年,波音飞机公司的Ferguson将曲线曲面表示成参数矢量形式,并用3次参数曲线来构造组合曲线,用4个角点的位置矢量及其两个方向的切向矢量来构造3次曲面。
1964年,麻省理工学院的coons用封闭的曲线的4条边界定义一个曲面。
同年,Schoenberg给出了参数样条曲线和曲面的形式。
1971年,法国雪铁龙汽车公司的De Vasteljau 独立地研究出与Bezier 类似的方法。
1972年,De Boor给出了B样条的标准计算方法。
1974年,美国通用汽车公司的Gordon和Riesenfeld将B样条用于形状描述,提出了B样条曲线和B样条曲面。
1975年,美国锡拉丘兹大学的Versprill在其博士论文中提出了有理B样条方法。
19世纪80年代后期,美国的Piegl和Tiller将有理B样条发展成为非均匀有理B样条方法。
非均匀有理B样条方法已成为当今自由曲线和曲面描述的通用方法,可以统一表示初等解析曲线和曲面、有理与非有理Bezier曲线和曲面以及有理与非有理B样条曲线和曲面。
1.2贝齐尔曲面的应用曲面造型(Surface Modeling)是计算机辅助几何设计 (Computer Aided Geometric Design,CAGD)和计算机图形学(Computer Graphics)的一项重要内容,主要研究在计算机图像系统的环境下对曲面的表示、设计、显示和分析。
它起源于汽车、飞机、船舶、叶轮等的外形放样工艺,由Coons、Bezier等大师于二十世纪六十年代奠定其理论基础。
如今经过三十多年的发展,曲面造型现在已形成了以有理B样条曲面(Rational B-spline Surface)参数化特征设计和隐式代数曲面(Implicit Algebraic Surface)表示这两类方法为主体,以插值(Interpolation)、拟合(Fitting)、逼近(Approximation)这三种手段为骨架的几何理论体系。
曲面造型是指在产品设计中对于曲面形状产品外观的一种建模方法,曲面造型方法使用三维CAD软件的曲面指令功能构建产品的外观形状曲面并得到实体化模型。
在不同的三维软件比如ProE、UG、CATIA和Solidworks中所使用的指令有所差别,但基本的造型策略都是类似的。
形状信息的核心问题是计算机表示,即要解决既适合计算机处理,且有效地满足形状表示与几何设计要求,又便于形状信息传递和产品数据交换的形状描述的数学方法。
1971年法国雷诺汽车公司的Bezier 提出一种由控制多边形设计曲线的新方法。
这种方法不仅简单易用,而且漂亮地解决了整体形状控制问题,把曲线曲面的设计向前推进了一大步,为曲面造型的进一步发展奠定了坚实的基础。
但Bezier方法仍存在连接问题和局部修改问题。
到1972年,de-Boor总结、给出了关于B样条的一套标准算法,1974年Gordon和Riesenfeld又把B样条理论应用于形状描述,最终提出了B样条方法。
这种方法继承了Bezier方法的一切优点,克服了Bezier方法存在的缺点,较成功地解决了局部控制问题,又轻而易举地在参数连续性基础上解决了连接问题,从而使自由型曲线曲面形状的描述问题得到较好解决。
但随着生产的发展,B样条方法显示出明显不足,不能精确表示圆锥截线及初等解析曲面,这就造成了产品几何定义的不唯一,使曲线曲面没有统一的数学描述形式,容易造成生产管理混乱。
曲面造型由于其实用性,在航空航天、汽车制造、造船、机械制造、电子、电器、消费品行业得到广泛应用。
它的集成解决方案覆盖所有的产品设计与制造领域,满足了工业领域各类大、中、小型企业的需要。
2 贝齐尔曲面设计2.1 贝齐尔曲面定义设),1,0;,1,0(m j n P ij =为)1()1(+⨯+m n 个空间点列,则m ×n 次Bezier 曲面定义为:]1,0[,)()(),(00,,∈=∑∑==v u v B u B P v u P m i nj n j m i ij (式2-1)其中i m ii mm i u u C u B --=)1()(, ,j n j j n n i v v C v B --=)1()(,是Bernstein 基函数。
依次用线段连接点列中相邻两点所形成的空间网格,称之为特征网格。
Bezier 曲面的矩阵表示式是:[]⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=)()()()(,),(),(),(,,1,0101111000100,,1,0v B v B v B P P P P P PP P P u B u B u B v u P m n m m nm n n m m n m n n (式2-2) 在一般实际应用中,n 、m 不大于4。
(1) 双线性Bezier 曲面 当m=n=1时∑=∑==1010)()(),(1,1,i j p w B u B w u S ijj i u ,w ∈[0,1] (式2-3)定义一张双线性Bezier 曲面。
已知四个角点之后,则11100100)1()1()1)(1(),(uwpup w p u u w w u S -+-+--= (式2-4)(2) 双二次Bezier 曲面 当m=n=2时∑∑===20202,2,)()(w)S(u,i j ijj i p w B u B ]1,0[,∈w u (式2-5)由此式定义的曲面,其边界曲线及参数坐标曲线均为抛物线。
(3) 双三次Bezier 曲面 当m=n=3时∑∑===30303,3,)()(w)S(u,i j ijj i p w B u B ]1,0[,∈w u (式2-6)⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=)()()()()]()()()([),(3,33,23,13,0333231302322212013121110030201003,33,23,13,0w B w B w B w B p p p p p p p p p p p p p p p p u B u B u B u B w u S (式2-7)其矩阵表示为TTZ Z Z W M B UM w u S =),(⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----===0001003303631331],1[],1[2323z M w w w W u u u U (式2-8)2.2 贝齐尔曲面性质1.Bezier 曲面特征网格的四个角点正好是Bezier 曲面的四个角点,即 P(0,0)=P 00 P(1,0)=P M0 P(0,1)=P 0N P(1,1)=P MN2. Bezier 曲面特征网格最外一圈顶点定义Bezier 曲面的四条边界;Bezier 曲面边界的跨界切矢只能与定义该边界的顶点及相邻一排顶点有关,且P 00P 10P 01, P 0n P 1n P 0,n-1, P m0P m-1,0P m1,分别是四个角点的切平面;跨界二阶导矢只与定义该边界的及相邻两排顶点有关。
几何不变性、凸包性、对称性等性质可由Bezier 曲线的相关性质容易推广得到。
图2-1 阴影三角形2.3 贝齐尔曲面算法Bezier 曲线的递推(de Casteljau)算法,可以推广到Bezier 曲面的情形。
若给定Bezier 曲面特征网格的控制顶点:),1,0,,1,0(n j m i p ij ==和一对参数值(u,v ),则:式(2-9)一条曲线可以表示成两条低一次曲线的组合,一张曲面可以表示成低一次的四张曲面的线性组合。
其中:⎪⎩⎪⎨⎧==+-==+-===-+--+-),,2,1,()1()0;,,2,1()1()0(1,1,01,,00,1,10,1,,n l m k vP P v l m k uP P u l k P P l m j l m j k ji k ij ijlk j i 式(2-10)或:⎪⎩⎪⎨⎧==+-==+-===-+--+-);,,2,1()1(),,2,1;0()1()0(,10,1,101,01,1,0,n l m k uP P u n l k vP P v l k P P nk i n k i l j i l ij ijl k ij 式(2-11)上面给出了确定曲面上一点的两种方案。
当按(1)式方案执行时,先以u 参数值对控制网格u 向的n+1个多边形执行曲线de Casteljau 算法,m 级递推后,得到沿v 向由n+1个顶点),1,0(00n j p m j =构成的中间多边形。
再以v 参数值对它执行曲线的de Casteljau 算法,n 级递推以后,得到一个mnP 00,即所求曲面上的点。
也可以按(2) 式方案执行,先以v 参数值对控制网格沿v 向的m+1个多边形执行n级递推,得沿u 向由m+1个顶点),1,0(00m i p n i =构成的中间多边形。
再以u 参数值对它执行n 级递推,得所求点mnP 00。
2.4 程序设计步骤 2.4.1 Bezier 曲面的生成Bezier 曲面是基于Beizer 曲线而定义的,有特征网格决定其大致形状,而特征网格是由控制点确定的。