我正在寻找一种算法,在Bézier曲线上插入一个新的控制点,而不会变形。
有人知道Bézier算法的库或参考(插入,优化,de Casteljau ......)?
答案 0 :(得分:22)
这称为“结插入问题”。对于Bézier曲线,de Casteljau算法将为您提供正确的答案。这是3度贝塞尔的简单算法。
假设您要在由t
定义的Bézier曲线内的参数空间的分数P0, P1, P2, P3
处插入一个结。这是你做的:
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
然后你的第一个Bézier将被定义为:P_0, P0_1, P01_12, P0112_1223
;你的第二个Bézier定义为:P0112_1223, P12_23, P2_3, P3
。
几何解释很简单:在分数t
处分割Bézier多边形的每个分段,然后将这些分割点连接到一个新的多边形并迭代。当您离开1点时,此点位于曲线上,前一个/下一个分割点形成前一个/下一个Bézier多边形。相同的算法也适用于更高度的Bézier曲线。
现在,如果您想要将控制点插入到t
的特定值但是在空间中的特定位置,则会变得更加棘手。就个人而言,我在这里做的只是二进制搜索t
的值接近所需的分裂点...但如果性能至关重要,你可能会找到一个更快的分析解决方案。
答案 1 :(得分:2)
您也可以采用数学方法。
具有控制点的qubicBézier曲线可写为:
其衍生物w.r.t. 是
要将曲线从限制为,您将获得新的控制点:
代
我们得到了
子曲线的第一个和最后一个点是第一个和最后一个新控制点
这些点的切线是
所以
答案 2 :(得分:1)
为完整性添加此内容。
可以在GIMP内的gimpbezierstroke.c
源代码中找到许多Bézier路径操作的开源实现。有关插入新锚点的参考,请搜索gimp_bezier_stroke_anchor_insert
。