是否有一种简单的方法来近似 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:我也希望能够与直线和二次曲线相交,但我认为这可以通过将其中一个控制点设置为与端点共线来处理。
最佳答案
取决于您是对近似解还是对精确解(最高 double )感兴趣。对于近似值,您可以简单地将曲线参数化为某个函数 f(t),然后进行一些区间嵌套以找到 t 的值最小化曲线之间的距离。
对于精确解,您必须找到两个圆锥曲线相交的四个点。关于这个有一小段on wikipedia .本书Perspectives on Projective Geometry有一个较长的部分解释细节。当然有适用于各种语言的实现; one for Asymptote我现在想到了。其 general case 的实现不过看起来很可怕,所以他们可能在那里做的事情过于复杂。
一旦您拥有所有四个交点,您仍然必须决定它们中的哪些位于由 QuadCurve 的端点分隔的圆锥曲线部分,但相比之下这应该很简单。因此,您总共需要执行以下三个步骤:
- 从端点和控制点计算圆锥截面的矩阵
- 使用铅笔中的退化元素与圆锥曲线相交
- 确定这些交点是否位于端点之间
如果您对这些步骤之一的数学细节有疑问,最好在 mathematics stack exchange 上提问.那里的人不仅有更多解决数学问题的经验,而且 MathJax 排版数学功能将使答案比这里的答案更具可读性。
关于你关于直线的注释 2:到目前为止,这更容易,因为如果你用坐标来表达这个问题,你最终只会得到一个二次方程,而不是 4 次方程对一般问题的幼稚方法,如果按照上述引用文献所述解决它,则仍然是 3 级。人们可以用这样一种方式来编写一般方法,即圆锥曲线与直线相交是解决方案中的一个步骤,因此拥有一种方法可能就足够了。
关于java - 找到一对 QuadCurve2D 的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11479664/