#include "stdio.h"
#include<algorithm>
using namespace std;
struct Point
{
int x;
int y;
};
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a<b?b:a;
}
int direction(Point pa,Point pb,Point pc)//判断pc在线段(pa->pb)的哪一侧
{
return (pb.x-pa.x)*(pc.y-pa.y)-(pc.x-pa.x)*(pb.y-pa.y);
}
bool OnSegment(Point pa,Point pb,Point pc)
{
return pc.x>=min(pa.x,pb.x)&&max(pa.x,pb.x)>=pc.x&&pc.y>=min(pa.y,pb.y)&&max(pa.y,pb.y)>=pc.y?true:false;
}
bool segmentIntersection(Point p1, Point p2,Point p3, Point p4)
{
int d1 = direction(p1,p2,p3);
int d2 = direction(p1,p2,p4);
int d3 = direction(p3,p4,p1);
int d4 = direction(p3,p4,p2);
//printf("%d %d %d %d\n",d1,d2,d3,d4);
if(d1*d2<0&&d3*d4<0)//注意条件&&
return true;
else
{
if(d1==0&&OnSegment(p1,p2,p3))
return true;
if(d2==0&&OnSegment(p1,p2,p4))
return true;
if(d3==0&&OnSegment(p3,p4,p1))
return true;
if(d4==0&&OnSegment(p3,p4,p2))
return true;
}
return false;
}
int main()
{
int n,i;
Point p[5];
//FILE *fp = freopen("data.txt","r",stdin);
scanf("%d",&n);
while(n--)
{
for(i=1;i<=4;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
if(segmentIntersection(p[1],p[2],p[3],p[4]))
printf("Intersect\n");
else
printf("NoIntersect\n");
}
return 0;
}
判断两线段是否相交
最新推荐文章于 2024-08-08 15:18:16 发布