判断线段相交

原创 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
  • 下载

几种常用算法与判断线段相交

  • 2013年04月09日 20:35
  • 40KB
  • 下载

POJ3304_Segments_叉积::判断直线与线段是否相交

题意给出 n 个线段,问是否存在一条直线,当这 n 条线段投影在直线上时,至少有一个公共点。...
  • yuege38
  • yuege38
  • 2017年07月19日 17:24
  • 150

perl 判断两线段是否相交

  • 2012年04月29日 12:49
  • 6KB
  • 下载

叉积、线段相交判断、凸包

一、叉积 叉积的计算是线段方法的核心。对于向来p1和p2,叉积是由点(0,0)、p1、p2和p1+p2构成的平行四边形的有向面积。另一种与之等价但更有效的的叉积定义方式是将其看做矩阵行列式: ...

判断线段相交和求交点

  • 2008年05月23日 01:19
  • 42KB
  • 下载

计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)

转载自 http://www.cnblogs.com/bfshm/articles/3620500.html 矢量       如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如...

hdu 2872 Another Snake 爆搜 判断射线与线段相交

题意: 给出n各点,有一条蛇从原点开始走。每次只能向左 [0,180) 转。并且不能和原路径相交。走到最后一个点后会一直往前走。 问最多能走到的点数 假设现在走到的点为p,下一个点q。如果...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:判断线段相交
举报原因:
原因补充:

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