题意:
很多线段,求总交点个数(不规范相交),没有三线共点
题解:
模板,拿几道计算几何水题开头,准备计算几何专题了~
这个题的细节其实很多,只是数据太水了!
不规范相交模板:
View Code
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 8 #define N 110 9 #define EPS 1e-7 10 #define dc doublecmp 11 //不规范相交 12 using namespace std; 13 14 struct PO 15 { 16 double x,y; 17 }; 18 19 struct LI 20 { 21 PO a,b; 22 }li[N]; 23 24 int n; 25 26 inline int doublecmp(double x) 27 { 28 if(x>EPS) return 1; 29 else if(x<-EPS) return -1; 30 return 0; 31 } 32 33 inline double cross(PO &a,PO &b,PO &c) 34 { 35 return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x); 36 } 37 38 inline double dot(PO &a,PO &b,PO &c) 39 { 40 return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y); 41 } 42 43 inline bool onseg(PO &a,PO &b,PO &c)//c在ab线段上 44 { 45 double maxx=max(a.x,b.x); 46 double maxy=max(a.y,b.y); 47 double minx=min(a.x,b.x); 48 double miny=min(a.y,b.y); 49 if(dc(cross(a,b,c))==0&&dc(c.x-minx)>=0&&dc(c.x-maxx)<=0&&dc(c.y-miny)>=0&&dc(c.y-maxy)<=0) 50 return true; 51 return false; 52 } 53 54 inline bool segcross(LI &a,LI &b)//判断线段相交(不规范) 55 { 56 int d1,d2,d3,d4; 57 d1=dc(cross(b.a,b.b,a.a)); 58 d2=dc(cross(b.a,b.b,a.b)); 59 d3=dc(cross(a.a,a.b,b.a)); 60 d4=dc(cross(a.a,a.b,b.b)); 61 if(d1*d2<0&&d3*d4<0) return true; 62 if(d1==0&&onseg(b.a,b.b,a.a)) return true; 63 if(d2==0&&onseg(b.a,b.b,a.b)) return true; 64 if(d3==0&&onseg(a.a,a.b,b.a)) return true; 65 if(d4==0&&onseg(a.a,a.b,b.b)) return true; 66 return false; 67 } 68 69 inline void read() 70 { 71 for(int i=1;i<=n;i++) 72 scanf("%lf%lf%lf%lf",&li[i].a.x,&li[i].a.y,&li[i].b.x,&li[i].b.y); 73 } 74 75 inline void go() 76 { 77 int ans=0; 78 for(int i=1;i<=n;i++) 79 for(int j=i+1;j<=n;j++) 80 if(segcross(li[i],li[j])) ans++; 81 printf("%d\n",ans); 82 } 83 84 int main() 85 { 86 while(scanf("%d",&n),n) read(),go(); 87 return 0; 88 }