曲线上机指导_第1页
曲线上机指导_第2页
曲线上机指导_第3页
曲线上机指导_第4页
曲线上机指导_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章 曲线曲面工业设计中经常绘制各种曲线曲面,曲线分为规则曲线与不规则曲线,曲面也相应分为规则曲面和不规则曲面。规则曲线有圆锥曲线、圆柱曲线、渐开线等,这些曲线都可以用函数或参数方程表示;不规则曲线则是根据给定的离散数据点用曲线拟合逼近得到,常见的有参数样条曲线、Bezier曲线、B样条曲线等,这些曲线一般采用分段的参数方程表示。规则的曲面有柱面、锥面、球面等,可以用函数或参数方程表示;常见的不规则曲面有Bezier曲面、B样条曲面等,这些曲面采用分片的参数方程表示。本章包含了三次样条曲线,Bezier曲线和B样条曲线。实验一 二次插值样条曲线实验目的:掌握二次插值样条曲线的生成算法,掌握对

2、数学曲线采样,用折线近似显示曲线的原理。 实验要求:要求在给定插值点个数的情况下。采用二次抛物线插值方式生成曲线,为保证曲线的光滑性,采用加权合成方法。对于第一段和最后一段曲线舍弃。要求插值点用鼠标交互输入。实验原理:二次插值样条曲线主要采用抛物线插值方法生成二次样条曲线,即由给定的3个点定义一条抛物线。采样矢量表达式表示该参数化二次曲线,可以表示为: P(t)=A1+A2·t +A3·t2要确定该系数,需要三个独立的条件。设三个条件为:(1) 当参数变量t=0时,曲线经过p1点(2) 当t=1时,曲线经过p3点(3) 当t=0.5时,曲线经过p2点考虑到曲线的光滑性,可以

3、按上述条件每相邻三个点生成一段抛物线,则n个插值点可以生成n1段抛物线,对相邻两段抛物线,例如,Pi 、Pi+1 、Pi+2 、Pi+3, 由Pi 、Pi+1 、Pi+2生成的曲线段Si和由Pi+1 、Pi+2 、Pi+3生成的曲线段Si+1在Pi+1 、Pi+2 共有区间, 而两段抛物线是不可能重合的,所以要将这个区间的两段曲线进行加权合成。采用以下方程 Pi+1(t) = f(T)·Si (ti)+g(T)·Si+1 (ti+1) 其中f(T)=1-T,g(T)=T,T=2t,得到二次插值样条曲线公式: Pi+1(t)=(-4t3+4t2-t) Pi +(13t3-10

4、t2+1) Pi+1 +(-12t3+8t2+t) Pi+2 +(4t3-2t2) Pi+3实验步骤:(1) 设置插值点个数,设置采样精度(2) 鼠标交互输入插值点,并显示由插值点构成的折线(3) 根据插值点个数n生成n-3段曲线,对每一段曲线,根据采样精度对t进行离散化,计算出相应的离散点,连接相邻的离散点,用折线近似显示曲线。实验效果:程序实现:1)定义变量int m_ptN, inputN; /插值点个数和输入点个数POINT *pts; /插值点指针2)对变量进行初始化m_ptN=6; /设置插值点个数inputN=0; /初始化输入点个数pts=new POINTm_ptN; /给插

5、值点分别内存3)输入并绘制插值点折线/鼠标左键按下事件函数void CChaZhi2QuXianView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this);if(inputN<m_ptN) /获取插值点并绘制插值点折线ptsinputN=point;if(inputN>0)dc.MoveTo (ptsinputN-1); dc.LineTo(ptsinputN);inputN+;elseDr

6、awMyLine(); /调用插值曲线生成函数CView:OnLButtonDown(nFlags, point);4)生成二次插值曲线/生成二次插值曲线void CChaZhi2QuXianView:DrawMyLine()CClientDC dc(this);CPen *pOld,pen(PS_SOLID,2,RGB(255,0,0);pOld=dc.SelectObject (&pen);int x,y,i,j,k=10;double dt,t1,t2,t3 ,a,b,c,d;dt=0.5/k; dc.MoveTo (pts1);for(i=1;i<m_ptN-2;i+)

7、/处理每一段插值曲线t1=0;for(j=1;j<=k;j+)/处理每一个采样点t1=t1+dt; t2=t1*t1; t3=t2*t1;a=-4*t3+4*t2-t1; b=12*t3-10*t2+1; c=-12*t3+8*t2+t1; d=4*t3-2*t2;x=a*ptsi-1.x+b*ptsi.x+c*ptsi+1.x+d*ptsi+2.x;y=a*ptsi-1.y+b*ptsi.y+c*ptsi+1.y+d*ptsi+2.y ;dc.LineTo(x,y);dc.SelectObject (pOld);实验二Bezier曲线实验目的:掌握Bezier曲线的生成算法,掌握应用调

8、和函数生成曲线的方法,掌握3次Bezier曲线的性质。 实验要求:用鼠标交互输入控制点,绘制控制折线,生成并显示3次Bezier曲线。实验原理:Bezier曲线的形状是通过一组多边折线的各项唯一定义出来的。在该多边折线的各顶点中,只有第一点和最后一点是在曲线上,其余的顶点则用来定义曲线的导数、阶次和形状。第一条边和最后一条边则表示了曲线在起点处和终点处的切线方向,即第一条边和最后一条边分别和曲线的起点和终点相切。曲线的形状趋于控制折线的形状,改变控制点的位置和曲线的形状变化有着直观的联系。Bezier曲线是由多项式调和函数推导出来的,通常n+1个顶点定义一个n次多项式,三次Bezier曲线需要

9、四个顶点来定义。此时,调和函数分别为: B0,3(t)=-t3+3t2-3t+1B1,3(t)=3t3-6t2+3tB2,3(t)=-3t3+3t2B3,3(t)=t3实验步骤:(1) 鼠标交互输入控制点,并绘制控制折线(2) 根据采样精度对t进行离散化,根据三次Bezier曲线公式,计算出相应的离散点,连接相邻的离散点,用折线近似显示曲线。实验效果:程序实现:1)定义变量int inputN; /输入点个数POINT *pts; /控制点指针2)对变量进行初始化inputN=0; /初始化输入点个数pts=new POINT4; /给控制点分别内存3)输入并绘制控制折线void CBezie

10、rView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCClientDC dc(this);if(inputN<4) /获取控制点并绘制控制折线ptsinputN=point;if(inputN>0)dc.MoveTo (ptsinputN-1); dc.LineTo(ptsinputN);inputN+;elsemyBezierLine(); /调用Bezier曲线生成函数CView:OnLButtonDown(nFl

11、ags, point);4)生成并绘制Bezier曲线/绘制Bezier曲线void CBezierView:myBezierLine()CClientDC dc(this);CPen *pOld,pen(PS_SOLID,2,RGB(255,0,0);pOld=dc.SelectObject (&pen);int x,y,i,k=20; double dt,t1,t2,t3,a,b,c,d;dt=1.0/k; t1=0; /设置采样间距,设置t的初值dc.MoveTo (pts0); for(i=1;i<=k;i+) /计算每一个采样点并用折线近似曲线t1=t1+dt; t2=

12、t1*t1; t3=t2*t1;a=-t3+3*t2-3*t1+1; b=3*t3-6*t2+3*t1; c=-3*t3+3*t2; d=t3;x=a*pts0.x+b*pts1.x+c*pts2.x+d*pts3.x;y=a*pts0.y+b*pts1.y+c*pts2.y+d*pts3.y;dc.LineTo (x,y);dc.SelectObject (pOld);实验三 三次B样条曲线实验目的:掌握三次B样条曲线的生成算法,掌握三次B样条曲线与控制折线的几何关系。 实验要求:要求根据给定的控制点个数,用鼠标输入控制点并绘制控制折线,生成并显示由给定控制折线确定的三次B样条曲线。实验原理

13、:Bezier曲线存在着几个明显的不足,如控制点的个数决定了曲线的阶次,并且当控制点较多时,控制折线对曲线形状的控制将明显减弱,以及改变曲线的任意控制点都会影响到整个曲线的形状等问题,B样条曲线很好的解决了这些问题,并且它还具有对控制折线更逼近、多项式阶次较低等优点。通常给定m+n+1个控制点,可以定义m+1段n次的参数曲线,其公式为: 其中,Pk,n(t)为第k段n次B样条曲线段,Fi,n(t)为n次B样条基函数,也称为B样条分段混合函数,其形式为 连接全部曲线段所组成的整条曲线称为n次B样条曲线。实验步骤:(1) 设置控制点个数(2) 鼠标交互输入控制点,并绘制控制折线(3) 根据根据控制

14、点个数ptN生成ptN-3段三次B样条曲线,对每一段曲线,根据采样精度对t进行离散化,计算出相应的离散点,连接相邻的离散点,用折线近似显示曲线。实验效果:程序实现:1)定义变量int m_ptN,inputN; /控制点个数和输入点个数POINT *pts; /控制点指针2)对变量进行初始化m_ptN=8; /设置控制点个数inputN=0; /初始化输入点个数pts=new POINTm_ptN; /给控制点分别内存3)输入并绘制控制折线/鼠标左键按下事件函数void CBSplineView:OnLButtonDown(UINT nFlags, CPoint point) / TODO:

15、Add your message handler code here and/or call defaultCClientDC dc(this);if(inputN<m_ptN) /获取插值点并绘制插值点折线ptsinputN=point;if(inputN>0)dc.MoveTo (ptsinputN-1); dc.LineTo(ptsinputN);inputN+;elsemyBSpline(); /调用插值曲线生成函数CView:OnLButtonDown(nFlags, point);4)生成并绘制B样条曲线/B样条曲线函数void CBSplineView:myBSpli

16、ne()CClientDC dc(this);CPen *pOld, pen(PS_SOLID,2,RGB(255,0,0);pOld=dc.SelectObject (&pen);int x,y,m=m_ptN-3,k=20; /设置采样精度,计算曲线段个数float t1,t2,t3,a,b,c,d,dt;dt=1.0/k; /设置采样间隔for(int i=0; i<m; i+)/处理每一段曲线t1=0;for(int j=0; j<=k; j+) /对当前曲线进行采样并显示t2=t1*t1; t3=t2*t1;a=-t3+3*t2-3*t1+1; b=3*t3-6*t2+4;c=-3*t3+3*t2+3*t1+1; d=t3;a=a/6; b=b/6; c=c/6; d=d/6;x=a*ptsi.x+b*ptsi+1.x+c*ptsi+2.x+d*ptsi+3.x;y=a*ptsi.y+b*ptsi+1.y+c*ptsi+

温馨提示

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

评论

0/150

提交评论