您的位置:首页 > 其它

hdu1086 You can Solve a Geometry Problem too

2013-05-30 23:12 363 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: