求多条线段相交(暴力了点)

原创 2012年03月26日 12:24:58





#include<stdio.h>
#include<math.h>
struct point 
{
	double x,y;
};
struct line
{
	point a,b;
}g[120];
double MAX(double a,double b)
{
	return a>b?a:b;
}
double MIN(double a,double b)
{
	return a<b?a:b;
}
double cross_segment(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(line a,line b)
{
	double d1=cross_segment(b.a,b.b,a.a);
	double d2=cross_segment(b.a,b.b,a.b);
	double d3=cross_segment(a.a,a.b,b.a);
	double d4=cross_segment(a.a,a.b,b.b);
	if(((d1>0&&d2<0)||(d1<0&&d2>0))&&((d3>0&&d4<0)||(d3<0&&d4>0)))
	return 1;
	else if(d1==0&&onsegment(b.a,b.b,a.a))
	return 1;
	else if(d2==0&&onsegment(b.a,b.b,a.b))
	return 1;
	else if(d3==0&&onsegment(a.a,a.b,b.a))
	return 1;
	else if(d4==0&&onsegment(a.a,a.b,b.b))
	return 1;
	else
	return 0;
}

int main()
{
	int i,j,k,m,n,ncase,sum;
	while(scanf("%d",&m),m)
	{
		
		for(i=0;i<m;i++)
		scanf("%lf%lf%lf%lf",&g[i].a.x,&g[i].a.y,&g[i].b.x,&g[i].b.y);
		sum=0;
		if(m==1)
		{
			printf("0\n");
			continue;
		}
		for(i=0;i<m;i++)
		{
			for(j=i+1;j<m;j++)
			{
				if(segments(g[i],g[j]))
				sum++;
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}


判断线段相交和求交点

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

hdu 1086 You can Solve a Geometry Problem too(求线段相交点个数 模板)

hdu 1086 You can Solve a Geometry Problem too(求线段相交点个数 模板)

HDOJ 1394 Minimum Inversion Number(求逆序数—暴力or线段树or树状数组:单点更新,区间求和)

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav...

uva 303 pipe (求线段交点,判断线段相交)

这题并不难,但我却弄了一天。 只要枚举每个上面的点与下面的点的连线,在看这条线能到达的最远的地方。 然后如果这条线与上面或下面的第i条斜线线相交的话,必然会相交与up[i]-down[i]这条垂线...
  • xiou_mu
  • xiou_mu
  • 2011年09月15日 00:08
  • 613

判断两线段是否相交

  • 2011年12月18日 20:18
  • 36KB
  • 下载

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

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

判断两条线段/直线相交,并求交点

一.矢量基本知识     因为后面的计算需要一些矢量的基本知识,这里只是简单的列举如下,如果需要更加详细的信息,可以自行搜索wikipedia或google。 1.矢量的概念:如果一条线段的端点是...

perl 判断两线段是否相交

  • 2012年04月29日 12:49
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求多条线段相交(暴力了点)
举报原因:
原因补充:

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