如何找到两个三次贝塞尔曲线之间的交点

时间:2013-04-17 06:02:43

标签: math svg bezier line-intersection

我有两条立方贝塞尔曲线,

曲线1: - 第一个锚点(a1x,a1y),第一个控制点(c1x,c1y),第二个控制点(c2x,c2y),第二个锚点(a2x ,A2Y)

曲线2: - 第一个锚点(a3x,a3y),第一个控制点(c2x,c3y),第二个控制点(c4x,c4y),第二个锚点(a4x) ,a4y)

现在我想找到这两条贝塞尔曲线之间的交点;

怎么做? 任何带算法的参考文件都会对我有帮助;

4 个答案:

答案 0 :(得分:8)

找到贝塞尔曲线交点有两种主要方法:

  1. 递归细分利用贝塞尔曲线的凸包属性,通常检查其曲线段的边界框的交集。
  2. Code from book Graphics Gems IV with some textual description

    1. 两个三次方程组的数值解。它导致9阶的多项式方程,并且可以具有9个实根(两个S形曲线的情况)。请注意,该解决方案在数值上不稳定。
    2. JS codeinteractive demonstration 我认为C ++代码可能在Geometric Tools WildMagic库中。

答案 1 :(得分:2)

三次贝塞尔曲线只是一个三次多项式方程。如果你想找到两个立方体相交的时候,那么你想找到两个立方体相等的时候,即

a1x3 + b1x2 + c1x + d1 = a2x3 + b2x2 + c2x + d2

然后,这与找到三次方程的根

相同
(a1 - a2)x3 + (b1 - b2)x2 + (c1 - c2)x + (d1 - d2) = 0

像这样的立方方程可以通过分析方法求解,例如, Cardano's method。或者,可以使用诸如Newton–Raphson的方法来迭代到解决方案。但要注意,立方体最多可以有3个点,它们等于零。

答案 2 :(得分:0)

我的建议可能不是很有效但可行。您可以尝试比较两条曲线的点之间的距离,最近的两个点将是您的交叉“点”。

答案 3 :(得分:-1)

如果允许某种近似,则可以将贝塞尔曲线转换为许多小直线,然后计算从两条曲线生成的一对贝塞尔曲线之间的交点。这是一个更容易解决的问题,因为您只需要求解线性方程式,并可以为您的用例提供足够的性能和准确性。