網頁版幾何畫板開發筆記(九) 求兩條線段交點

線段,直線,射線是常見幾何對象, 爲實現計算多邊形面積的算法, 裏面用到求兩線段交點, 故而先推導
求線段交點的算法. 原本求線段, 直線交點算法不少不須要本身推導, 但由於編程須要具體計算方法, 故而
仍是推導一遍. 算法

設線段s1爲 (x1,y1)-(x2,y2), 線段s2爲(x3,y3)-(x4,y4), (這樣表示是爲了方便調用, 用最原始的
座標點, 而不是將x1,y1 包裝爲點對象或線對象). 編程

線段s1的方程爲:
   x = (x2-x1)*t1 + x1  ----- (1)
   y = (y2-y1)*t1 + y1  ----- (2) .net

線段 s2的方程爲:
   x = (x4-x3)*t2 + x3  ----- (3)
   y = (y4-y3)*t2 + y3  ----- (4) 對象

若是有交點, 則交點處 (1)=(3), (2)=(4), 故而有:
  (x2-x1)*t1 + x1 = (x4-x3)*t2 + x3
  (y2-y1)*t1 + y1 = (y4-y3)*t2 + y3
整理以後有:
  (x2-x1)*t1 + (x3-x4)*t2 + (x1-x3) = 0
  (y2-y1)*t1 + (y3-y4)*t2 + (y1-y3) = 0 blog

對比前文 http://my.oschina.net/u/232554/blog/173952 二元一次方程組有:
  待求解的未知的二元爲 t1, t2, 而且:
  A1=(x2-x1), B1=(x3-x4), C1=(x1-x3)
  A2=(y2-y1), B2=(y3-y4), C2=(y1-y3) get

求出 D = A2*B1 - A1*B2, 有解的條件爲 D<>0. 方法

而後有 t1 = x = (B2*C1 - B1*C2)/D
  t2 = y = (A1*C2 - A2*C1)/D tar

由於是線段, 故要求 t1 在範圍 [0, 1], t2 在範圍 [0, 1] 纔算有解.

在求出 t1 或 t2 以後, 可簡單算出交點座標:
  x0 = A1*t1 + x1
  y0 = A2*t1 + y1

(結束) 

相關文章
相關標籤/搜索