判断线段是否相交

#include<stdio.h>
#include<math.h>
#define N 4

typedef struct
{
	int x;
	int y;
}node;

int max(int x,int y)
{
	return x>y?x:y;
}

int min(int x,int y)
{
	return x<y?x:y;
}
int fun(node a,node b,node c,node d)
{
	node p[3];
	int flag,m,n;
	p[0].x=b.x-a.x;
	p[0].y=b.y-a.y;
	p[1].x=c.x-a.x;
	p[1].y=c.y-a.y;
	p[2].x=d.x-a.x;
	p[2].y=d.y-a.y;
    m=(p[0].x*p[1].y-p[0].y*p[1].x);
	n=(p[0].x*p[2].y-p[0].y*p[2].x);
	if((m%1000)!=0)
		m=m%1000;
	else
	{
		while(fabs(m/10)>10)
			m=m/10;
	}
	if((n%1000)!=0)
		n=n%1000;
	else
	{
		while(fabs(n/10)>10)
			n=n/10;
	}
	if(n*m<0)
		flag=1;
	else if(m*n==0)
	{
		if((c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x))&&(c.y>=min(a.y,b.y)&&c.y<=max(a.y,b.y))||(d.x>=min(a.x,b.x)&&d.x<=max(a.x,b.x))&&(d.y>=min(a.y,b.y)&&d.y<=max(a.y,b.y)))
			flag=0;
		else 
			flag=-1;
	}
	else 
		flag=-1;
	return flag;
}

int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		int i;
		for(i=0;i<n;i++)
		{
			int i,flag1,flag2;
		    node p[N];
		    for(i=0;i<N;i++)
			   scanf("%ld%ld",&p[i].x,&p[i].y);
		    flag1=fun(p[0],p[1],p[2],p[3]);
		    flag2=fun(p[2],p[3],p[0],p[1]);
		    if((flag1==1&&flag2==1)||flag1==0||flag2==0||(flag1==0&&flag2==0))
			   printf("intersect\n");
		    else
			   printf("disjoint\n");
		}
	}
	return 0;
}

posted on 2010-12-04 10:14  清玩儿  阅读(832)  评论(0)    收藏  举报