2012-07-13 77 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