快速排斥:不能处理端点为交点的情况;
快速排斥原理:用给出的两条线段作为各自的对角线建立矩形,如果矩形不相交,那么线段一定不相交。
具体实现:假设第一条线段的两个端点分别为(p1,p2)(p3,p4);
if(
min(p1.x,p2.x) <= max(p3.x,p4.x)&&
min(p3.x,p4.x) <= max(p1.x,p2.x)&&
min(p1.y,p2.y) <= max(p3.y,p4.y)&&
min(p3.y,p4.y) <= max(p1.y,p2.y)
) return true;
else return false;
缺点:无法处理下图的情况
-----------------------------------------------------------------------------------------------
跨立实验:为了弥补快速排斥的不能处理端点的问题,跨立实验出现。
原理:如果两条线段相互跨过,那么任意一条直线的连个端点一定会出现在另一条线段的两侧,利用叉乘分别判断两条线段就可以了
叉乘: k = x1 * y2 – x2 * y1 ,
if(k>0) {x 在 y 的顺时针方向}
if(k<0){x 在 y 的逆时针方向}
判断跨越:
四个Point类 p1,p2与q1,q2;
如果满足:((p1-q1)×(q2-q1))*((q2-q1)×(p2-q1)) > 0 && ((q1-p1)×(p2-p1))*((p2-p1)×(q2-p1)) > 0
那么这两条线段就是相交的;
上面的式子前面一个是判断p1,p2是不是分布在q1,q2的两侧,第二个则是判断q1,q2是不是分布在p1,p2的两侧;