计算几何-线段相交

快速排斥:不能处理端点为交点的情况;

快速排斥原理:用给出的两条线段作为各自的对角线建立矩形,如果矩形不相交,那么线段一定不相交。

具体实现:假设第一条线段的两个端点分别为(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的两侧;


猜你喜欢

转载自blog.csdn.net/zhaiqiming2010/article/details/79964885
今日推荐