自由曲线的几何设计_第1页
自由曲线的几何设计_第2页
自由曲线的几何设计_第3页
自由曲线的几何设计_第4页
全文预览已结束

下载本文档

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

文档简介

1、自由曲线的几何设计一、 实验要求1、 自由曲线包括:二次、三次、N次Bezier曲线,二次、三次均匀B样条曲线;2、 Bezier曲线的实现算法要求选用细分算法;3、 均匀B样条曲线过控制多边形的首末顶点;4、 利用B样条曲线的局部控制性来动态修改曲线形状;5、 界面设计友好、几何直观。二、 实验环境说明Windows xp,Microsoft Visual C+ 6.0中的MFC AppWizard(exe)下实现的三、 算法与数据结构(程序设计)1) 前期的处理1) 建立一个Class Node的类,包含两个私有成员,分别为POINT value和Node* next。2) 再建立一个Cl

2、ass Queue的类,即一个队列,具有入队EnQueue(POINT x),出队DeQueue(POINT &x)等功能。3) 将用户输入的n个点按顺序存储在pt数组中。2) n次Bezier曲线1) 绘制n次Bezier曲线,我采用的是队列的数据结构,因为队列具有先进先出的特点,在对各个点进行处理时会比较方便。2) 建立一个队列CQueue Q,将pt按下标从0(n-1)依次入队列。3) 定义一个布尔变量bool ok=false; 用来判断是否是第一条线的中点,如果不是,就不要重复将中点入队,否则画出的曲线是错误的,这步很关键,特别当n>=3时4) 首结点调到队列尾部,并且

3、标示为第一条边(即ok=true)5) 以下是对队列中符合要求的结点(除首/尾结点外)进行取中点处理a) 取出此时队列的首节点存入now中b) 当前结点的后继结点放入later=Q.First()c) 当前节点的前继节点放入formar=Q.Last()中d) 如果处理的是第一条边的中点,即ok=true则M=middle(formar,now),并将中点入队。e) 如果ok=false 则N=middle(now,later),S=middle(M,N) 将S入队,再将N入队。并且将N的值赋给M,以便处理队列中的下一个节点。f) 将ok设置成非第一条边的状态,即为false;g) 如果此时队

4、首的节点不是本轮节点中的最后一个,则转步骤a)h) 如果此时队首的节点是本轮节点中的最后一个,则就不需再对它进行取中点处理,直接取出插入到队列的尾部6) 一轮循环结束后,再转步骤5)进行处理,这样的循环总共进行6次就可以画出不错的Bezier曲线了。循环的次数如果再增加,绘出的图的效果也不会有非常明显的改观,但是运行的速度会慢很多。数量级为2的n次方。7) 将队列中的点取出,将它们顺序连起来,即画线。8) 结束。3) 2次均匀B样条曲线1. 用户输入的节点的个数记录在ptNum中,每次取出其中的3个点进行处理,即每3个点绘一条曲线。2. 如果取出的3个点中包含用户输入的第一个节点,则利用它与用

5、户输入的第二个点的矢量关系,反向求出“虚拟”的第一个节点(其中用户输入的第一个节点为“虚拟节点”和用户输入的第二个节点的中点,且从该中点向左右两个节点的矢量方向刚好为180度)。3. 如果取出的3个节点中包含用户输入的最后一个节点,处理的过程和上一步是类似的,只是利用的是用户输入的倒数第二个节点。4. 此时“虚拟”节点处理完毕,这样做是为了实现“实验要求”中的第3点,即均匀B样条曲线过控制多边形的首末顶点。5. 以下步骤是计算31个点,记录到数组POINT vaue中:1) 定义一个double t,B3用来存放计算每个点的"系数",t=(double)k/30; B0=(

6、1-t)*(1-t)/2; B1=(1-t*t)/2+t*(2-t)/2; B2=(t*t)/2;2) 定义double xx=(double)(P0.x*B0+P1.x*B1+P2.x*B2);double yy=(double)(P0.y*B0+P1.y*B1+P2.y*B2);vauek.x=(long int)xx; vauek.y=(long int)yy 定义成double型在转换成long int 型的目的是为了使绘制出的曲线更加的均匀。3) 如此一个绘图节点计算完毕,进行下一个绘图节点的处理,转步骤1)。6计算出31个绘图节点后,在利用它们进行绘图。7每次处理的3个节点,都可以

7、利用上一轮中的最后一个节点,再增加2个节点,构成新的3个节点,转步骤5),剩余一个节点或者没有剩余节点。4) 3次均匀B样条曲线大致的步骤和处理2次均匀B样条曲线是一样的。只是要改成B4,即B0=(1-t)*(1-t)*(1-t)/6; B1=(3*t*t*t-6*t*t+4)/6; B2=(-3*t*t*t+3*t*t+3*t+1)/6;B3=(t*t*t)/6。其它的步骤只是将每3个节点处理一次改成每4个节点处理一次。四、 实现功能说明(包括操作说明)Ø 可在“绘图区”绘点,相应的坐标会显示在“控制点坐标”中Ø 选中“复选框”,会在“绘图区”中形成相应的曲线,并且用不同的颜色区分不同的曲线Ø “删除定点”按钮,可删除最近增加的一个顶点,并且在“控制点坐标”中清除相应的点的坐标

温馨提示

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

评论

0/150

提交评论