判断线段相交

原创 2012年03月26日 12:02:30


#include<stdio.h>
#include<math.h>
double MAX(double a,double b)
{
	return a>b?a:b;
}
double MIN(double a,double b)
{
	return a<b?a:b;
}

struct point 
{
	double x,y;
};
double dirction(point a,point b,point c)
{
	return (c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
}
int onsegment(point a,point b,point c)
{
	double d1=MIN(a.x,b.x);
	double d2=MAX(a.x,b.x);
	double d3=MIN(a.y,b.y);
	double d4=MAX(a.y,b.y);
	if(d1<=c.x&&d2>=c.x&&d3<c.y&&d4>=c.y)
	return 1;
	return 0;
}
int segments(point a,point b,point c,point d)
{
	double d1=dirction(c,d,a);
	double d2=dirction(c,d,b);
	double d3=dirction(a,b,c);
	double d4=dirction(a,b,d);
	if(((d1>0&&d2<0)||(d1<0&&d2>0))&&((d3>0&&d4<0)||(d3<0&&d4>0)))
	return 1;
	else if(d1==0&&onsegment(c,d,a))
	return 1;
	else if(d2==0&&onsegment(c,d,b))
	return 1;
	else if(d3==0&&onsegment(a,b,c))
	return 1;
	else if(d4==0&&onsegment(a,b,d))
	return 1;
	return 0;
}
int main()
{
	int i,m,k,j,n,ncase;
	point a,b,c,d;
	scanf("%d",&ncase);
	while(ncase--)
	{
		scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
		scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
		if(segments(a,b,c,d))
		printf("YES\n");
		else
		printf("NO\n");
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

判断两线段是否相交

  • 2011-12-18 20:18
  • 36KB
  • 下载

hdu 1558 Segment set 并查集 叉积判断线段是否相交

hdu1558 题意:当输入P的时候,画一条线段,并且线段是有标号顺序的,如果两个线段相交即相当于联通了, 当输入Q的时候询问这个与这条线段联通的线段有几条(包括它本身) #include #i...

UVA 11783 Nail【简单线段相交判断 附YY加强版】

题目大意:给出一组木棍,若两木棍相交(规范相交,非规范相交部分去除重叠部分)钉一个钉子;                     若有木棍和其他所有木棍不相交,钉两个;最后固定所有木棍,所需钉子数;...

判断线段相交和求交点

  • 2008-05-23 01:19
  • 42KB
  • 下载

HDU 1086 计算几何 判断线段相交

题目: You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)