向量方法判断线段与矩形是否有交集,通过向量叉乘的结果正负来判断,当矩形在线段的某一侧时,叉乘的结果要么全正,要么全负,此时无交集。
判断有2步:1)快速排斥,2)叉乘。
int RSIntersection(Rectangle r, Point A, Point B)
{
MBR m1 = (MBR)r;
MBR m2 = MbrConstruct(A, B);
// 快速排斥
if (MbrOverlap(m1, m2) == 0)
return 0;
// 判断rectangle的四个点是否在向量的某一侧
Vector v = VectorConstruct(A, B);
Vector v1, v2, v3, v4;
v1.x = r.xmin - A.x;
v1.y = r.ymin - A.y;
v2.x = r.xmax - A.x;
v2.y = r.ymin - A.y;
v3.x = r.xmax - A.x;
v3.y = r.ymax - A.y;
v4.x = r.xmin - A.x;
v4.y = r.ymax - A.y;
double t1, t2, t3, t4;
t1 = CrossProduct(v1, v);
t2 = CrossProduct(v2, v);
t3 = CrossProduct(v3, v);
t4 = CrossProduct(v4, v);
if (t1>0 && t2>0 && t3>0 && t4>0)
return 0;
if (t1<0 && t2<0 && t3<0 && t4<0)
return 0;
return 1;
}
函数MbrConstruct, MbrOverlap, VectorConstruct, CrossProduct见C语言平面几何4-两线段是否相交
判断线段与矩形是否有交集的另外一种方法(降维方法),见 C语言平面几何6-判断线段是否与矩形范围有交集