2

我有两条三次贝塞尔曲线,

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

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

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

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

4

4 回答 4

9

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

  1. 递归细分利用贝塞尔曲线的凸包特性,通常检查其曲线段边界框的交点。

来自《Graphics Gems IV》一书中的代码,带有一些文字描述

  1. 两个三次方程组的数值解。它导致一个 9 阶多项式方程,并且可能有 9 个实根(两条 S 形曲线的情况)。请注意,该解在数值上是不稳定的。

JS 代码交互式演示 我认为 C++ 代码可能在Geometric Tools WildMagic 库中。

于 2013-04-17T11:01:20.843 回答
2

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

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。

于 2013-04-17T06:53:54.120 回答
0

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

于 2013-04-17T10:43:39.183 回答
-1

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

于 2019-01-31T14:33:02.040 回答