排序坐标点c++

Sorting Coordinate Points c++

本文关键字:c++ 坐标 排序      更新时间:2023-10-16

在一个应用程序中,我测量了a的许多二维坐标(x,y)模式。这种图案由一组固定在网格上的点组成x和y方向的倾斜度。这些坐标都有一个分数质量和按这个分数排序。我要做的是排序这些坐标首先在x上,并定义的组(区域)在一起的x坐标。在这一步之后,我想排序不同的x区域在y区域

在此之后,我能够将坐标标记为相应的图案(网格)标签。

示例:测量坐标(x, y) =(2, 2),(2、3),(1、2),(1,3),(2,1),(1,1),(2),(3),(3,1)

步骤1后:(x, y) =(1、2),(1、3)(1)(2,2),(2、3),(2,1)(2),(3),(3,1)

步骤2后:(x, y) =(1, 1),(1、2),(1,3),(2,1),(2,2),(2,3),(3、1),(2),(3)

是否存在已经执行此任务的排序例程?例程如果没有测量图案的某些坐标,也应该可以工作。

谁能给我一些提示,我不是一个有经验的c++程序员,但也许有一些提示我可以做这项工作!

您需要一个稳定的排序算法(它不会改变相等元素的顺序)。先按y坐标排序,再按x坐标排序,得到期望的结果:

std::stable_sort(points.begin(), points.end(), yComparator());
std::stable_sort(points.begin(), points.end(), xComparator());
例如

:
: (x, y) =(2, 2),(2、3),(1、2),(1,3),(2,1),(1,1),(2),(3),(3,1)
按y: (x, y) =(2, 1),(1, 1),(1),(2, 2),(1、2),(2),(2、3),(1,3),(3、3)
按x:排序(x, y) =(1, 1),(1、2),(1,3),(2,1),(2,2),(2,3),(3、1),(2),(3)

您可以使用std::sort和自定义operator<来完成此操作,例如:

#include <algorithm>
#include <vector>
struct coord {
  double x,y,quality;
};
bool operator<(const coord& a, const coord& b) {
  return a.quality < b.quality;
}
int main() {
  std::vector<coord> coords;
  std::sort(coords.begin(), coords.end());
}

如果你不希望"质量"被存储在结构中,你可以调用一些函数直接在operator<中计算它,例如:

double quality(const coord& c);
bool operator<(const coord& a, const coord& b) {
  return quality(a) < quality(b);
}

如果你知道你的数字的范围,你可以用X乘以一个大数字,然后把y加到这个数字上。现在,您可以简单地对单个数字进行排序,也可以像其他人描述的那样使用stl库进行排序。

bool compare_coord(pair<int, int> &coord1, pair<int, int> &coord2){
    if(coord2.second > coord1.second)
        return true;
    if(coord2.second == coord1.second && coord2.first > coord1.first)
        return true;
    return false;
}