正文描述:《VC实现贝塞尔曲线绘制.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、VC实现贝塞尔曲线绘制 摘要:本文主要通过对Bezier曲线的几何图形的进一步理解,探讨其具体的控制方法,结合具体绘制实际分析理论描述对控制点计算理解的偏差,统一了认识;结合曲线绘制函数PolyBezier()具体的要求,实现VC环境下简单的曲线绘制方法研究。 关键词:贝塞尔曲线;PolyBezier;曲线连续性 1贝塞尔曲线描述 贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度。所以本函
2、数的顶点数组的记录方式是:控制点+顶点+控制点+控制点+顶点+控制点+……。所以两个顶点之间的曲线是由两个顶点以及两个顶点之间的控制点来决定的。一条贝塞尔样条由4个定义点定义:两个端点和两个控制点。 2曲线的绘制方法 2.1PolyBezier函数 PolyBezier函数用于画贝赛尔样条曲线,原型:BOOLPolyBezier(HDC,hdc,CONSTPOINT*lppt,DWORDcPoints);参数:hdc:指定的设备环境句柄。Lppt:POINT结构数组的指针,包括了样条端点和控制点的坐标、其顺序是起点的坐标、起点的控制点的坐标、终点的控制
3、点的坐标和终点的坐标。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四个控制点方法,一般是根据两段曲线连续(即一阶连续性:两个相邻曲线段在交
4、点处有相同的一阶导数)条件来得出。总的来说,就是k0p0连线即为曲线在p0处切线,k1p1连线为p1处切线,k24p2为p2处切线,k3p3为p3处切线,两段曲线连续必然要求k1p1与k2p2在一条线上。端点处可令其倒数为0,即可算得控制点。如此在cPoints结构中会顺序存储p0,k0,k1,p1(p2),k2,k3,p3七个点,调用PolyBezier函数完成绘制曲线。 上面简单描述了包含在贝塞尔多边形内的贝塞尔曲线的控制点的推算。接下来我们以绘制经过固定点形成的多边形基础上理解经过其顶点的相似曲线(多边形的外接曲线)。根据贝塞尔曲线的定义及控制方法,
5、多边形的顶点即为曲线的端点,关键还是如何理解控制点位置的确定和计算方法,使其既满足曲线的绘制需求又能较好的切合多边形的外沿(图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
6、函数也就满足了画Bezier曲线的条件。 3程序关键代码 程序中定义了一个函数qulv()用来求得控制点,针对图3主要是求得两个控制点k0,k1,尔后得到顺序存储p0,k0,k01,p1,k1,k12,p2的cPoints结构;绘制出相应的曲线。如果是针对如图4具有更多端点的图形依此方法重新计算更新lppt结构数据。 voidCShape::qulv(intxx1,intxx2,intxx3,intyy1,intyy2,intyy3) {//根据曲线一阶连续性条件 //输入三个已知经过的点的横、纵坐标;输出两个控制点的坐标(xz,yz),(xy,y
7、y) doubled12=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;elses=-1; if(yy3>yy1)w=1;elsew=-1; if(xx3==xx1) { xz=xx2;yz=yy2-w*d12; xy=xx2;yy=yy2+w*d23; } else { k=(yy3
8、-yy1)/(xx3-xx1); xz=float
显示全部收起