首先给出一个事实:
对于线段AB和CD,若:直线AB和线段CD相交、直线CD和线段AB相交,则线段AB和线段CD相交。
下面给出图解和并要的说明:
直线AB与线段CD相交即C、D两点在直线AB两侧,由数学知识可以知道:
f( c.x, c.y) * f( d.x, d.y) <= 0
代码如下:
struct point
{
int x, y;
};
struct line_segment
{
point p1, p2;
};
bool judge(point a, point b, point c, point d)
{
int f1 = (b.y-a.y)*(c.x-a.x) - (b.x-a.x)*(c.y-a.y);
int f2 = (b.y-a.y)*(d.x-a.x) - (b.x-a.x)*(d.y-a.y);
return f1*f2 <= 0;//二者同时成立,即直线与线段相交
}
bool is_cross(line_segment l1, line_segment l2)
{
return judge( l1.p1, l1.p2, l2.p1, l2.p2)&&//直线AB和线段CD
judge( l2.p1, l2.p2, l1.p1, l1.p2);//直线CD和线段AB
}