如何订购坐标对?

时间:2018-09-22 23:14:44

标签: c++ algorithm sorting math

有人知道我如何在C ++中订购一对坐标(x,y)吗?

例如,首先是第一象限的坐标,然后是第二象限的坐标,等等。

我已经用sort方法尝试了算法库,但是它不起作用。

bool com(Coordenada a, Coordenada b){
    return a.getX() < b.getX() || a.getY() < b.getY();
}

void mapa::sortVertices(){
    std::sort (ver.begin(), ver.end(), com);
}

例如,之前:

x=-1;y=-1
x=1;y=1
x=1;y=-1
x=-1;y=1

之后:

x=1;y=1
x=1;y=-1
x=-1;y=-1
x=-1;y=1

3 个答案:

答案 0 :(得分:2)

问题在于您尚未使用谓词定义有效的顺序。如果要定义坐标的总顺序,则可以使用以下命令:

bool CoordinateLess(Coordenada a, Coordenada b)
{
  return a.getX() < b.getX() || (a.getX() == b.getX() && a.getY() < b.getY());
}

答案 1 :(得分:0)

您有2个选项。您可以重载结构Coordenada的<运算符,也可以d 定义自定义比较函数并将其作为排序参数传递。我已经做了后者。

在这里您可以看到它的代码。

exec maxes

答案 2 :(得分:0)

您确定预期结果正确吗?因为它们没有按象限I,II,III,IV进行排序

x=1;y=1   → I
x=1;y=-1  → IV
x=-1;y=-1 → III
x=-1;y=1  → II

根据quadrant definition的结果应该是

x=1;y=1   → I
x=-1;y=1  → II
x=-1;y=-1 → III
x=1;y=-1  → IV

quadrants

有多种解决方案可供选择:

这是Akshat

的解决方案
bool operator<(Point p1, Point p2) 
{
    if (p1.getY() == 0 && p1.getX() > 0) 
        return true;  // angle of p1 is 0, thus p2 > p1

    if (p2.getY() == 0 && p2.getX() > 0) 
        return false; // angle of p2 is 0 , thus p1 > p2

    if (p1.getY() > 0 && p2.getY() < 0) 
        return true; // p1 is between 0 and 180, p2 between 180 and 360

    if (p1.getY() < 0 && p2.getY() > 0) 
         return false;
    // return true if p1 is clockwise from p2
    return p1.getX() * p2.getY() - p1.getY() * p2.getX() > 0;
}

如果您想要彼得·鲁德曼的建议,那么可以使用std::tie作为比较功能

std::sort (ver.begin(), ver.end(), std::tie(a.getX(), a.getY()) < std::tie(b.getX(), b.getY()));