首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段三次Bézier路径上的插点算法

分段三次Bézier路径上的插点算法
EN

Stack Overflow用户
提问于 2010-04-10 22:57:57
回答 3查看 5K关注 0票数 14

我正在寻找一种算法,在贝塞尔曲线上插入一个新的控制点,而不变形。

有谁知道贝塞尔算法的库或参考资料(插入、优化、de Casteljau ...)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-11 00:16:33

这被称为“节点插入问题”。对于Bézier曲线,de Casteljau算法将给出正确的答案。这是3次贝塞尔曲线的简单算法。

假设您想要在P0, P1, P2, P3定义的贝塞尔曲线内参数空间的分数t处插入一个结。下面是你要做的:

代码语言:javascript
复制
P0_1 = (1-t)*P0 + t*P1
P1_2 = (1-t)*P1 + t*P2
P2_3 = (1-t)*P2 + t*P3

P01_12 = (1-t)*P0_1 + t*P1_2
P12_23 = (1-t)*P1_2 + t*P2_3

P0112_1223 = (1-t)*P01_12 + t*P12_23

然后,您的第一个贝塞尔曲线将由:P_0, P0_1, P01_12, P0112_1223定义;第二个贝塞尔曲线将由:P0112_1223, P12_23, P2_3, P3定义。

几何解释很简单:以分数t分割Bézier多边形的每一段,然后将这些分割点连接到一个新多边形中并迭代。当剩下1个点时,该点位于曲线上,上一个/下一个分割点形成上一个/下一个贝塞尔多边形。同样的算法也适用于高次Bézier曲线。

现在,如果您希望在空间中的特定位置而不是在t的特定值处插入控制点,则可能会变得更加棘手。就我个人而言,我在这里所做的只是一个简单的二进制搜索,寻找一个接近所需分割点的t值……但如果性能很关键,您可能会找到一个更快的分析解决方案。

票数 23
EN

Stack Overflow用户

发布于 2014-11-06 09:08:48

你也可以采用数学方法。

带控制点的二次Bézier曲线

可以写成:

它的导数w.r.t.

从以下位置限制曲线

,您将获得新的控制点

证明

替换

我们会得到

子曲线的第一个和最后一个点是第一个和最后一个新控制点。

在这些点上的切线是

所以

票数 2
EN

Stack Overflow用户

发布于 2015-03-16 16:10:59

添加这个是为了完整性。

gimpbezierstroke.cGIMP源代码中可以找到许多贝塞尔曲线路径操作的开源实现。有关插入新锚点的参考信息,请搜索gimp_bezier_stroke_anchor_insert

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2613788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档