是否有一种简单的方法来逼近QuadCurve2D
的两个实例相交的点(如果有的话)?
也就是说,如何计算此图中红点的坐标? QuadCurve2D
中没有明显的方法可以做到这一点。
(注意:这些点并不准确,因为我已经手动为图表调整了它们。还要注意“缺失”的第四个点,它不在曲线段上,即使它位于(无限)抛物线上。)< / p>
使用以下代码创建这两个曲线段:
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 :(得分:4)
取决于您是否对近似或精确解决方案感兴趣(最高可达双精度)。对于近似值,您可以简单地将曲线参数化为某些函数 f ( t ),然后进行一些区间嵌套以查找 t 的值。最小化曲线之间的距离。
对于精确解,您必须找到两个圆锥截面相交的四个点。关于这个on wikipedia有一个简短的段落。这本书Perspectives on Projective Geometry有一个较长的部分来解释细节。当然有各种语言的实现可用;刚刚出现one for Asymptote。但general case的实现看起来非常可怕,所以可能是他们在那里做了一些过于复杂的事情。
一旦你有了所有四个交点,你仍然需要决定哪一个是由QuadCurve端点划分的圆锥曲线部分,但这应该比较简单。所以总的来说,你有三个步骤:
如果您对其中一个步骤的数学详细信息有疑问,最好在mathematics stack exchange上询问。不仅让人们有更多解决数学问题的经验,排版数学的MathJax功能将使答案远比这里的答案更具可读性。
关于你的关于直线的注释2:到目前为止这更容易,因为如果你用坐标来表达那个问题,你只会得到一个二次方程,而不是一个4阶方程。一般问题的天真方法,如果按照上述参考文献的描述解决它,仍然是3级。人们可以用一种方式来编写一般方法,即将圆锥与线相交是解决方案中的一个步骤,因此有一个方法可以很好地工作。
答案 1 :(得分:1)
实用的方法是通过添加曲线并关闭结果来创建两个Area
,这些Area
的交集应该将所有原始交点作为某些段的端点。因此,迭代结果路径,忽略任何Bézier控制点,并且对于遇到的每个段终点,检查它是否位于原始曲线上。
或者查看Area
如何执行此操作,并了解您是否可以根据自己的需要进行调整。如果您的许可允许包含GPL2代码。