贝塞尔曲线(5)

2019-08-31 17:26

图片如下:

■ 对齐节点

有些时候,绘制的曲线节点可能需要处于同一水平线或同一垂直线上,此时“对齐节点”的功能就可以排上用场了:选取要进行水平或垂直对齐的节点(必须两个以上),按下属性栏中的“对齐节点”按钮,此时会弹出一个对话框,询问要进行那一种的对齐方式,如图33。 图片如下:

“水平对齐”会将选取的多个节点对齐到同一水平线;“垂直对齐”则将选取的多个节点对齐到同一垂直线;“对齐控制点”会以控制点为基准进行对齐。如图34,是将节点进行水平对齐的操作结果。 图片如下:

不管采用何种对齐方式,在对齐节点的过程中,都是以最后选取的节点为对

齐依附点,先选取的节点会向最后选取的节点进行对齐。

如果在弹出的对话框中将“水平对齐”和“垂直对齐”同时勾选,所有选取的节点将会对齐到最后被选取的节点上。

以上对曲线的编辑,都是使用“形状工具”完成,如果不太熟悉上面内容中所说的各操作所用的功能按钮在哪里,可以在调用“形状工具”时,将鼠标移动到属性栏某个按钮上稍作停留,屏幕上即会出现该按钮的工具名称提示。

<三>

VC贝塞尔曲线的绘制

通过对Bezier曲线的几何图形的进一步理解,探讨其具体的控制方法,结合具体绘制实际分析理论描述对控制点计算理解的偏差,统一了认识;结合曲线绘制函数PolyBezier()具体的要求,实现VC环境下简单的曲线绘制方法研究。

关键词:贝塞尔曲线;PolyBezier;曲线连续性

1贝塞尔曲线描述

贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度。所以本函数的顶点数组的记录方式是:控制点+顶点+控制点+控制点+顶点+控制点+……。所以两个顶点之间的曲线是由两个顶点以及两个顶点之间的控制点来决定的。一条贝塞尔样条由4个定义点定义:两个端点和两个控制点。

2曲线的绘制方法 2.1PolyBezier函数

PolyBezier函数用于画贝赛尔样条曲线,原型:BOOL PolyBezier(HDC,hdc,CONST POINT *lppt,DWORD cPoints);参数:hdc:指定的设备环境句柄。Lppt:POINT结构数组的指针,包括了样条端点和控制点的坐标、其顺序是起点的坐标、起点的控制点的坐标、终点的控制点的坐标和终点的坐标。cPoints:指明数组中的点的个数。本文中绘制曲线主要用到这个函数。 2.2一阶连续性

图1所示为一段Bezier曲线经过p0、p1两个端点,要绘制经过它们的曲线需要再确定k1、K2两个控制点,这条曲线最终是由p0、k1、k2、p1四个点决定。图2为经过p0、p1(p2)、p3的一段连续曲线,可以看出,它是由p0-p1及p2-p3两段曲线组成,连续的贝塞尔曲线会把前一个终止点当作起始点:即p1=p2。

要绘制如图2所示曲线,关键在于确定k0、k1、k2、k3四个控制点方法,一般是根据两段曲线连续(即一阶连续性:两个相邻曲线段在交点处有相同的一阶导数)条件来得出。总的来说,就是k0p0 连线即为曲线在p0处切线,k1p1连线为p1处切线,k24p2为p2处切线,k3p3为p3处切线,两段曲线连续必然要求k1p1与k2p2在一条线上。端点处可令其倒数为0,即可算得控制点。如此在cPoints结构中会顺序存储p0,k0,k1,p1 (p2),k2,k3,p3七个点,调用PolyBezier函数完成绘制曲线。

上面简单描述了包含在贝塞尔多边形内的贝塞尔曲线的控制点的推算。接下来我们以绘制经过固定点形成的多边形基础上理解经过其顶点的相似曲线(多边形的外接曲线)。根据贝塞尔曲线的定义及控制方法,多边形的顶点即为曲线的端点,关键还是如何理解控制点位置的确定和计算方法,使其既满足曲线的绘制需求又能较好的切合多边形的外沿(图4)。 Bezier曲线 Bezier曲线

图3所示为用鼠标选取p0,p1,p2三个点,通过上面的方法绘制的Bezier曲线。比较图2和图3,都是绘制经过p0、p1、p2三个点的曲线,图3相比图2少2个控制点,实际上是一样的,起点控制点和终点控制点都和各自的起始端点是重合一致的。如此在cPoints 结构中会顺序存储p0,p0,k01,p1,k1,p2,p2七个点,把这几个点连接起来就是这条曲线的贝塞尔多边形,代入PolyBezier函数也就满足了画Bezier曲线的条

件。

3程序关键代码

程序中定义了一个函数qulv()用来求得控制点,针对图3主要是求得两个控制点k0,k1,尔后得到顺序存储p0,k0,k01,p1,k1,k12,p2的cPoints结构;绘制出相应的曲线。如果是针对如图4具有更多端点的图形依此方法重新计算更新lppt结构数据。

void CShape::qulv(int xx1, int xx2, int xx3, int yy1, int yy2, int yy3) { //根据曲线一阶连续性条件

//输入三个已知经过的点的横、纵坐标;输出两个控制点的坐标(xz,yz),(xy,yy) double d12=0.0, d23=0, s=0, w=0, k=0;

d12=0.25*sqrt((xx2-xx1)*(xx2-xx1)+(yy2- y1)*(yy2-yy1)); d23=0.25*sqrt((xx3-xx2)*(xx3-xx2)+(yy3-yy2)*(yy3-yy2)); if(xx3>xx1) s=1;else s=-1; if(yy3>yy1) w=1; else w=-1; if(xx3==xx1) {

xz=xx2;yz=yy2-w * d12; xy=xx2;yy=yy2+w * d23; } else {

k=(yy3-yy1)/(xx3-xx1);

xz= float(xx2)-s*(d12/sqrt(1+k*k)); yz=float(yy2)-s*(k*d12/sqrt(1+k*k)); xy=float(xx2)+s*(d23/sqrt(1+k*k)); yy=float(yy2)+s*(k*d23/sqrt(1+k*k)); } } 4总结

Bezier 曲线是计算机图形学中最基本、最重要的内容。在实际应用中, 可以进一步研究曲线的拼接方法、连续性、拟合等,比较它与其它B样条曲线、双曲线等的区别,进一步发掘它的实用价值并推广到曲面的绘制、拼接研究。

参考文献:

[1] 施法中.计算机辅助几何设计与非均匀有理B 样条[M].北京:北京航空大学出版社,1994.

[2] 严兰兰,宋来忠,李军成.有理Bezier曲线的拼接[J].三峡大学学报(自然科学版),2005,27(5):469-471.

注:“本文中所涉及到的图表、公式、注解等请以PDF格式阅读”


贝塞尔曲线(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:城市规划复习总结

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: