• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
dwtfukgv
博客园    首页    新随笔    联系   管理    订阅  订阅
极角排序

转载地址:http://blog.csdn.net/zxy_snow/article/details/6700847

atan2是按向量排序的,这个很好啊,可是就是可能会伤精度,那么会死很惨的。

atan2的参数是向量的y坐标,x坐标,排序范围是(-180°, +180°]。

象限排序是不损精度的,因为只用到叉积还有一些比较而已。

先判断两个点是在哪两个象限,然后如果不在同一个象限,直接象限比较,如果在同一个象限,那么用叉积比较即可,边界问题考虑下。

 

大小判定函数。

    const double eps = 1e-6;  
    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  

 atan2排序

    bool cmp(point& a,point& b)    
    {    
        double t1 = atan2(a.y - C.y, a.x - C.x);  
        double t2 = atan2(b.y - C.y, b.x - C.x);  
        if( dd(t1, t2) ) return xy(fabs(a.x),fabs(b.x));  
        return xy(a.t, b.t);    
    }  

 象限极角排序代码

    int quad(point a)// 判断象限的函数,每个象限包括半个坐标轴   
    {  
        if( dy(a.x,0) && xyd(a.y,0) ) return 1;  
        if( xyd(a.x,0) && dy(a.y,0) ) return 2;  
        if( xy(a.x,0) && xyd(a.y,0) ) return 3;  
        if( dyd(a.x,0) && xy(a.y,0) ) return 4;  
    }   
    bool cmp(point& a,point& b)    
    {    
        point p1 = a,p2 = b;  
        p1.x -= C.x; p1.y -= C.y;  
        p2.x -= C.x; p2.y -= C.y;  
        int l1,l2;  
        l1 = quad(p1); l2 = quad(p2);  
        if( l1 == l2 )  
        {  
            double c = crossProduct(C,a,b);  
            return xy(c,0) || dd(c,0.0) && xy(fabs(a.x),fabs(b.x));  
        }  
        return l1 < l2;  
    }   

 

posted on 2016-06-22 20:38  dwtfukgv  阅读(194)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3