整数点的Counter Clock Wise排序

时间:2013-08-21 13:09:14

标签: c++ geometry

给定四边形的四个整数点,可以是它的任何类型(如菱形,矩形,梯形,平行四边形,正方形或正四边形),如何以逆时针方式对这些点进行排序(不使用atan2())函数或任何双点计算)这样我最终不会将对角线作为它的两侧?

我已将这样的内容编码为struct:

typedef struct {
      long long x,y ;
} point ;

vector<point> p ;

我无法弄清楚排序功能中的比较功能,以便在不使用任何双点计算的情况下对CCW顺序中的点进行排序。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

尝试类似的东西(假设您的轴位于0,0):

bool operator<(point other)
{
    // normalize both points
    if(y > 0 && other.y > 0)
        return x < other.x;
    else if(y < 0 && other.y < 0)
        return x > other.x;
    else
    {
        return y < other.y;
    }
}

答案 1 :(得分:1)

您可以使用此代码(不需要规范化向量,也假设枢轴位于(0,0)):

int Quadrant( const Point &pt ) {
    if( pt.x >= 0 && pt.y >= 0 )
        return 0;
    if( pt.x < 0 && pt.y >= 0 )
        return 1;
    if( pt.x < 0 && pt.y < 0 )
        return 2;
    if( pt.x >= 0 && pt.y < 0 )
        return 3;
}

std::sort( std::begin( pt ), std::end( pt ), []( const Point &lhs, const Point &rhs ) {
    return Quadrant(lhs) < Quadrant(rhs) || ( Quadrant(lhs) == Quadrant(rhs) && lhs.x*rhs.y - lhs.y*rhs.x > 0 );
    });

来自不同象限的点我们通过它们比较象限,并且为了比较相同象限中的点,我们从矢量从原点到第二点找到点积的符号,并且在从原点到第一点的CCW矢量上旋转90度。