350 likes | 609 Views
Computer Graphics. 第七章 自由曲线和曲面 (1). 本章内容 -1. 7.1 基本概念 7.2 三次参数样条曲线. 工业产品的几何形状大致可分为两类:一类由初等解析曲面,如平面、圆柱面、圆锥面、球面、圆环面等组成,可以用初等解析函数完全清楚地表达全部形状。 另一类由自由曲面组成,如汽车车身、飞机机翼和轮船船体等的曲线和曲面,不能用初等解析函数完全清楚地表达全部形状,需要构造新的函数来进行研究,这些研究成果形成了计算机辅助几何设计 (Computer Aided Geometric Design , CAGD) 学科。. 图 7-1 汽车的曲面.
E N D
Computer Graphics 第七章 自由曲线和曲面(1)
本章内容-1 7.1 基本概念 7.2 三次参数样条曲线
工业产品的几何形状大致可分为两类:一类由初等解析曲面,如平面、圆柱面、圆锥面、球面、圆环面等组成,可以用初等解析函数完全清楚地表达全部形状。工业产品的几何形状大致可分为两类:一类由初等解析曲面,如平面、圆柱面、圆锥面、球面、圆环面等组成,可以用初等解析函数完全清楚地表达全部形状。 另一类由自由曲面组成,如汽车车身、飞机机翼和轮船船体等的曲线和曲面,不能用初等解析函数完全清楚地表达全部形状,需要构造新的函数来进行研究,这些研究成果形成了计算机辅助几何设计(Computer Aided Geometric Design,CAGD)学科。
7.1 基本概念 7.1.1 样条曲线曲面 7.1.2 曲线曲面的表示形式 7.1.3 拟合和逼近 7.1.4 连续性条件
7.1.1 样条曲线曲面 在汽车制造厂里,传统上采用样条绘制曲线的形状。绘图员弯曲样条(如弹性细木条)通过各型值点,其它地方自然过渡,然后沿样条画下曲线,即得到样条曲线(Spline Curve)。 在计算机图形学中,样条曲线是指由多项式曲线段连接而成的曲线,在每段的边界处满足特定的连续性条件,而样条曲面则可用两组正交样条曲线来描述。
7.1.2 曲线曲面的表示形式 • 曲线曲面的可以采用显式方程、隐函数方程和参数方程表示。 • 首先看一下直线的表示形式:已知直线的起点坐标P1(x1,y1)和终点坐标P2(x2,y2),直线的显式方程表示为:
直线的隐函数方程表示为: • 直线的参数方程表示为:
由于用参数方程表示的曲线曲面可以直接进行几何变换,而且易于表示成矢量和矩阵,所以在计算机图形学中一般使用参数方程来描述曲线曲面。下面以一条三次曲线为例,给出参数方程的矢量和矩阵表示:由于用参数方程表示的曲线曲面可以直接进行几何变换,而且易于表示成矢量和矩阵,所以在计算机图形学中一般使用参数方程来描述曲线曲面。下面以一条三次曲线为例,给出参数方程的矢量和矩阵表示: • 参数方程表示:
矢量表示: • 矩阵表示:
7.1.3 拟合和逼近 • 曲线曲面的拟合:当用一组型值点(插值点)来指定曲线曲面的形状时,形状完全通过给定的型值点序列确定,称为曲线曲面的拟合。 图7-2 拟合曲线
7.1.4 连续性条件 通常单一的曲线段或曲面片难以表达复杂的形状,必须将一些曲线段连接成组合曲线,或将一些曲面片连接成组合曲面,才能描述复杂的形状。为了保证在连接点处平滑过渡,需要满足连续性条件。连续性条件有两种:参数连续性和几何连续性。
参数连续性 • 零阶参数连续性,记作C0,指相邻两个曲线段在交点处具有相同的坐标。如图7-4所示。 图7-4 零阶连续性
一阶参数连续性,记作C1,指相邻两个曲线段在交点处具有相同的一阶导数。如图7-5所示。一阶参数连续性,记作C1,指相邻两个曲线段在交点处具有相同的一阶导数。如图7-5所示。 图7-5 一阶连续性
二阶参数连续性,记作C2,指相邻两个曲线段在交点处具有相同的一阶和二阶导数。如图7-6所示。二阶参数连续性,记作C2,指相邻两个曲线段在交点处具有相同的一阶和二阶导数。如图7-6所示。 图7-6 二阶连续性
几何连续性 • 与参数连续性不同,集合连续性只要求参数导数成比例,而不是相等。 • 零阶几何连续性,记作G0,与零阶参数连续性相同,指相邻两个曲线段在交点处具有相同的坐标。 • 一阶几何连续性,记作G1,指相邻两个曲线段在交点处的一阶导数成比例,但大小不一定相等。 • 二阶几何连续性,记作G2,指相邻两个曲线段在交点处的一阶和二阶导数成比例,即曲率一致。
参数连续性和几何连续性的比较: 对于几何连续性,曲线将向具有较大切向量的部分弯曲。
7.2 三次参数样条曲线 7.2.1 参数样条曲线定义
三次参数样条曲线算法 1 设置最大型值点数为40.2 设置标志变量Flag,当Flag=TURE时开始绘制型值点;当Flag=FALSE时绘制结束。3 计算弦长。4 根据边界条件计算始端和终端的投影。5 对x和y方向进行同样的计算。6 分别计算x和y方向的7 用追赶法求解三弯矩方程8 分别计算x和y方向的系数9 根据(x,y)坐标值绘制三次参数样条曲线
2.已知17个型值点:P 1(-360,0),P 2(315,71),P 3(-270,100),P 4(-225,71),P 5(-180,0),P 6(-135,71),P 7(-90,100),P 8(-45,71),P 9(0,0),P 10(45,-71),P 11(90,-100),P 12(135,-71),P 13(180,0),P 14(225,71),P 15(270,100),P 16(315,71),P 17(360,0),如图7-27所示。边界条件为:自由端。使用VC++编程绘制通过给定型值点的三次参数样条曲线和正弦曲线,试比较二者之间差异。
CTestView::CTestView() { // TODO: add construction code here px[1]=-360;py[1]=0;//型值点初始化 px[2]=-315;py[2]=-71; px[3]=-270;py[3]=-100; px[4]=-225;py[4]=-71; px[5]=-180;py[5]=0; px[6]=-135;py[6]=71; px[7]=-90;py[7]=100; px[8]=-45;py[8]=71; px[9]=0;py[9]=0; px[10]=45;py[10]=-71; px[11]=90;py[11]=-100; px[12]=135;py[12]=-71; px[13]=180;py[13]=0; px[14]=225;py[14]=71; px[15]=270;py[15]=100; px[16]=315;py[16]=71; px[17]=360;py[17]=0; }
void CTestView::DrawPoint()//绘制型值点 { CClientDC dc(this); CPen NewPen,*OldPen; CBrush NewBrush,*OldBrush; NewPen.CreatePen(PS_SOLID,1,RGB(255,255,0)); OldPen=dc.SelectObject(&NewPen); NewBrush.CreateSolidBrush(RGB(0,0,0)); OldBrush=dc.SelectObject(&NewBrush); for(int i=1;i<N;i++) { dc.Ellipse(ROUND(px[i]-5+MaxX/2),ROUND(py[i]-5+MaxY/2),ROUND(px[i]+5+MaxX/2),ROUND(py[i]+5+MaxY/2));//椭圆的4个坐标点 } dc.SelectObject(OldPen); NewPen.DeleteObject(); dc.SelectObject(OldBrush); NewBrush.DeleteObject(); }
void CTestView::ParaSpline()//三次参数样条曲线 { …… lx[1]=2;ux[1]=mux[1]/lx[1];//追赶法求解x方向三弯矩方程 for(i=2;i<=n;i++) { mx[i]=lmdx[i]; lx[i]=2-mx[i]*ux[i-1]; ux[i]=mux[i]/lx[i]; } Kx[1]=Dx[1]/lx[1]; for(i=2;i<=n;i++) { Kx[i]=(Dx[i]-mx[i]*Kx[i-1])/lx[i]; } Mx[n]=Kx[n]; for(i=n-1;i>=1;i--) { Mx[i]=Kx[i]-ux[i]*Mx[i+1]; } …… }