2011-07-26 60 views
3

我在計算鼠標位置的二次曲線上的最近點時出現了一些問題。我已經嘗試了一些API,但是沒有任何運氣能夠找到適用於此的函數。我發現了一個適用於5度立方貝塞爾曲線的實現,但我沒有數學技能將其轉換爲二次曲線。我發現了一些方法可以幫助我解決問題,如果我有一個t值,但我不知道如何開始找到t。如果有人能指出我找到t的算法,或者找到一個二次曲線上任意點的最近點的代碼示例,我將非常感激。二次貝塞爾曲線上的最近點

由於

+0

最有可能的是,您發現的第5度曲線的實現也可以在沒有任何修改的情況下在二次曲線上起作用。 – toto2

回答

1

我可以讓你開始數學。 我不知道貝塞爾是如何定義的二次,但它必須是相當於 到:

(x(t), y(t)) = (a_x + b_x t + c_x t^2, a_y + b_y t + c_y t^2), 

其中0 < t < 1。 a,b,c是定義曲線的6個常量。

你想(X,Y)的距離:

sqrt((X - x(t))^2 + (Y - y(t))^2 ) 

由於要查找t最小化上述量,則取其 一階導數相對於t並設置等於0。 這給你(滴下SQRT和2的因子):

0 = (a_x - X + b_x t + c_x t^2) (b_x + 2 c-x t) + (a_y - Y + b_y t + c_y t^2) (b_y + 2 c_y t) 

這在t三次方程。分析解決方案是已知的,你可以在網上找到它;你可能需要做一點代數來得到t的冪的係數(即0 = a + b t + c t^2 + d t^3)。你也可以用數字來解決這個方程,例如用Newton-Raphson。

但請注意,如果3個解決方案中沒有一個可能在您的範圍內0 < t < 1。在這種情況下,只需在t = 0t = 1處計算到(X,Y)(第一個方程)的距離值,並取兩者的最小距離。

編輯
其實,當你解決了一階導數= 0,你得到的解決方案可以最大距離以及最小。所以你應該計算你得到的解決方案的距離(第一個方程)(最多3個值爲t),以及距離爲t=0t=1,並選擇所有這些值的實際最小值。

+0

數學是一個很大的幫助,謝謝你的提示。我想出了我的問題。 – matt

-1

啞,幼稚的方法是通過在曲線上的每個點進行迭代,並計算該點和鼠標位置之間的距離,與所述最小的一個作爲贏家。根據您的應用,您可能需要使用比這更好的東西。

+1

曲線上的每個點?如何做到這一點? –

+0

如果曲線是從已知的座標列表生成的。如果不是,那麼需要另一種解決方案。 –

+1

這是一條貝塞爾曲線;所以座標只提供控制點,而不提供曲線上的點。 –

0

有一個ActionScript實現可以很容易地適應在線可用的Java here

它來源於書籍「Graphics Gems」中的算法,您可以在Google Books here上仔細閱讀。