极角排序学习

来源:互联网 发布:历史股价数据 编辑:程序博客网 时间:2024/06/08 15:58

练习题:黑猫


    凸多边形是一个内部为凸集的简单多边形。凸多边形(Convex Polygon)指如果把一个多边形的所有边中,任意一条边向两方无限延长成为一直线时,其他各边都在此直线的同旁,那么这个多边形就叫做凸多边形,其内角应该全不是优角,任意两个顶点间的线段位于多边形的内部或边上。

    凹多边形(Concave Polygon)指如果把一个多边形的所有边中,有一条边向两方无限延长成为一直线时,其他各边不都在此直线的同旁,那么这个多边形就叫做凹多边形,其内角中至少有一个优角。
    极角排序:在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标,这样建立的坐标系叫做极坐标系。通常情况下,M的极径坐标单位为1(长度单位),极角坐标单位为rad(或°)。
    极角排序做了一些题目了,虽然都是简单题但是还是有一些体会的。
    何为极角排序?其实你可以这样想象,就是平面上的点和原点连城一条线段,然后用一条在平面上为0度的直线逆时针旋转一直转到360度也就是一圈,这样一个接一个碰到的点就是极角排序的顺序
    比如HDU3532,这道题就是以其中某一个点为原点建立直角坐标系,然后处理其他点到这个点的直线的角度,然后按角度排序(也就是所谓的极角排序),要使得两条直线的夹角最小,肯定是取角度排序后相邻的两条直线拉。为什么叫极角呢?我个人的理解是因为原点不固定,如果原点固定的话其实可以理解为高中学到的与x轴的角度(这样叫也高达上一点吧 hhhh)。
    还有HDU6127,这道题其实是直接按斜率排序的,但还是用函数atan处理的一下(因为x = 0的情况斜率处理不了),这样你就可以这样子想象,它首先是一条与y轴重合的直线直线直线,然后逆时针去旋转,因为不存在两点的连线过直线,所以按极角排序后,每次访问一个点实际上可以想象这个点就是一条与y轴重合的直线逆时针旋转碰到的第一个点,然后每次访问排好序的下一个点就可以想象这个直线在逆时针转动。
    关于atan和atan2两个函数,都是求反正切的函数
    atan( (y2-y1)/(x2-x1) )
    atan2( y2-y1, x2-x1 )
    注意参数不一样、
    atan的范围是[-90, 90] atan2[-180, 180],两者都可以计算x2 - x1 = 0的情况
原创粉丝点击