计算几何之 判断两个线段是否相交

来源:互联网 发布:卫生棉有哪些牌子知乎 编辑:程序博客网 时间:2024/06/06 01:53

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 于上海浦东.

0 0