在分段三次Bézier路径中插入点的算法

sor*_*h-r 14 algorithm bezier vector-graphics

我正在寻找一种算法,在Bézier曲线上插入一个新的控制点,而不会变形.

有没有人知道Bézier算法的库或参考(插入,优化,de Casteljau ...)?

Phi*_*oin 22

这被称为"结插入问题".对于Bézier曲线,de Casteljau算法将为您提供正确的答案.这是3度Bézier的简单算法.

假设您想在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
Run Code Online (Sandbox Code Playgroud)

然后你的第一个Bézier定义为:P_0, P0_1, P01_12, P0112_1223; 你的第二个Bézier定义如下:P0112_1223, P12_23, P2_3, P3.

几何解释很简单:在分数处拆分Bézier多边形的每个分段t,然后在新的多边形中连接这些分割点并迭代.当您离开1点时,此点位于曲线上,前一个/下一个分割点形成前一个/下一个Bézier多边形.相同的算法也适用于更高度的Bézier曲线.

现在,如果您想要将控制点插入到特定值t但在空间中的特定位置,则会变得更加棘手.就个人而言,我在这里所做的只是二元搜索,其值t接近所需的分割点......但如果性能至关重要,您可能会找到更快的分析解决方案.

  • 为了更有效地找到最接近空间中特定位置的值t,请查看我对此问题的回复中引用的论文:http://stackoverflow.com/questions/2742610/closest-point-on-一立方贝塞尔曲线 (3认同)