有人知道我如何在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
答案 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
有多种解决方案可供选择:
这是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()));