[互联网]计算机图形徐教程曲线和曲面1.doc
《[互联网]计算机图形徐教程曲线和曲面1.doc》由会员分享,可在线阅读,更多相关《[互联网]计算机图形徐教程曲线和曲面1.doc(56页珍藏版)》请在三一文库上搜索。
1、曲线和曲面第一节 Hermite多项式1.1 三次Hermite多项式Hermite多项式是非常有用的曲线形式。三次Hermite多项式就是一类常用的曲线,因为它们提供了对形状的局部控制,并且提供了C1连续性。若给定参数方程f(t)在起点和终点的位置、和一阶导数、,则可以利用下式构造一个三次Hermite多项式:式中式(t)就是对于函数f(t)的Hermite插值多项式,矩阵H称为Hermite矩阵绘制三次Hermite曲线,用户必须指定位置和导数,所以必须提供针对导数的特别界面。一种方式是通过用户通过鼠标确定曲线的起点和终点的位置,并给出起点和终点的导数,即可给出三次Hermite多项式所需
2、的插值信息。1.2 Hermite曲线绘制的程序设计根据给出的三次Hermite多项式,利用逐点绘制的方法即可实现三次Hermite多项式的绘制。程序“Hermite”的设计步骤如下:(1) 创建工程名称为“Hermite”单文档应用程序框架。(2) 添加消息处理函数。利用ClassWizard(类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CHermiteView,根据表 1建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。表 1 菜单项的消息处理函数标示符ID消息消息处理函数CHermiteViewWM_LBUTTONDOWNOnLBut
3、tonDown(UINT nFlags, CPoint point);CHermiteViewWM_LBUTTONUPOnLButtonUp(UINT nFlags, CPoint point);CHermiteViewWM_MOUSEMOVEOnMouseMove(UINT nFlags, CPoint point);(3) 添加函数。在工程中添加应用函数的方法,这里先在HermiteView.h中声明需要使用的函数名称,然后再在HermiteView.cpp中定义此函数。/ HermiteView.h : interface of the CHermiteView class/const
4、int N=3;/N次Hermite曲线const int npoints=50;/由npoints+1个点构成的折线逼近Hermite曲线class Point/二维平面点Point类public:double x,y;/二维平面中的点坐标为双精度浮点小数Point()x=0;y=0;/构造函数Point(double _x,double _y)x=_x;y=_y;/构造函数Point(CPoint p)x=p.x;y=p.y;/构造函数inline Point operator =(Point p)x=p.x;y=p.y;return (*this);/Point对象的赋值运算inline
5、 Point operator =(CPoint p)x=p.x;y=p.y;return (*this);/CPoint对象的赋值运算inline Point operator +=(Point p)x+=p.x;y+=p.y;return (*this);/重载+=运算inline Point operator +=(CPoint p)x+=p.x;y+=p.y;return (*this);/重载+=运算inline Point operator -=(Point p)x-=p.x;y-=p.y;return (*this);/重载-=运算inline Point operator -=
6、(CPoint p)x-=p.x;y-=p.y;return (*this);/重载-=运算inline Point operator *=(double s)x*=s;y*=s;return (*this);/重载*=运算inline Point operator /=(double s)x/=s;y/=s;return (*this);/重载/=运算inline Point operator +(Point p)Point t;t.x=x+p.x;t.y=y+p.y;return (t);/重载+运算inline Point operator +(CPoint p)Point t;t.x=
7、x+p.x;t.y=y+p.y;return (t);/重载+运算inline Point operator -(Point p)Point t;t.x=x-p.x;t.y=y-p.y;return (t);/重载-运算inline Point operator -(CPoint p)Point t;t.x=x-p.x;t.y=y-p.y;return (t);/重载-运算inline Point operator *(double s)Point t;t.x=x*s;t.y=y*s;return (t);/重载*运算inline Point operator /(double s)Point
8、 t;t.x=x/s;t.y=y/s;return (t);/重载/运算inline operator CPoint()return CPoint(int)x,(int)y);/类型强制转换运算;class CHermiteView : public CView. .public:int m_nCount;/记录鼠标左键按下的次数CPoint m_Newpoint;/记录鼠标移动时的位置坐标Point ptControlPtsN+1;/曲线控制点坐标Point ptPtsnpoints+1;/逼近曲线的折线点坐标public:void hermite_to_points(Point CP, P
9、oint pts, int npoints);/计算Hermite曲线上各点的坐标值Point hermite(Point V, double u);/计算Hermite曲线在参数为u的坐标值. ./ Generated message map functionsprotected:/AFX_MSG(CHermiteView)afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT
10、nFlags, CPoint point);/AFX_MSGDECLARE_MESSAGE_MAP();/ HermiteView.cpp : implementation of the CHermiteView class/CHermiteView:CHermiteView()m_nCount=0;/鼠标左键按下的次数初始化为0void CHermiteView:OnLButtonDown(UINT nFlags, CPoint point) ptControlPtsm_nCount=point;/保存鼠标左键按下的当前位置m_Newpoint=point;/存放画线的起始位置m_nCoun
11、t=(+m_nCount)%(N+1);/记录鼠标左键按下的次数,次数=N+1时,归零CView:OnLButtonDown(nFlags, point);void CHermiteView:OnLButtonUp(UINT nFlags, CPoint point) int i;if(m_nCount=0)/m_nCount为0时,说明鼠标左键按下的次数为N+1的整数倍,绘制曲线CClientDC dc(this);CPen pen,*oldpen;pen.CreatePen (PS_SOLID,1,RGB(255,0,0);/创建红色实线画笔,线宽为1oldpen=dc.SelectObj
12、ect (&pen);/选择新画笔hermite_to_points(ptControlPts, ptPts, npoints);/当控制点的个数满足要求时,计算Hermite曲线上各点位置dc.MoveTo (ptPts0);/将Hermite曲线上各点位置相连,绘制Hermite曲线for(i=1;i0&m_nCount=N&m_nCount%2=1)/绘制曲线起点和终点的切向量CClientDC dc(this);dc.SetROP2(R2_NOT); /设置绘图模式,以屏幕颜色的相反色绘图 /以重绘的方式擦除前一个OnMouseMove绘制的直线dc.MoveTo(CPoint)ptC
13、ontrolPtsm_nCount-1);/擦除前面刚绘制的一条直线dc.LineTo(m_Newpoint);dc.MoveTo(CPoint)ptControlPtsm_nCount-1);/从起始位置到当前位置绘制一条新的直线dc.LineTo(point);m_Newpoint=point; /存放当前鼠标位置CView:OnLButtonUp(nFlags, point);/输入参数CP为控制点坐标/控制点CP的个数为N+1/输出参数为Hermite曲线上的离散点序列pts/离散点pts的个数为npoints+1void CHermiteView:hermite_to_points(
14、Point CP, Point pts, int npoints)double u,delt;Point PN+1,VN+1;delt=1/(double)(npoints);/将参数u变化区间进行npoints等分u=0;/Hermite矩阵与控制点坐标相乘,得到VP0 = CP0;P1 = CP2;P2 = CP1 - CP0;P3 = CP3 - CP2;V0 = P0 * 2 - P1 * 2 + P2 + P3;V1 = P0 * (-3) + P1 * 3 - P2 * 2 - P3;V2 = P2;V3 = P0;for(int i=0;i=0;i-)Ui = Ui+1 * u;
15、 /形成多项式中的各项pts += Vi * Ui; /与系数矩阵V相乘,并与前面得到的多项式值相累加return pts;Hermite曲线绘制的运行结果如图 1所示。图中的直线为起点和终点的切向量,曲线为相应的Hermite曲线。图 1 Hermite曲线绘制的运行结果第二节 Coons曲面2.1 Coons双三次曲面片Hermite多项式处理曲线的方法可以加以推广,用以处理曲面,即若给定参数曲面在四个角点处的位置向量、切向量、跨界切向量和扭曲向量,则利用张量积方法对Hermite多项式在二维曲面上加以扩展,即可给出Coons曲面的表达式,构造Coons曲面片。对于二维曲面P(u,w),指
16、定四个角点的位置向量P(0,0),P(0,1),P(1,0),P(1,1),以及在这些点上的切向量P w(0,0),P w(0,1),P w(1,0),P w(1,1),P u(0,0),P u(0,1),P u(1,0),P u(1,1)和扭曲向量P uw(00),P uw(0,1),P uw(1,0),P uw(1,1),然后,通过Hermite插值计算出边界曲线和跨界切向量,再采用张量积方法来构造曲面片,得到:式中矩阵H为Hermite矩阵,M是关于角点的信息矩阵,HT是H的转置,0u1,0w1。不难看出,式中的Hermite矩阵H定义了边界切向量所用的混合函数。此时曲面片完全由四边形域
17、角点信息矩阵所确定。这种类型的曲面片由三次Hermite基来张成,称之为张量积曲面片。又因固定u或w时对w或u而言是三次,因而它被称为Coons双三次曲面片。式可用于定义双三次的参数曲面片。这种方法有广泛的应用,但也有不足之处,主要是要求事先给出的信息较多。位置向量、切向量和跨界切向量几何意义清楚。但是,插值角点处的扭曲向量很难指定并缺乏直观含义,使数据调整比较困难。用多个这样的曲面片拼接形成大的曲面时,彼此拼接的两个曲面片的信息矩阵要满足一定的约束条件。可以证明,在曲面拼接时,只要具有相同的角点信息,就能保证曲面拼接的结果达C2连续。2.2 Coons曲面绘制的程序设计下面给出了构造双三次C
18、oons曲面的主要的程序代码和注释。在该例子中,观察点设为(-10,-10,10),投影平面与原点间的距离设为5。绘制Coons曲面时,程序预先给出Coons曲面的四个角点以及在该角点上的切向量和扭曲向量。设在平面上有四点,其位置向量分别为(0,0,0),(0,0.75,0),(0.75,0,0),(0.75,0.75,0)。该四点的位置向量、切向量、跨界切向量和扭曲向量,定义在角点的信息矩阵M中,这些信息在视图类的构造函数中被初始化:程序“Coons”的设计步骤如下:(1) 创建工程名称为“Coons”单文档应用程序框架。(2) 添加函数。在工程中添加应用函数的方法,这里先在CoonsVie
19、w.h中声明需要使用的函数名称,然后再在CoonsView.cpp中定义此函数。/ CoonsView.h : interface of the CCoonsView class/const int N=3;/双3次Coons曲面const int npoints=50;/由(npoints+1)*(npoints+1)个点构成的网格逼近Coons曲面class Point3D/三维空间点Point3D类public:double x,y,z;/三维空间中的点坐标为双精度浮点小数Point3D()x=0;y=0;z=0;/构造函数Point3D(double _x,double _y,doub
20、le _z)x=_x;y=_y;z=_z;/构造函数Point3D(double s)x=s;y=s;z=s;/构造函数Point3D operator =(Point3D p)x=p.x;y=p.y;z=p.z;return (*this);/Point3D对象的赋值运算Point3D operator +=(Point3D p)x+=p.x;y+=p.y;z+=p.z;return (*this);/重载+=运算Point3D operator -=(Point3D p)x-=p.x;y-=p.y;z-=p.z;return (*this);/重载-=运算Point3D operator
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 互联网 计算机 图形 教程 曲线 曲面
链接地址:https://www.31doc.com/p-1967128.html