摘要:本文主要通过对Bezier曲线的几何图形的进一步理解,探讨其具体的控制方法,结合具体绘制实际分析理论描述对控制点计算理解的偏差,统一了认识;结合曲线绘制函数PolyBezier()具体的要求,实现VC环境下简单的曲线绘制方法研究。关键词:贝塞尔曲线;PolyBezier;曲线连续性1贝塞尔曲线描述贝赛尔曲线的每一" />

VC实现贝塞尔曲线绘制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC实现贝塞尔曲线绘制

href="#">

摘要:本文主要通过对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 格式阅读”

相关文档
最新文档