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             else
222             {
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 }
时间: 2024-11-04 12:19:22

POJ3449 正方形已知对角线两点坐标,求另外两点的相关文章

Scala实现:已知三点坐标,求最短距离(如果在垂足不在线段内,最短距离为到其中一点的直线距离)

/** * 已知三点坐标,求其中一点到另两点的垂线距离 * (如果在垂足不在线段内,最短距离为到其中一点的直线距离) * Created by wzq on 17-11-2. */object Point2lineDistance { def main(args: Array[String]) { val v: Double = pointToLine(-3, 0, 3, 0, 0, 3) System.out.println(v) } def pointToLine(x1: Int, y1:

已知一个数组,求数组中心元素

/** * */package Student_System;import java.util.*;import java.util.*;/**Homework11 * *Homework1101 *已知一个数组,求数组中心元素 * @author 读你一世 * * QQ: 1816274408 *2017年4月11日上午10:25:03 * */public class Homework1101 { public static void main(String[] args){ Scanner

java 空间四点定位,可跟据已知的四点坐标(x,y,z)及距离计算所在位置坐标

public static void main(String args[]) { try{ float point[]=new float[3]; Location loc = new Location(); //获得坐标 point[0] = 0; point[1] = 0; point[2] = (float) 0.5; loc.set_point(point,1); point[0] = 0; point[1] = -1; point[2] = 2; loc.set_point(point

已知前序中序求后序-二叉树

writer:pprp 思路很容易理解,但是实现还是有一点难度,容易错 参考书目:<算法竞赛宝典> 代码如下: //已知前序中序,求后序 #include <iostream> using namespace std; //a是前序,b是中序 void hwg(string a,string b) { int ll,lr; for(unsigned int i = 0; i < b.length(); i++) { if(a[0] == b[i]) //找到根节点 { ll

Android根据已知的经纬度坐标获取当前位置

例如:经度:10.123456   纬度:20.654321 根据以上坐标获取到实际位置(不借用百度地图或高德地图的API) 代码如下: //放入经纬度就可以了 public String getAddress(double latitude, double longitude) {         Geocoder geocoder = new Geocoder(this, Locale.getDefault());         try {             List<Address

已知三角形三边长求面积

不知道有没有问题…… #include<stdio.h> #include<math.h> #include<conio.h> float areatri(float a,float b,float c); float main() { float a,b,c; float s; char d; loop: printf("输入三角形三边长,以空格隔开\n"); scanf("%f %f %f",&a,&b,&am

HLG2040二叉树遍历已知前中,求后

二叉树的遍历 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 60(34 users) Total Accepted: 34(30 users) Rating: Special Judge: No Description 给出一棵二叉树的中序和前序遍历,输出它的后序遍历. Input 本题有多组数据,输入处理到文件结束. 每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点. 接下来的一行每行包括n个整数,表示这棵树的中序遍

已知三点,求三角形面积

已经知道三角形三点A(X1,Y1) B(X2,Y2) C(X3,Y3) \[ \vec{AB} = (X2-X1,Y2-Y1) \] \[ \vec{AC} = (X3-X1,Y3-Y1) \] \[ ||n|| = \vec{AB} \times \vec{AC} = |\vec{AB}|\cdot|\vec{AB}|*Sin<\vec{AB},\vec{AC}> \] \[ 因为 |\vec{AB}|*Sin<\vec{AB},\vec{AC}> 为三角形的高 \] \[ 所以

已知正方形对角线两点求另外两点

正方形,已知 (x0,y0) 和(x2,y2)  可以根据下列关系求(x1,y1),(x3,y3) x1+x3 = x0+x2; x1-x3  =  y2-y0; y1+y3 =  y0+y2; y1-y3 =  x0-x2; 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; node[0].p[1].y = ((node[0].p[0].y+node[0].p[2].y)+