4

QuadCurve2D有没有一种简单的方法来近似两个实例相交的点(如果有的话) ?

也就是说,我如何计算该图中红点的坐标?没有明显的方法QuadCurve2D可以做到这一点。

两条二次贝塞尔曲线(蓝色),近似交点(红色)

(注意:这些点并不准确,因为我已经为图表手动调整了它们。还要注意“缺失的”第四点,即使它位于(无限)抛物线上,它也不位于曲线段上。)

这两个曲线段是使用以下代码创建的:

QuadCurve2D curve1 = new QuadCurve2D.Double(-2.00, -2.00, +0.75, +4.75, +2.00, -0.75);
QuadCurve2D curve2 = new QuadCurve2D.Double(-2.50, -0.75, +5.50, -0.50, +0.50, +1.25);

注 2:我还希望能够与直线和二次曲线相交,但我认为这可以通过将控制点之一设置为与端点共线来处理。

4

2 回答 2

4

取决于您是对近似解还是对精确解(最高双精度)感兴趣。对于近似值,您可以简单地将曲线参数化为某个函数f ( t ),然后进行一些间隔嵌套以找到t的值,从而最小化曲线之间的距离。

对于精确的解决方案,您必须找到两个圆锥截面相交的四个点。在 wikipedia 上有一个简短的段落。投影几何透视一书有一个较长的部分来解释细节。当然有各种语言可用的实现。刚才我想到了Asymptote的那个。但是,一般情况下的实现看起来非常可怕,所以可能是他们在那里做的事情过于复杂。

一旦你有了所有四个交点,你仍然需要决定它们中的哪一个位于由 QuadCurve 的端点分隔的圆锥部分,但相比之下这应该很简单。所以总的来说,你有这三个步骤:

  1. 从端点和控制点计算圆锥截面的矩阵
  2. 使用铅笔中的简并元素相交圆锥截面
  3. 确定这些交点是否位于端点之间

如果您对这些步骤之一的数学细节有疑问,最好在数学堆栈交换上询问。不仅那里的人们在解决数学问题方面有更多经验,而且用于排版数学的 MathJax 功能将使答案比这里的答案所希望的更具可读性。

至于你关于直线的注释2:到目前为止这更容易,因为如果你用坐标来表达这个问题,你只会得到一个二次方程,而不是天真的方法的4次方程一般问题,如果您按照上述参考资料的描述解决它,仍然是 3 级。可以编写通用方法,使圆锥与直线相交是解决方案中的一个步骤,因此为此提供一种方法可能会足够好。

于 2012-07-13T23:55:52.927 回答
1

一种实用的方法是Area通过添加曲线并关闭结果来创建两个 s,这些Areas 的交点应该将所有原始交点作为某些线段的端点。因此,迭代生成的路径,忽略任何 Bézier 控制点,对于遇到的每个线段端点,检查它是否位于原始曲线上。

或者看看这是如何实现的Area,看看你是否可以根据你的需要进行调整。如果您的许可允许包含 GPL2 代码。

于 2012-07-14T08:08:27.390 回答