我有两条三次贝塞尔曲线,
曲线1:- 第一个锚点(a1x,a1y),第一个控制点(c1x,c1y),第二个控制点(c2x,c2y),第二个锚点(a2x,a2y)
曲线2:- 第一个锚点(a3x,a3y),第一个控制点(c2x,c3y),第二个控制点(c4x,c4y),第二个锚点(a4x,a4y)
现在我想找到这两条贝塞尔曲线之间的交点;
怎么做?任何带有算法的参考文档都会对我有所帮助;
我有两条三次贝塞尔曲线,
曲线1:- 第一个锚点(a1x,a1y),第一个控制点(c1x,c1y),第二个控制点(c2x,c2y),第二个锚点(a2x,a2y)
曲线2:- 第一个锚点(a3x,a3y),第一个控制点(c2x,c3y),第二个控制点(c4x,c4y),第二个锚点(a4x,a4y)
现在我想找到这两条贝塞尔曲线之间的交点;
怎么做?任何带有算法的参考文档都会对我有所帮助;
找到贝塞尔曲线交点有两种主要方法:
来自《Graphics Gems IV》一书中的代码,带有一些文字描述
JS 代码和交互式演示 我认为 C++ 代码可能在Geometric Tools WildMagic 库中。
三次贝塞尔曲线只是一个三次多项式方程。如果你想找到两个三次相交的时间,那么你想找到两个三次相等的时间,即
a 1 x 3 + b 1 x 2 + c 1 x + d 1 = a 2 x 3 + b 2 x 2 + c 2 x + d 2
那么这和求三次方程的根是一样的
(a 1 - a 2 )x 3 + (b 1 - b 2 )x 2 + (c 1 - c 2 )x + (d 1 - d 2 ) = 0
像这样的三次方程可以解析求解,参见例如Cardano 的方法。或者,可以使用Newton-Raphson等方法迭代解决方案。但请注意,三次方最多可以有 3 个点等于 0。
我的建议可能不是很有效,但它可以工作。您可以尝试比较两条曲线的点之间的距离,最近的两个点将是您的交叉“点”。
如果允许某种近似,您可以将贝塞尔曲线转换为许多小直线,然后计算从两条曲线生成的它们对之间的交点。这是一个更容易解决的问题,因为您只需求解线性方程,并且可以为您的用例提供足够的性能和准确性。