网页版几何画板开发笔记(九) 求两条线段交点

线段,直线,射线是常见几何对象, 为实现计算多边形面积的算法, 里面用到求两线段交点, 故而先推导
求线段交点的算法. 本来求线段, 直线交点算法很多不需要自己推导, 但因为编程需要具体计算方法, 故而
还是推导一遍.

设线段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)

线段 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

对比前文 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)

求出 D = A2*B1 - A1*B2, 有解的条件为 D<>0.

然后有 t1 = x = (B2*C1 - B1*C2)/D
  t2 = y = (A1*C2 - A2*C1)/D

因为是线段, 故要求 t1 在范围 [0, 1], t2 在范围 [0, 1] 才算有解.

在求出 t1 或 t2 之后, 可简单算出交点坐标:
  x0 = A1*t1 + x1
  y0 = A2*t1 + y1

(结束) 

你可能感兴趣的:(算法,几何)