使用贝塞尔曲线拟合圆

三次贝塞尔曲线非常适合用来绘制光滑连续曲线,因为只需要非常稀疏的数据集就能完整地绘制那些需要精确控制的曲线。

有些看上去很简单的曲线,例如圆,是无法用贝塞尔曲线或分段贝塞尔曲线精确描述的。可以用四段三次贝塞尔曲线模拟圆,每一段是一个四分之一圆。更一般地,我们可以用n段三次贝塞尔曲线模拟圆。

以下这个原型给出了一条一般化的样条曲线。经过拉伸、旋转、平移,四条这样的曲线就可以模拟任意圆和椭圆。


显然x0 = 0,x2 = 1,x3 = 1,而x1就是需要找出的那个magic number。根据对称性,解出x1就等于得到y2的值。将这些值代入三次贝塞尔曲线,我们马上能得到如下的方程:

x = (3x1 - 2) t+ (3 - 6x1) t2 + (3x1) t

令t=0.5时,曲线上的点落在四分之一圆的45度切点上,于是有

sin(pi/4) = 0.125(3x1 - 2) + 0.25(3 - 6x1) + 0.5(3x1)

可以直接推导出以下一些结论:

所寻找的magic number为0.55228475或,也就是内部控制点相对于外部控制点水平或垂直的的距离。每隔45度,圆上的点精确匹配。在最坏的情况下有不到千分之一的误差,在平均情况下有不到两千分之一的误差。所有的误差都是正的,曲线的点都落在圆的外部。对于多数的屏幕和打印机,千分之一的误差都已经足够的好。

很少有人意识到以上的拟合不是“最好的”。线索是所有的误差都是正的。而一个“最好的”拟合应该有较平均的正和负的误差区域。这提示我们试着减小magic number以降低曲线的弯曲程度。当减少magic number约0.000501时,发现以下这些结论:

”最好的“magic number是0.551784。每隔30度,圆上的点精确匹配。误差的峰值和平均值降低了24%。误差在正和负之间变化。

 

Reference: http://en.wikipedia.org/wiki/Bézier_curve 

posted on   江一郎  阅读(9451)  评论(1编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示