7

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

在此之后,我可以将坐标标记为相应的模式(网格)标签。

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

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

在第 2 步之后:(x,y)= (1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1 ),(3,2),(3 ,3)

是否有已经执行此任务的排序例程?如果不测量图案的某些坐标,该例程也应该有效。

有人可以给我一些线索吗,我不是一个经验丰富的 c++ 程序员,但也许有一些提示我可以完成这项工作!

4

4 回答 4

11

您需要一个稳定的排序算法(女巫不会改变相等元素的顺序)。首先按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),(3, 2),(3,3),(3,1)
按 y 排序:(x,y)= (2,1),(1,1),(3,1),(2,2),(1 ,2),(3,2),(2,3),(1,3),(3,3)
按 x 排序:(x,y)= (1,1),(1,2),( 1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)

于 2011-08-27T16:32:56.817 回答
6

您可以使用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);
}
于 2011-08-27T16:33:22.260 回答
4

如果您知道数字的范围,则可以将 X 乘以某个大数字,然后将 y 添加到该数字。现在您可以简单地对该单个数字进行排序,或者您可以像其他人描述的那样使用 stl 库来完成它。

于 2011-08-27T16:38:21.397 回答
0
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;
}
于 2021-12-10T11:11:21.263 回答