4点了,睡不着,今天终于把这个遗忘已久的算法搞定了,哈哈,真是山穷水尽疑无路,柳暗花明又一村啊!!
贝塞尔曲线相信大家一定不会陌生,从最古老的Windows 3.1开始至今,它一直是系统的默认屏保。其实这个屏保就是由许许多多的点经过贝塞
尔函数的运算连接而成的,贝塞尔函数由德国数学家F.W.Bezier在1824年首次发表,广泛应用于建筑、工业设计和计算机图形学等等等等方面
。好了闲话少说,今天说一个比较简单的应用:二维坐标曲线的圆滑处理。
如果要纯粹使用算法手动搭建一个贝塞尔曲线,是相当困难的,这里面设计许多数学问题,贝塞尔函数本身并不复杂,可将它实际应用起来却
需要衍生一大堆的概念!所幸的是微软自Windows 98开始提供了一个API函数:PolyBezier,经由这个函数,我们可以相对简单地绘制贝塞尔曲
线。
1. 基本概念
一条最简单贝塞尔曲线由4个点构成,分别是:起始点、控制点1、控制点2、结束点。其中控制点并不显示,它只起到控制曲线走向的作用,但
如何选取控制点,却是整个贝塞尔曲线绘制的关键所在。控制点的选取可以通过许多算法来实现,常见的有德卡斯特里奥算法等,今天介绍这
个方法就是以这个算法为基础的简化版本(三次贝塞尔插值法),这个算法因为计算量不大,所以效率很高哦!
2. 实战演习
http://stoneren.com/rockage/bezier/s0.jpg
2.1 首先在屏幕上置三个点P0 P1 P2
http://stoneren.com/rockage/bezier/s1.jpg
2.2 将P0,P1,P2相连,其中P2-P0为辅助线(红色)
http://stoneren.com/rockage/bezier/s2.jpg
2.3 求出各线段的中点B0 B1 B2
http://stoneren.com/rockage/bezier/s3.jpg
2.4 再将B0 B1 B2依次相连
http://stoneren.com/rockage/bezier/s4.jpg
2.5 按照比例确定K点K0,K1,K2
比例关系是:(P2-P0):(P0-P1) = (B2-K0):(K0-B0)
http://stoneren.com/rockage/bezier/s5.jpg
2.6 坐标平移,K0平移至P0,K1平移至P1,K2平移至P2,得到6个控制点C0至C5
http://stoneren.com/rockage/bezier/s6.jpg
2.7 利用PolyBezier函数绘制贝塞尔曲线,以P0-P1为例,其中:
起始点:P0
控制点1:C1
控制点2:C2
结束点:P1
用同样的方法连接P1-P2
http://stoneren.com/rockage/bezier/s7.jpg
2.8 让我们换一个坐标,让“曲线”的感觉来得更强烈些吧!
3. 实战效果
http://stoneren.com/rockage/bezier/before.jpg
3.1 未使用圆滑处理前的曲线
http://stoneren.com/rockage/bezier/after.jpg
3.2 采用本方案圆滑后的曲线