1 /**
2 极角排序输出,,,
3 主要atan2(y,x) 容易失精度,,用
4 bool cmp(point a,point b){
5 if(cross(a-tmp,b-tmp)>0)
6 return 1;
7 if(cross(a-tmp,b-tmp)==0)
8 return length(a-tmp)<length(b-tmp);
9 return 0;
10 }
11 **/
12 #include <iostream>
13 #include <algorithm>
14 #include <cmath>
15 using namespace std;
16
17 struct point {
18 double x,y;
19 point (double x=0,double y=0):x(x),y(y){}
20 };
21 point p[100];
22 point tmp;
23 typedef point Vector;
24 Vector operator - (point a,point b){
25 return Vector (a.x-b.x,a.y-b.y);
26 }
27 double angle(Vector v){
28 return atan2(v.y,v.x);
29 }
30 double length(Vector v){
31 return sqrt(v.x*v.x+v.y*v.y);
32 }
33
34 double cross(Vector a,Vector b){
35 return a.x*b.y-a.y*b.x;
36 }
37 bool cmp(point a,point b){
38 if(cross(a-tmp,b-tmp)>0)
39 return 1;
40 if(cross(a-tmp,b-tmp)==0)
41 return length(a-tmp)<length(b-tmp);
42 return 0;
43 }
44
45 int main()
46 {
47 int cnt =0;
48 double x1,y1;
49 cin>>tmp.x>>tmp.y;
50 while(cin>>x1>>y1){
51 p[cnt].x = x1;
52 p[cnt].y = y1;
53 cnt++;
54 }
55 sort(p,p+cnt,cmp);
56 cout<<"("<<tmp.x<<","<<tmp.y<<")"<<endl;
57 for(int i=0;i<cnt;i++)
58 cout<<"("<<p[i].x<<","<<p[i].y<<")"<<endl;
59 return 0;
60 }
poj 2007 Scrambled Polygon 极角排序
时间: 2024-10-13 00:56:17