判断直线是否相交,貌似很容易,直接用一个向量叉乘公式:x1*y2-x2*y1.如果结果为0,则直线是平行或者重合,否则必然相交...
但如何判断两条线段是否相交呢?我们给出了两条线段的四个端点,这两条条线段必须跨过另一条线段则必然相交,所以只需要算出两个端点分别在一条线段的两侧就OK了,至于怎么算是否在端点两侧还是用到上面的叉乘公式,两个端点的结果的积为负数,则在两侧,当然这里有种特殊情况需要处理,就是叉乘等于零,也就是端点在线段的延伸线上,所以这里需要判断这个端点是否在另一条线段上就OK了...这个代码没有注释,给以后的我自己看的...
#include
#include
#include
using namespace std;
struct point
{
int x;
int y;
}p[5];
int fff(point a,point b,point c)
{
point p1,p2;
p1.x=a.x-c.x;
p1.y=a.y-c.y;
p2.x=b.x-c.x;
p2.y=b.y-c.y;
return (p1.x*p2.y-p1.y*p2.x);
}
int ffff(point a,point b,point c)
{
point min,max;
min.x=b.x;min.y=b.y;max.x=a.x;max.y=a.y;
if (a.x
{
min.x=a.x;
max.x=b.x;
}
if (a.y
{
min.y=a.y;
max.y=b.y;
}
if (c.x>=min.x && c.x<=max.x && c.y>=min.y && c.y<=max.y) return 1;
else return 0;
}
int ff(point a,point b,point c,point d)
{
int q,w,e,r;
q=fff(a,b,c);
w=fff(a,b,d);
e=fff(c,d,a);
r=fff(c,d,b);
if (q*w<0 && e*r<0)
return 1;
else
{
if (q==0 && ffff(a,b,c)) return 1;
if (w==0 && ffff(a,b,d)) return 1;
if (e==0 && ffff(c,d,a)) return 1;
if (r==0 && ffff(c,d,b)) return 1;
}
return 0;
}
int main()
{
while (~scanf("%d%d%d%d%d%d%d%d",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y,&p[3].x,&p[3].y))
{
if (ff(p[0],p[1],p[2],p[3])) printf("相交\n");
else printf("不相交\n");
}
return 0;
}