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