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; }
相关文章推荐
- HDU1086 You can Solve a Geometry Problem too
- HDU1086_You can Solve a Geometry Problem too(几何/叉积判断点线关系)
- You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交
- HDU1086 You can Solve a Geometry Problem too
- HDU1086 You can Solve a Geometry Problem too
- hdu1086 You can Solve a Geometry Problem too【排斥实验+跨立实验】
- HDU1086 You can Solve a Geometry Problem too(数学几何)
- hdu1086 You can Solve a Geometry Problem too
- ACM-计算几何之You can Solve a Geometry Problem too——hdu1086
- hdu1086 You can Solve a Geometry Problem too
- HDU1086_You can Solve a Geometry Problem too_判断两线段相交
- hdu1086 You can Solve a Geometry Problem too
- HDU1086:You can Solve a Geometry Problem too(线段相交模板)
- hdu1086 You can Solve a Geometry Problem too (判断两线段是否相交)
- You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交
- hdoj1086 You can Solve a Geometry Problem too
- HDU 1086 You can Solve a Geometry Problem too(判断两线段是否相交)跨立实验
- hdu 1086 You can Solve a Geometry Problem too(求线段相交点个数 模板)
- You can Solve a Geometry Problem too(线段相交问题)
- You can Solve a Geometry Problem too(计算多个线段的交点个数)