2010-07-13 67 views
3

好吧,解決立方找到曲線上最近點一個點

我已經定義了具有其位置拋射使得:

a.x = initialX + initialDX * time; 

a.y = initialY + initialDY * time + 0.5 * gravtiy * time^2; 

我希望能夠預測哪些障礙在我的環境中,這個彈丸會與之相撞。我計劃檢查距離曲線上最近的點A到點P的距離。

我圖在點的切線曲線將垂直於矢量AP,並且所述切向曲線在將簡單地是速度的拋射物的V在那時候。

APV = 0

ap.x = initialX + initialDX * time - p.x; 

ap.y = initialY + initialDY * time + gravity * time^2 - p.y; 

v.x = initialDX; 

v.y = initialDY + gravity * time; 

=>

APV =

(0.5 * gravity^2) * t^3 + 

(1.5 * gravity * initialDY ) * t^2 + 

(initialDX^2 + initialDY^2 + gravity * (initialY - p.y)) * t + 

(initialDX * (initialX - p.x) + initialDY * (initialY - p.y)) 

在這裏,我可以看到,這是一個三次函數。我花了一些時間在網上進行研究,發現有一個通用的方程式,似乎可以用於查找根源的某些值。

這是我試圖實現的過程。 http://www.sosmath.com/algebra/factor/fac11/fac11.html

a = 0.5 * gravity^2; 

b = 1.5 * gravity * initialDY; 

c = initialDX^2 + initialDY^2 + gravity * (initialY - p.y); 

d = initialDX * (initialX - p.x) + initialDY * (initialY - p.y); 

A = (c - (b * b)/(3 * a))/a; 

B = -(d + (2 * b * b * b)/(27 * a * a) - (b * c)/(3 * a))/a; 

workingC = -Math.pow(A, 3)/27; 

u = (-B + Math.sqrt(B * B - 4 * workingC))/2; // Quadratic formula 

s = Math.pow(u + B, 1/3); 

t = Math.pow(u, 1/3); 

y = s - t; 

x = y - b/(3 * a); 

當我插上X回到我原來的方程曲線的時候,這應該給我一個。這似乎對某些值很好,但是當p.y高於某個值時,我沒有積極的在二次方程中取平方根。

我對數學知之甚少,無法理解爲何會發生這種情況,或者我能做些什麼來解決這個問題。

對此的任何幫助將不勝感激。

UPDATE:

我已經調整好自己的算法來處理複雜的根源,但我仍然有麻煩。 這是我現在做的,如果判別爲負:

a = 0.5 * gravity^2; 

b = 1.5 * gravity * initialDY; 

c = initialDX^2 + initialDY^2 + gravity * (initialY - p.y); 

d = initialDX * (initialX - p.x) + initialDY * (initialY - p.y); 

A = (c - (b * b)/(3 * a))/a; 

B = -(d + (2 * b * b * b)/(27 * a * a) - (b * c)/(3 * a))/a; 

workingC = -Math.pow(A, 3)/27; 

discriminant = B * B - 4 * workingC; 

then if discriminant < 0; 

uc = new ComplexNumber(-B/2, Math.sqrt(-discriminant)/2); 

tc = uc.cubeRoot(); 

uc.a += B; 

sc = uc.cubeRoot(); 

yc = sc - tc; 

yc.a -= b/(3 * a); 

x = -d/(yc.a * yc.a + yc.b * yc.b); 

出於某種原因,這仍是不給我我所期望的結果。在這裏有什麼突出的錯誤嗎?

回答

4

實數多項式可以具有複數根,如果根不是實數,它們將以共軛對出現。

這意味着立方體總是至少有一個實根。

現在,如果你使用你的方法得到一個複雜的根,你可以嘗試獲得共軛,多重分割立方體的常數,採取倒數得到真正的根。

所以,如果你不得不取一個-ve數的平方根,那它就等於它的模數的平方根乘以虛數'i'。

所以,如果你代表你的根作爲(m,n)表示複數m + i n。那麼另一個根就是m -i n =(m,-n),m和n是實數。然後立方體可寫爲P(x)=(x^2 - 2m +(m^2 + n^2))(xr)。所以如果P(x)= x^3 - a_1 * x^2 + a_2 * x - a_3,那麼我們有r = a_3 /(m^2 + n^2)(a_3是這個根是r(m^2 + n^2))

得到r的一個簡單方法是使用公式r = a_1 - 2m(a_1是根的和,它是r + 2M)。

退房:http://en.wikipedia.org/wiki/Complex_number

+0

請修復/澄清:您的公式有 「A」 和 「B」 在其中,而不是 「T」; – 2010-07-13 23:52:25

+0

@Jason。固定。 – 2010-07-13 23:58:00

+0

只是爲了澄清: 這意味着我應該檢查判別式,如果它是否定的,我從我的二次方中取出複數根。然後,我需要執行相同的計算來計算已命名爲s,t,y,x但使用複數的變量。 從那裏如果x仍然複雜,我用你提供的公式之一來找到真正的根? – 2010-07-14 01:37:13