5种极角排序的方法

全部:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10005;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = 1e9 + 7;
bool dy(double x,double y)  {   return x > y + eps;} // x > y   
bool xy(double x,double y)  {   return x < y - eps;} // x < y   
bool dyd(double x,double y) {   return x > y - eps;} // x >= y   
bool xyd(double x,double y) {   return x < y + eps;}     // x <= y   
bool dd(double x,double y)  {   return fabs( x - y ) < eps;}  // x == y  
int n;
struct lp{
    double x,y,rad;
    int id;
    lp(){}
    lp(double a,double b){x=a,y=b;}
}cw[N];
lp operator +(lp A,lp B){return (lp){A.x+B.x,A.y+B.y};}
lp operator -(lp A,lp B){return (lp){A.x-B.x,A.y-B.y};}
lp operator *(lp A,double B){return (lp){A.x*B,A.y*B};}
lp operator /(lp A,double B){return (lp){A.x/B,A.y/B};}
double operator *(lp A,lp B){return A.x*B.x+A.y*B.y;}
double operator ^(lp A,lp B){return A.x*B.y-A.y*B.x;}
inline double crossDot(lp a,lp b){
    return a.x*b.y-a.y*b.x;
}
inline double area2(lp a,lp b,lp c){
    return crossDot(b-a,c-a);
}
double leng(lp A,lp B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}
double disToLine(lp P,lp A,lp B){return fabs(crossDot(B-A,P-A))/leng(A,B);}

//3 4 1 2
bool cmp1(lp a,lp b){
    double p=atan2(a.y,a.x),q=atan2(b.y,b.x);
    if(p!=q){
        return p<q;
    }
    return a.x<b.x;
}
//2 3 4 1 2
bool cmp2(lp a,lp b){
    lp c;
    c.x=c.y=0;
    double tmp=area2(c,a,b);
    if(tmp==0)return a.x<b.x;
    return tmp>0;
}
//象限排序,注意包含四个坐标轴
int Quadrant(lp a){
    if(a.x>0&&a.y>=0)  return 1;
    if(a.x<=0&&a.y>0)  return 2;
    if(a.x<0&&a.y<=0)  return 3;
    if(a.x>=0&&a.y<0)  return 4;
    return -1;
}
//1 2 3 4
bool cmp3(lp a,lp b){
    if(Quadrant(a)==Quadrant(b)){
        return cmp1(a,b);
    }
    return Quadrant(a)<Quadrant(b);
}
//先按象限排序,再按极角排序,再按远近排序
// 1 2 3 4
bool cmp4(const lp &a, const lp &b){
    if (a.y == 0 && b.y == 0 && a.x*b.x <= 0)return a.x>b.x;
    if (a.y == 0 && a.x >= 0 && b.y != 0)return true;
    if (b.y == 0 && b.x >= 0 && a.y != 0)return false;
    if (b.y*a.y <= 0)return a.y>b.y;
    lp one;
    one.y = one.x = 0;
    return area2(one,a,b) > 0 || (area2(one,a,b) == 0 && a.x < b.x);    
}
//象限排序,注意包含四个坐标轴
int Quadrant1(lp a){
    if(a.x>0&&a.y>=0)  return 3;
    if(a.x<=0&&a.y>0)  return 4;
    if(a.x<0&&a.y==0)  return 4;
    if(a.x<0&&a.y<=0)  return 1;
    if(a.x>=0&&a.y<0)  return 2;
}
//3 4 1 2
bool cmp5(lp &a,lp &b){
    int qa=Quadrant1(a),qb=Quadrant1(b);
    if(qa==qb){
        return cmp2(a,b);
    }
    return qa<qb;
}
int main(){
    while(~scanf("%d",&n)){
      for(int i=0;i<n;++i){
        scanf("%lf%lf",&cw[i].x,&cw[i].y);
        cw[i].id=i+1;
      }
      sort(cw,cw+n,cmp1);
      for(int i=0;i<n;++i){
        printf("%d (%.0f,%.0f)\n",cw[i].id, cw[i].x,cw[i].y);
      }
    }
    return 0;
}

部分:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10005;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = 1e9 + 7; 
int n;
struct lp{
    double x,y,rad;
    int id;
    lp(){}
    lp(double a,double b){x=a,y=b;}
}cw[N];
lp operator +(lp A,lp B){return (lp){A.x+B.x,A.y+B.y};}
lp operator -(lp A,lp B){return (lp){A.x-B.x,A.y-B.y};}
lp operator *(lp A,double B){return (lp){A.x*B,A.y*B};}
lp operator /(lp A,double B){return (lp){A.x/B,A.y/B};}
double operator *(lp A,lp B){return A.x*B.x+A.y*B.y;}
double operator ^(lp A,lp B){return A.x*B.y-A.y*B.x;}
inline double crossDot(lp a,lp b){
    return a.x*b.y-a.y*b.x;
}
inline double area2(lp a,lp b,lp c){
    return crossDot(b-a,c-a);
}
double leng(lp A,lp B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}
double disToLine(lp P,lp A,lp B){return fabs(crossDot(B-A,P-A))/leng(A,B);}

//3 4 1 2
bool cmp1(lp a,lp b){
    double p=atan2(a.y,a.x),q=atan2(b.y,b.x);
    if(p!=q){
        return p<q;
    }
    return a.x<b.x;
}
//2 3 4 1 2
bool cmp2(lp a,lp b){
    lp c;
    c.x=c.y=0;
    double tmp=area2(c,a,b);
    if(tmp==0)return a.x<b.x;
    return tmp>0;
}
//象限排序,注意包含四个坐标轴
int Quadrant1(lp a){
    if(a.x>0&&a.y>=0)  return 3;
    if(a.x<=0&&a.y>0)  return 4;
    if(a.x<0&&a.y==0)  return 4;
    if(a.x<0&&a.y<=0)  return 1;
    if(a.x>=0&&a.y<0)  return 2;
}
//3 4 1 2
bool cmp5(lp &a,lp &b){
    int qa=Quadrant1(a),qb=Quadrant1(b);
    if(qa==qb){
        return cmp2(a,b);
    }
    return qa<qb;
}
int main(){
    while(~scanf("%d",&n)){
      for(int i=0;i<n;++i){
        scanf("%lf%lf",&cw[i].x,&cw[i].y);
        cw[i].id=i+1;
      }
      sort(cw,cw+n,cmp1);
      for(int i=0;i<n;++i){
        printf("%d (%.0f,%.0f)\n",cw[i].id, cw[i].x,cw[i].y);
      }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39599067/article/details/81169755