hdu1086 You can Solve a Geometry Problem too

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<assert.h>
#define MAX 110
#define max(X,Y) ((X)>=(Y)?(X):(Y))
#define min(X,Y) ((X)<=(Y)?(X):(Y))

typedef struct{
	double x;
	double y;
}Point;

typedef struct {
//	Point beg,end;
	double x1,y1,x2,y2;
}Segment;
Segment segs[MAX];//线段
int n;//线段数

double cross_multiply(Segment s,double x3,double y3){//x3点在线段x1、x2 哪一端
	double x1=s.x1;
	double y1=s.y1;
	double x2= s.x2;
	double y2 = s.y2;
	return (y2-y1)*(x3-x1)-(y3-y1)*(x2-x1);
}

bool on_segment(Segment s,double x3,double y3){
	if(x3 <= max(s.x1,s.x2) && x3 >= min(s.x1,s.x2) && 
		y3 <= max(s.y1,s.y2) && y3 >= min(s.y1,s.y2))
		return true;
	else 
		return false;
}

bool has_intersect(Segment s1,Segment s2){//2个线段是否有交点
	double d1 = cross_multiply(s1,s2.x1,s2.y1);
	double d2 = cross_multiply(s1,s2.x2,s2.y2);
	double d3 = cross_multiply(s2,s1.x1,s1.y1);
	double d4 = cross_multiply(s2,s1.x2,s1.y2);

	//assert(d1 != 0 || d2 != 0);

	if( d1*d2 < 0 && d3*d4 < 0){
		return true;
	}else if(d1 == 0 && on_segment(s1,s2.x1,s2.y1))
		return true;
	else if(d2 == 0 && on_segment(s1,s2.x2,s2.y2))
		return true;
	else if(d3 == 0 && on_segment(s2,s1.x1,s1.y1))
		return true;
	else if(d4 == 0 && on_segment(s2,s1.x2,s1.y2))
		return true;
	else
		return false;

}

int main()
{
	int i,j;
	double x1,y1,x2,y2;
	//freopen("1086.in","r",stdin);
	while(scanf("%d\n",&n) && n!=0){
		memset(segs,0,sizeof(segs));//clear
		for(i=0;i<n;++i ){
			scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
			Segment seg={x1,y1,x2,y2};
			segs[i]=seg;
		}
		int count=0;
		for(i=0;i<n-1;++i){
			for(j=i+1;j<n;++j){
				if(has_intersect(segs[i],segs[j]))
					count++;
			}
		}
		printf("%d\n",count);
	}
    return 0;
}

发布了27 篇原创文章 · 获赞 4 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/hysfwjr/article/details/8997203