首页 > 代码库 > poj3449Geometric Shapes
poj3449Geometric Shapes
链接
繁琐。
处理出来所有的线段,再判断相交。
对于正方形的已知对角顶点求剩余两顶点 (列出4个方程求解)
p[1].x=(p[0].x+p[2].x+p[2].y-p[0].y)/2;p[1].y=(p[0].y+p[2].y+p[0].x-p[2].x)/2;p[3].x=(p[0].x+p[2].x-p[2].y+p[0].y)/2;p[3].y=(p[0].y+p[2].y-p[0].x+p[2].x)/2;
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 #include<map> 11 using namespace std; 12 #define N 600 13 #define LL long long 14 #define INF 0xfffffff 15 #define zero(x) (((x)>0?(x):-(x))<eps) 16 const double eps = 1e-8; 17 const double pi = acos(-1.0); 18 const double inf = ~0u>>2; 19 map<string,int>f; 20 vector<int>ed[30]; 21 int g; 22 struct point 23 { 24 double x,y; 25 point(double x=0,double y=0):x(x),y(y) {} 26 } p[600]; 27 typedef point pointt; 28 pointt operator -(point a,point b) 29 { 30 return pointt(a.x-b.x,a.y-b.y); 31 } 32 struct line 33 { 34 pointt u,v; 35 int flag; 36 char c; 37 } li[N]; 38 vector<line>dd[30]; 39 char s1[10],s2[15],s[30]; 40 int dcmp(double x) 41 { 42 if(fabs(x)<eps) return 0; 43 return x<0?-1:1; 44 } 45 point rotate(point a,double rad) 46 { 47 return point(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad)); 48 } 49 double dot(point a,point b) 50 { 51 return a.x*b.x+a.y*b.y; 52 } 53 double dis(point a) 54 { 55 return sqrt(dot(a,a)); 56 } 57 double angle(point a,point b) 58 { 59 return acos(dot(a,b)/dis(a)/dis(b)); 60 } 61 double cross(point a,point b) 62 { 63 return a.x*b.y-a.y*b.x; 64 } 65 66 double xmult(point p1,point p2,point p0) 67 { 68 return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); 69 } 70 //判三点共线 71 int dots_inline(point p1,point p2,point p3) 72 { 73 return zero(xmult(p1,p2,p3)); 74 } 75 76 //判点是否在线段上,包括端点 77 int dot_online_in(point p,point l1,point l2) 78 { 79 return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps; 80 } 81 82 //判两点在线段同侧,点在线段上返回0 83 84 int same_side(point p1,point p2,point l1,point l2) 85 { 86 return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps; 87 } 88 89 //判两线段相交,包括端点和部分重合 90 91 int intersect_in(point u1,point u2,point v1,point v2) 92 { 93 if (!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2)) 94 return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2); 95 return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2); 96 } 97 void init(int kk,char c) 98 { 99 int i;100 int k = c-‘A‘;101 if(kk==1)102 {103 for(i = 0; i <= 2 ; i+=2)104 {105 scanf(" (%lf,%lf)",&p[i].x,&p[i].y);106 }107 p[1].x=(p[0].x+p[2].x+p[2].y-p[0].y)/2;108 p[1].y=(p[0].y+p[2].y+p[0].x-p[2].x)/2;109 p[3].x=(p[0].x+p[2].x-p[2].y+p[0].y)/2;110 p[3].y=(p[0].y+p[2].y-p[0].x+p[2].x)/2;111 p[4] = p[0];112 for(i = 0; i < 4 ; i++)113 {114 li[++g].u = p[i];115 li[g].v = p[i+1];116 dd[k].push_back(li[g]);117 }118 }119 else if(kk==2)120 {121 for(i = 1; i <= 3 ; i++)122 {123 scanf(" (%lf,%lf)",&p[i].x,&p[i].y);124 }125 point pp = point((p[1].x+p[3].x),(p[1].y+p[3].y));126 p[4] = point(pp.x-p[2].x,pp.y-p[2].y);127 //printf("%.3f %.3f\n",p[4].x,p[4].y);128 p[5] = p[1];129 for(i = 1; i <= 4; i++)130 {131 li[++g].u = p[i];132 li[g].v = p[i+1];133 li[g].c = c;134 dd[k].push_back(li[g]);135 }136 }137 else if(kk==3)138 {139 for(i = 1; i <= 2; i++)140 scanf(" (%lf,%lf)",&p[i].x,&p[i].y);141 li[++g].u = p[1];142 li[g].v = p[2];143 li[g].c = c;144 dd[k].push_back(li[g]);145 }146 else if(kk==4)147 {148 for(i = 1; i <= 3 ; i++)149 scanf(" (%lf,%lf)",&p[i].x,&p[i].y);150 p[4] = p[1];151 for(i = 1; i <= 3 ; i++)152 {153 li[++g].u = p[i];154 li[g].v = p[i+1];155 li[g].c = c;156 dd[k].push_back(li[g]);157 }158 }159 else if(kk==5)160 {161 int n;162 scanf("%d",&n);163 for(i = 1; i <= n ; i++)164 scanf(" (%lf,%lf)",&p[i].x,&p[i].y);165 p[n+1] = p[1];166 for(i = 1; i <= n ; i++)167 {168 li[++g].u= p[i];169 li[g].v = p[i+1];170 li[g].c = c;171 dd[k].push_back(li[g]);172 }173 }174 }175 176 int main()177 {178 f["square"] = 1;179 f["rectangle"] = 2;180 f["line"] = 3;181 f["triangle"] = 4;182 f["polygon"] = 5;183 int i,j,k;184 while(scanf("%s",s1)!=EOF)185 {186 if(s1[0]==‘.‘) break;187 if(s1[0]==‘-‘) continue;188 for(i =0 ; i < 26 ; i++)189 {190 ed[i].clear();191 dd[i].clear();192 }193 g = 0;194 k=0;195 scanf("%s",s2);196 s[++k] = s1[0];197 init(f[s2],s1[0]);198 while(scanf("%s",s1)!=EOF)199 {200 if(s1[0]==‘-‘) break;201 //cout<<s1<<endl;202 scanf("%s",s2);203 s[++k] = s1[0];204 init(f[s2],s1[0]);205 }206 //cout<<g<<endl;207 sort(s+1,s+k+1);208 for(i = 1 ; i <= k; i++)209 {210 int u,v;211 u = s[i]-‘A‘;212 //cout<<u<<" "<<dd[u].size()<<endl;213 for(j = i+1; j <= k ; j++)214 {215 v = s[j]-‘A‘;216 int flag = 0;217 for(int ii = 0 ; ii < dd[u].size() ; ii++)218 {219 for(int jj = 0 ; jj < dd[v].size() ; jj++)220 {221 if(intersect_in(dd[u][ii].u,dd[u][ii].v,dd[v][jj].u,dd[v][jj].v))222 {223 224 flag = 1;225 break;226 }227 // if(u==5&&v==22)228 // {229 // output(dd[u][ii].u);230 // output(dd[u][ii].v);231 // output(dd[v][jj].u);232 // output(dd[v][jj].v);233 // }234 }235 if(flag) break;236 }237 if(flag)238 {239 ed[u].push_back(v);240 ed[v].push_back(u);241 }242 }243 }244 for(i = 1 ; i <= k; i++)245 {246 int u = s[i]-‘A‘;247 if(ed[u].size()==0)248 printf("%c has no intersections\n",s[i]);249 else250 {251 252 sort(ed[u].begin(),ed[u].end());253 if(ed[u].size()==1)254 printf("%c intersects with %c\n",s[i],ed[u][0]+‘A‘);255 else if(ed[u].size()==2)256 printf("%c intersects with %c and %c\n",s[i],ed[u][0]+‘A‘,ed[u][1]+‘A‘);257 else258 {259 printf("%c intersects with ",s[i]);260 for(j = 0 ; j < ed[u].size()-1 ; j++)261 printf("%c, ",ed[u][j]+‘A‘);262 printf("and %c\n",ed[u][j]+‘A‘);263 }264 }265 }266 puts("");267 }268 return 0;269 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。