我在計算鼠標位置的二次曲線上的最近點時出現了一些問題。我已經嘗試了一些API,但是沒有任何運氣能夠找到適用於此的函數。我發現了一個適用於5度立方貝塞爾曲線的實現,但我沒有數學技能將其轉換爲二次曲線。我發現了一些方法可以幫助我解決問題,如果我有一個t值,但我不知道如何開始找到t。如果有人能指出我找到t的算法,或者找到一個二次曲線上任意點的最近點的代碼示例,我將非常感激。二次貝塞爾曲線上的最近點
由於
我在計算鼠標位置的二次曲線上的最近點時出現了一些問題。我已經嘗試了一些API,但是沒有任何運氣能夠找到適用於此的函數。我發現了一個適用於5度立方貝塞爾曲線的實現,但我沒有數學技能將其轉換爲二次曲線。我發現了一些方法可以幫助我解決問題,如果我有一個t值,但我不知道如何開始找到t。如果有人能指出我找到t的算法,或者找到一個二次曲線上任意點的最近點的代碼示例,我將非常感激。二次貝塞爾曲線上的最近點
由於
我可以讓你開始數學。 我不知道貝塞爾是如何定義的二次,但它必須是相當於 到:
(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 = 0
和t = 1
處計算到(X,Y)(第一個方程)的距離值,並取兩者的最小距離。
編輯:
其實,當你解決了一階導數= 0,你得到的解決方案可以最大距離以及最小。所以你應該計算你得到的解決方案的距離(第一個方程)(最多3個值爲t
),以及距離爲t=0
和t=1
,並選擇所有這些值的實際最小值。
數學是一個很大的幫助,謝謝你的提示。我想出了我的問題。 – matt
啞,幼稚的方法是通過在曲線上的每個點進行迭代,並計算該點和鼠標位置之間的距離,與所述最小的一個作爲贏家。根據您的應用,您可能需要使用比這更好的東西。
曲線上的每個點?如何做到這一點? –
如果曲線是從已知的座標列表生成的。如果不是,那麼需要另一種解決方案。 –
這是一條貝塞爾曲線;所以座標只提供控制點,而不提供曲線上的點。 –
最有可能的是,您發現的第5度曲線的實現也可以在沒有任何修改的情況下在二次曲線上起作用。 – toto2