2012-07-13 44 views
4

是否有简单的方法来近似QuadCurve2D的两个实例相交的点(如果有的话)?查找一对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:我也想能够相交的直线&二次曲线,但我认为这可以通过将其中一个控制点设置为与端点共线来处理。

+0

您已标记bezier曲线 - 这是否也需要您的曲线看起来像基本的抛物线? – mathematician1975 2012-07-13 23:41:10

+0

@ mathematician1975,是的,因为我的输入是端点+控制点 – finnw 2012-07-13 23:42:17

回答

4

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

对于确切的解决方案,您必须找到两个圆锥截面相交的四个点。关于此on wikipedia有一小段。本书Perspectives on Projective Geometry有更详细的解释细节。当然有各种语言的实现可用;刚才我想起了one for Asymptote。然而,其general case的实现看起来非常可怕,所以可能是他们在那里做了太复杂的事情。

一旦你有交集的所有四点,你仍然必须决定哪些是对你的QuadCurve的端点界定的圆锥曲线的一部分,但应该是比较简单的。因此,在总,你有以下三个步骤:

    从端点和控制点的圆锥曲线段的
  1. 计算矩阵
  2. 相交使用degenerat元素圆锥曲线在他们的铅笔
  3. 决定这些交叉点是否说谎之间端点

如果您对这些步骤之一的数学细节有问题,最好在mathematics stack exchange上询问。不仅人们在解决数学问题方面拥有更多的经验,MathJax排版数学的特点将使答案远远超出这里所希望的答案的可读性。

至于你的笔记2关于直线:这是比较容易的,因为如果你用坐标来表达这个问题,你只会得到一个二次方程,而不是等式4的方程对普通问题的幼稚方法,如果按照上述参考文献所述解决问题,仍然是3级。人们可以这样写出一般方法,即将圆锥曲线与直线相交是解决方案中的一个步骤,因此为此提供一种方法可能工作得很好。

1

实用的方法是创建两个Area s,方法是添加曲线并关闭结果。这些Area的交点应该具有所有原始交点作为某些段的端点。因此,遍历结果路径,忽略任何Bézier控制点,并且遇到每个段终点,检查它是否位于原始曲线上。

或者看看Area如何执行此操作,并查看是否可以根据需要进行调整。如果您的许可允许包含GPL2代码。

+0

有趣,但我不认为这将适用于直线情况。 – finnw 2012-07-14 13:07:31

+1

@finnw:在直线情况下,简单地关闭形状会导致空白区域,所以您可能需要添加一些额外的点,以使其成为三角形或类似形状。 – MvG 2012-07-14 20:12:45