2010-06-18 73 views
1

我一直在試圖解決這個問題,並且我發現了一個給出了零除法錯誤的可能性的方程。不是最好的東西:找到兩個矢量方程的交點

v1 = (a,b) 
v2 = (c,d) 
d1 = (e,f) 
d2 = (h,i) 

l1: v1 + λd1 
l2: v2 + µd2 

Equation to find vector intersection of l1 and l2 programatically by re-arranging for lambda. 

(a,b) + λ(e,f) = (c,d) + µ(h,i) 
a + λe = c + µh 
b +λf = d + µi 
µh = a + λe - c 
µi = b +λf - d 
µ = (a + λe - c)/h 
µ = (b +λf - d)/i 
(a + λe - c)/h = (b +λf - d)/i 
a/h + λe/h - c/h = b/i +λf/i - d/i 
λe/h - λf/i = (b/i - d/i) - (a/h - c/h) 
λ(e/h - f/i) = (b - d)/i - (a - c)/h 
λ = ((b - d)/i - (a - c)/h)/(e/h - f/i) 

Intersection vector = (a + λe,b + λf) 

不知道它在某些情況下是否會起作用。我沒有測試過它。

我需要知道如何在值a-i中執行此操作。

謝謝。

回答

0

下面是python函數的解決方案。 v1和v2是位置矢量。 d1和d2是方向矢量。

def vector_intersection(v1,v2,d1,d2): 
    ''' 
    v1 and v2 - Vector points 
    d1 and d2 - Direction vectors 
    returns the intersection point for the two vector line equations. 
    ''' 
    if d1[0] == 0 and d2[0] != 0 or d1[1] == 0 and d2[1] != 0: 
     if d1[0] == 0 and d2[0] != 0: 
      mu = float(v1[0] - v2[0])/d2[0] 
     elif d1[1] == 0 and d2[1] != 0: 
      mu = float(v1[1] - v2[1])/d2[1] 
     return (v2[0] + mu* d2[0],v2[1] + mu * d2[1]) 
    else: 
     if d1[0] != 0 and d1[1] != 0 and d2[0] != 0 and d2[1] != 0: 
      if d1[1]*d2[0] - d1[0]*d2[1] == 0: 
       raise ValueError('Direction vectors are invalid. (Parallel)') 
      lmbda = float(v1[0]*d2[1] - v1[1]*d2[0] - v2[0]*d2[1] + v2[1]*d2[0])/(d1[1]*d2[0] - d1[0]*d2[1]) 
     elif d2[0] == 0 and d1[0] != 0: 
      lmbda = float(v2[0] - v1[0])/d1[0] 
     elif d2[1] == 0 and d1[1] != 0: 
      lmbda = float(v2[1] - v1[1])/d1[1] 
     else: 
      raise ValueError('Direction vectors are invalid.') 
     return (v1[0] + lmbda* d1[0],v1[1] + lmbda * d1[1]) 
0

確保d1矢量在計算之前不與d2矢量平行(或接近平行)。如果它們平行,你的線條不會相交,並且你得到零分割錯誤。

使用你的變量,如果(e i - f h)等於或接近0,你的行是平行的。

+0

@aeflash如果d1和d2幾乎是平行的,但v1和v2也是「幾乎」平行的,那麼可以找到相交點。這是一個非常平坦的旋臂的情況。 – 2010-06-18 04:29:30

+0

謝謝你的回答。 線總是垂直的,但方向矢量仍然可以有0。我可以爲其中0的情況制定其他方程式,但如果知道人們是否使用編程方式的簡單方法,那將是很好的。 – 2010-06-18 15:03:50

+0

也許他們垂直的事實可以簡化事情? – 2010-06-18 15:05:17

1

如果你做一個谷歌搜索intersection of lines你會發現很多公式,不涉及座標之一劃分。從wikipedia引用的sputsoft有一個很好的解釋算法。

關於你的數學,你太快速除以hi。解決方案可以通過推遲分工來達成。例如,通過乘以等式μH和一個用於率μi通過ħ得到兩個方程μhi。然後,這給出了λ最終方程等效於你,但是沒有潛在的非法區劃:

λ=((B - d)H - (一 - C)ⅰ)/(EI - FH)

只需乘頂部和通過λ的底部。

+0

剛回到這。如果ei == fh呢? – 2012-04-05 22:26:14

+0

好點。這發生在兩個向量平行時,這意味着它們沒有交集。 (這些線條有或沒有或所有共同點。)所以你需要檢查這種情況,但檢查是問題的合法方面,而不是你選擇解決它的方式的人爲因素。 – 2012-04-09 17:08:59

相關問題