线段,直线,射线是常见几何对象, 为实现计算多边形面积的算法, 里面用到求两线段交点, 故而先推导
求线段交点的算法. 原本求线段, 直线交点算法不少不须要本身推导, 但由于编程须要具体计算方法, 故而
仍是推导一遍. 算法
设线段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
(结束)