java - 找到一对 QuadCurve2D 的交点

标签 java geometry java-2d bezier

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

也就是说,我如何计算图中红点的坐标? QuadCurve2D 中没有明显的方法来执行此操作。

Two quadratic Bézier curves (blue), approximate intersection points (red)

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

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

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 的端点分隔的圆锥曲线部分,但相比之下这应该很简单。因此,您总共需要执行以下三个步骤:

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

如果您对这些步骤之一的数学细节有疑问,最好在 mathematics stack exchange 上提问.那里的人不仅有更多解决数学问题的经验,而且 MathJax 排版数学功能将使答案比这里的答案更具可读性。

关于你关于直线的注释 2:到目前为止,这更容易,因为如果你用坐标来表达这个问题,你最终只会得到一个二次方程,而不是 4 次方程对一般问题的幼稚方法,如果按照上述引用文献所述解决它,则仍然是 3 级。人们可以用这样一种方式来编写一般方法,即圆锥曲线与直线相交是解决方案中的一个步骤,因此拥有一种方法可能就足够了。

关于java - 找到一对 QuadCurve2D 的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11479664/

相关文章:

java - 用于在 Java 中创建 2D 形状的高级 API

java - 如何使自定义 Alfresco AMP 操作失败?

java - 绞刑吏游戏 : stuck on randomly selecting players

algorithm - 根据椭圆与长轴或短轴的角度求出椭圆的半径

ios - 如何只用笔画画圆

c++ - 求解方程组

java - 绘制具有给定厚度、位置和半径的环。 (Java2D)

java - 任务管理器中的多个应用程序

java - JFrame 不随背景更改而更新

java - 一个简单的 Java2D 应用程序的可怕性能