2010-02-05 62 views

回答

1
 
i = C+kV 
Lets call N the normal to the line A,B so N = [-(B-A).y, (B-A).x] 
Also, for any point on the line: 
(P-A)*N = 0  -- substitute from line 1 above: 
(C+kV-A)*N = 0 
(kV+C-A)*N = 0 
kV*N + (C-A)*N = 0 
kV*N = (A-C)*N 
k = [(A-C)*N]/V*N 
Now that we have k, plug it into line 1 above to get i. 

在這裏,我使用*表示點積,因此擴展到常規乘法:

 
k = ((A.x-C.x)*-(B.y-A.y) + (A.y-C.y)*(B.x-A.x))/(V.x*-(B.y-A.y) + V.x*(B.x-A.x)) 
I.x = C.x + k*V.x 
I.y = C.y + k*V.y 

除非我搞砸東西p ....

+0

啊..點積。他們以前一直是我的救世主。 – Kyle 2010-02-05 21:30:02

+0

我很欣賞每個人的幫助(很多!!),但我認爲這是我需要的,儘管我沒有100%確定,因爲我沒有測試過它。再次感謝。 – Kyle 2010-02-05 21:36:11

+0

你做了我通常做的事,並在最後一行(x)加倍了相同的尺寸。可能的罪魁禍首可能是複製和粘貼..啊,那些可以傷害!顯然最後一行應該是C.y,因爲你可能知道。 – Kyle 2010-02-05 21:46:38

3

如果你知道A和B,你知道該線AB方程,你說你知道V,這樣你就可以形成線V中的公式....嗯,我只是點滿足這兩個方程。

方程線AB:

(bx-ax)(Y-ay) = (by-ay)(X-ax) 

如果knpow方向(或斜率= M)的矢量,並且其位於所述載體的任何點,則線的爲向量V的方程式是

Y = MX = b

其中m是直線的斜率或方向,並且y座標b其中它穿過thevertical Y =軸線(其中X = 0)

如果知道就行了點(即,C =(S,T),那麼您求解由B:

t = ms + b ==> b = t - ms

所以方程變爲

Y = mX + t-ms 
+0

在這種情況下,V只是一個方向向量。我基本上是問我用什麼方程式實際上用來找到從C方向相交的「i」。 – Kyle 2010-02-05 21:07:29

+0

顯然我意識到你可能已經回答了它,但我不確定'在你的回答中重新提到。 – Kyle 2010-02-05 21:08:59

+0

如果V只是一個方向矢量,你不能解決這個問題。你不僅需要知道矢量的方向,而且要知道C源自哪個點(或者它經過的任何點)方向是線m的斜率,並且知道線上的任何點可以確定線的方程 – 2010-02-05 21:19:49

0

簡單的代數。困難的部分往往只是寫下基本的方程式,但一旦寫下來,其餘的很容易。

您可以定義一個從點C = [c_x,c_y]發出的線,並沿向量V = [v_x,v_y]指向嗎?表示這樣一條線的一個好方法是使用參數表示法。因此,

V(t) = C + t*V 

在向量元素方面,我們把它作爲

V(t) = [c_x + t*v_x, c_y + t*v_y] 

看看它是如何工作。當t = 0時,我們得到C點,但是對於任何其他的t值,我們得到線上的其他點。

通過A和B的線段如何?解決這個問題的一種方法是以相同的方式參數化地定義第二條線。然後求解兩個未知數的兩個方程組來找到相交點。

更簡單的方法是查看線段AB的法線向量。該向量如下給出:

N = [b_y - a_y , a_x - b_x]/sqrt((b_x - a_x)^2 + (b_y - a_y)^2) 

注意N在這裏被定義爲具有單位範數。

所以現在,我們什麼時候知道某個點是否恰好位於連接A和B的線上?現在這很簡單。當下面定義的點積恰好爲零時會發生這種情況。

dot(N,V(t) - A) = 0 

擴大這個,並解決參數t。我們可以用點積寫下來。

t = dot(N,A-C)/dot(N,V) 

或者,如果你願意的話,

t = (N_x*(a_x - c_x) + N_y*(a_y - c_y))/(N_x*v_x + N_y*v_y)) 

一旦我們有T,代入上面的V(t)的表達。讓我們在實踐中看到所有這些工作。我會挑選一些分A,B,C和矢量V

A = [7, 3] 
B = [2, 5] 
C = [1, 0] 

V = [1, 1] 

我們的法向量N,正常化後,會看起來像

N = [0.371390676354104, 0.928476690885259] 

行參數,T,然後

t = 3.85714285714286 

我們找到交叉點作爲

C + t*V = [4.85714285714286, 3.85714285714286] 

如果您將這些點繪製在一張紙上,它們應該全部合在一起,而且所有內容都只有幾個簡單的表達式。

+0

非常感謝!做得好。 – Kyle 2010-02-05 22:25:23