您的位置:首页 > 其它

判断两线段是否相交

2013-05-14 15:36 211 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: