极角排序

叉积:
如果若 O A → = ( x 1 , y 1 ) , O B → = ( x 2 , y 2 ) \overrightarrow{OA}=(x1,y1) , \overrightarrow{OB}=(x2,y2) OA =(x1,y1),OB =(x2,y2)
定义叉积: O A → × O B → = x 1 y 2 − x 2 y 1 \overrightarrow{OA}×\overrightarrow{OB}=x1y2−x2y1 OA ×OB =x1y2x2y1
三 角 形 S O A B = 1 2 ∗ ∣ O A → ∗ O B → ∣ 三角形S_{OAB} = \frac{1}{2} * |\overrightarrow{OA} * \overrightarrow{OB}| SOAB=21OA OB
t = O A → ∗ O B → 如 果 点 A 在 O B 的 顺 时 针 方 向 则 t > 0 , 反 之 逆 时 针 则 t < 0 , 三 点 一 线 则 t = = 0 t = \overrightarrow{OA} * \overrightarrow{OB} 如果点A在OB的顺时针方向则t > 0, 反之逆时针则t < 0, 三点一线则t ==0 t=OA OB AOBt>0t<0,线t==0
极角排序常用的四种方法:


struct point//存储点
{
    double x,y;
};

double cross(double x1,double y1,double x2,double y2) //计算叉积
{
    return (x1*y2-x2*y1);
}

double compare(point a,point b,point c)//计算极角
{
    return cross((b.x-a.x),(b.y-a.y),(c.x-a.x),(c.y-a.y));
}
bool cmp1(point a,point b) //方法一,利用atan函数,精度较低时间快
{
    if(atan2(a.y,a.x)!=atan2(b.y,b.x))
        return atan2(a.y,a.x)<atan2(b.y,b.x);
    else return a.x<b.x;
}
bool cmp2(point a,point b)  // 方法二, 叉积,按极角大小排序, 精度高时间较慢
{
    point c;//原点
    c.x = 0;
    c.y = 0;
    if(compare(c,a,b)==0)//计算叉积,函数在上面有介绍,如果叉积相等,按照X从小到大排序
        return a.x<b.x;
    else return compare(c,a,b)>0;
}
int Quadrant(point 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;
}
bool cmp3(point a,point b)  //方法三,先按象限从小到大排序 再按极角从小到大排序, 特殊需求才会用到
{
    if(Quadrant(a)==Quadrant(b))//返回值就是象限
        return cmp1(a,b);
    else Quadrant(a)<Quadrant(b);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值