首页 > 代码库 > POJ3449 正方形已知对角线两点坐标,求另外两点
POJ3449 正方形已知对角线两点坐标,求另外两点
已知对角线两点(x0,y0) (x1,y1)
x1+x3 = x0+x2;
x1-x3 = y2-y0;
y1+y3 = y0-y2;
y1-y3 = x0-x2;
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 #include <map> 7 #include <vector> 8 #include <set> 9 #include <string> 10 #include <math.h> 11 12 using namespace std; 13 const double eps = 1e-8; 14 int sgn(double x) 15 { 16 if(fabs(x) < eps)return 0; 17 if(x < 0)return -1; 18 else return 1; 19 } 20 struct Point 21 { 22 double x,y; 23 Point(){} 24 Point(double _x,double _y) 25 { 26 x = _x;y = _y; 27 } 28 Point operator -(const Point &b)const 29 { 30 return Point(x - b.x,y - b.y); 31 } 32 //叉积 33 double operator ^(const Point &b)const 34 { 35 return x*b.y - y*b.x; 36 } 37 //点积 38 double operator *(const Point &b)const 39 { 40 return x*b.x + y*b.y; 41 } 42 }; 43 struct Line 44 { 45 Point s,e; 46 Line(){} 47 Line(Point _s,Point _e) 48 { 49 s = _s;e = _e; 50 } 51 }; 52 //*判断线段相交 53 bool inter(Line l1,Line l2) 54 { 55 return 56 max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) && 57 max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) && 58 max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) && 59 max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) && 60 sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= 0 && 61 sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= 0; 62 } 63 64 struct Node 65 { 66 char id; 67 int n;//点数 68 Point p[22]; 69 }node[30]; 70 bool cmp(Node a,Node b) 71 { 72 return a.id < b.id; 73 } 74 char str[30]; 75 bool check(Node a,Node b) 76 { 77 for(int i = 0;i < a.n;i++) 78 for(int j = 0;j < b.n;j++) 79 if(inter(Line(a.p[i],a.p[(i+1)%a.n]),Line(b.p[j],b.p[(j+1)%b.n]))) 80 return true; 81 return false; 82 } 83 bool ff[30]; 84 int main() 85 { 86 //freopen("in.txt","r",stdin); 87 //freopen("out.txt","w",stdout); 88 int n; 89 while(scanf("%s",str) == 1) 90 { 91 if(str[0] == ‘.‘)break; 92 node[0].id = str[0]; 93 scanf("%s",str); 94 if(strcmp(str,"square")==0) 95 { 96 node[0].n = 4; 97 scanf(" (%lf,%lf)",&node[0].p[0].x,&node[0].p[0].y); 98 //cout<<node[0].p[0].x<<" "<<node[0].p[0].y<<endl; 99 scanf(" (%lf,%lf)",&node[0].p[2].x,&node[0].p[2].y);100 // cout<<node[0].p[2].x<<" "<<node[0].p[2].y<<endl;101 node[0].p[1].x = ((node[0].p[0].x+node[0].p[2].x)+(node[0].p[2].y-node[0].p[0].y))/2;102 node[0].p[1].y = ((node[0].p[0].y+node[0].p[2].y)+(node[0].p[0].x-node[0].p[2].x))/2;103 node[0].p[3].x = ((node[0].p[0].x+node[0].p[2].x)-(node[0].p[2].y-node[0].p[0].y))/2;104 node[0].p[3].y = ((node[0].p[0].y+node[0].p[2].y)-(node[0].p[0].x-node[0].p[2].x))/2;105 }106 else if(strcmp(str,"line")==0)107 {108 node[0].n = 2;109 scanf(" (%lf,%lf)",&node[0].p[0].x,&node[0].p[0].y);110 scanf(" (%lf,%lf)",&node[0].p[1].x,&node[0].p[1].y);111 }112 else if(strcmp(str,"triangle")==0)113 {114 node[0].n = 3;115 scanf(" (%lf,%lf)",&node[0].p[0].x,&node[0].p[0].y);116 scanf(" (%lf,%lf)",&node[0].p[1].x,&node[0].p[1].y);117 scanf(" (%lf,%lf)",&node[0].p[2].x,&node[0].p[2].y);118 }119 else if(strcmp(str,"rectangle")==0)120 {121 node[0].n = 4;122 scanf(" (%lf,%lf)",&node[0].p[0].x,&node[0].p[0].y);123 scanf(" (%lf,%lf)",&node[0].p[1].x,&node[0].p[1].y);124 scanf(" (%lf,%lf)",&node[0].p[2].x,&node[0].p[2].y);125 node[0].p[3].x = node[0].p[2].x + (node[0].p[0].x - node[0].p[1].x);126 node[0].p[3].y = node[0].p[2].y + (node[0].p[0].y - node[0].p[1].y);127 }128 else if(strcmp(str,"polygon")==0)129 {130 scanf("%d",&node[0].n);131 for(int i = 0;i < node[0].n;i++)132 {133 scanf(" (%lf,%lf)",&node[0].p[i].x,&node[0].p[i].y);134 }135 }136 n = 1;137 while(scanf("%s",str)==1)138 {139 140 //cout<<str<<endl;141 if(str[0] == ‘-‘)break;142 node[n].id = str[0];143 scanf("%s",str);144 if(strcmp(str,"square")==0)145 {146 node[n].n = 4;147 scanf(" (%lf,%lf)",&node[n].p[0].x,&node[n].p[0].y);148 scanf(" (%lf,%lf)",&node[n].p[2].x,&node[n].p[2].y);149 node[n].p[1].x = ((node[n].p[0].x+node[n].p[2].x)+(node[n].p[2].y-node[n].p[0].y))/2;150 node[n].p[1].y = ((node[n].p[0].y+node[n].p[2].y)+(node[n].p[0].x-node[n].p[2].x))/2;151 node[n].p[3].x = ((node[n].p[0].x+node[n].p[2].x)-(node[n].p[2].y-node[n].p[0].y))/2;152 node[n].p[3].y = ((node[n].p[0].y+node[n].p[2].y)-(node[n].p[0].x-node[n].p[2].x))/2;153 }154 else if(strcmp(str,"line")==0)155 {156 node[n].n = 2;157 scanf(" (%lf,%lf)",&node[n].p[0].x,&node[n].p[0].y);158 scanf(" (%lf,%lf)",&node[n].p[1].x,&node[n].p[1].y);159 }160 else if(strcmp(str,"triangle")==0)161 {162 node[n].n = 3;163 scanf(" (%lf,%lf)",&node[n].p[0].x,&node[n].p[0].y);164 scanf(" (%lf,%lf)",&node[n].p[1].x,&node[n].p[1].y);165 scanf(" (%lf,%lf)",&node[n].p[2].x,&node[n].p[2].y);166 }167 else if(strcmp(str,"rectangle")==0)168 {169 node[n].n = 4;170 scanf(" (%lf,%lf)",&node[n].p[0].x,&node[n].p[0].y);171 scanf(" (%lf,%lf)",&node[n].p[1].x,&node[n].p[1].y);172 scanf(" (%lf,%lf)",&node[n].p[2].x,&node[n].p[2].y);173 node[n].p[3].x = node[n].p[2].x + (node[n].p[0].x - node[n].p[1].x);174 node[n].p[3].y = node[n].p[2].y + (node[n].p[0].y - node[n].p[1].y);175 }176 else if(strcmp(str,"polygon")==0)177 {178 scanf("%d",&node[n].n);179 for(int i = 0;i < node[n].n;i++)180 {181 scanf(" (%lf,%lf)",&node[n].p[i].x,&node[n].p[i].y);182 }183 }184 n++;185 }186 sort(node,node+n,cmp);187 for(int i = 0;i < n;i++)188 {189 printf("%c ",node[i].id);190 memset(ff,false,sizeof(ff));191 int cnt = 0;192 for(int j = 0;j < n;j++)193 if(i != j)194 if(check(node[i],node[j]))195 {196 cnt++;197 ff[j] = true;198 }199 if(cnt == 0)printf("has no intersections\n");200 else if(cnt == 1)201 {202 printf("intersects with ");203 for(int j = 0 ; j < n;j++)204 if(ff[j])205 {206 printf("%c\n",node[j].id);207 break;208 }209 }210 else if(cnt == 2)211 {212 printf("intersects with ");213 for(int j = 0 ; j < n;j++)214 if(ff[j])215 {216 if(cnt==2)printf("%c ",node[j].id);217 if(cnt==1)printf("and %c\n",node[j].id);218 cnt--;219 }220 }221 else222 {223 printf("intersects with ");224 for(int j = 0 ; j < n;j++)225 if(ff[j])226 {227 if(cnt > 1)printf("%c, ",node[j].id);228 if(cnt==1)printf("and %c\n",node[j].id);229 cnt--;230 }231 }232 }233 234 printf("\n");235 }236 }
POJ3449 正方形已知对角线两点坐标,求另外两点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。