(1) 快速排斥试验
设以线段 P1P2 为对角线的矩形为 R , 设以线段 Q1Q2 为对角线的矩形为 T ,如果 R 和 T
不相交,显然两线段不会相交。
(2) 跨立试验
如果两线段相交,则两线段必然相互跨立对方。若 P1P2 跨立 Q1Q2 ,则矢量 ( P1 - Q1 ) 和
( P2 - Q1 ) 位于矢量 ( Q2 - Q1 ) 的两侧,
即 ( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0 。
上式可改写成 ( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0 。
当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 ) 共线,
但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2 上;
同理, ( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2 上。
所以判断 P1P2 跨立 Q1Q2 的依据是:
( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0 。
同理判断 Q1Q2 跨立 P1P2 的依据是:
( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0 。
double mult(struct line A,struct line B)
{
double x1 = A.x2 - A.x1,y1 = A.y2 - A.y1;
double x2 = B.x1 - A.x1,y2 = B.y1 - A.y1;
double x3 = B.x2 - A.x1,y3 = B.y2 - A.y1;
return (x1 * y2 - y1 * x2) * (x1 * y3 - y1 * x3);
}
if(mult(p[i],p[j]) <= 0 && mult(p[j],p[i]) <= 0 &&
max(p[i].x1,p[i].x2) >= min(p[j].x1,p[j].x2) &&
max(p[j].x1,p[j].x2) >= min(p[i].x1,p[i].x2) &&
max(p[i].y1,p[i].y2) >= min(p[j].y1,p[j].y2) )
return true;
return false;