1. 判断两个线段是否相交,需要检测线段是否两两横跨。所谓横跨,即是点p1 位于向量n 的一边,且另一点p2 位于向量n 的另一边;
2. 此外, 还需考虑边界情况,即一条线段的某个端点位于另一条线段上。
判断线段p1p2, p3p4 是否相交, 算法流程如下:
SEGMENT-INTERSECT(p1, p2, p3, p4)
// 计算三个点构成的两个向量的叉积;
1. d1 = DIR (p3, p4, p1)
2. d2 = DIR (p3, p4, p2)
3. d3 = DIR (p1, p2, p3)
4. d4 = DIR (p1, p2, p4)
5. if ((d1d2 < 0 and d3d4 < 0)return TRUE;
// 前者判断 d1 =0 时, 点p1 在线段p3p4 所在直线上, 后者 ON_SEGMENT(p3, p4, p1) 判断p1 是否在对角线p3p4所在矩形内;综合起来就是 点p1 是否严格在线段p3p4上.
6. else if d1 == 0 and ON_POLYGON (p3, p4, p1)
return TRUE;
7. else if d2 == 0 and ON_POLYGON (p3, p4, p2)
return TRUE;
8. else if d3 == 0 and ON_POLYGON (p1, p2, p3)
return TRUE;
9. else if d4 == 0 and ON_POLYGON (p1, p2, p4)
return TRUE;
// 计算向量pipk 和向量pipj 的叉积;
1. DIR (pi, pj, pk)
return (pk - pi) * (pj - pi);
// 判断 pk 是否在以pi, pj 为对角线的矩形内;
2. ON_POLYGON (pi, pj, pk)
if min(xi, xj) <= xk <= max(xi, xj) and min(yi, yj) <= yk <= max(yi, yj)
return TRUE;
else return FALSE;
// by 我执可破. 2016.10.23 于上海浦东.