3

我有一个充满 cv::Point 的向量,我想组织这个向量,使 x 和 y 值最小的点应该是第一个,最后一个应该有最高的 x,y 值?任何想法我该怎么做?

4

3 回答 3

11

使用std::sort.

std::sort(vec.begin(), vec.end(), [](const cv::Point2f &a, const cv::Point2f &b) {
    return (/* This is where you would compare a and b however you want */);
});

真的,很难说出你认为最大的 (x,y) 对和最小的 (x,y) 对。一种解决方案是添加坐标以赋予它们幅度。

我会使用到原点的距离:return a.x*a.x + a.y*a.y < b.x*b.x + b.y*b.y


如果您不能使用 C++11 功能,这里是上述解决方案的等价物:

bool point_comparator(const cv::Point2f &a, const cv::Point2f &b) {
    return (/* Your expression */);
}

std::sort(vec.begin(), vec.end(), point_comparator);
于 2013-06-05T11:53:27.567 回答
2

如果您的 Point 类的运算符 < 的计算结果类似于您的规则(或者您可以添加一个),只需调用std::sort. 否则,编写您的比较函数并调用 std::sort第二种形式,将其作为最后一个参数传递。如果您的编译器与 C++11 兼容,则可以将其设为 lambda。

请记住,比较函数必须是可传递的。

于 2013-06-05T11:53:49.117 回答
2

让我们随意假设您通过添加 x 和 y 来确定一个点的值(大假设)。排序是一个相当简单的过程:

bool sort (const cv::Point p1, const cv::Point p2) { return (p1.x + p1.y) < (p2.x + p2.y)); }

//int main or where ever
//assuming name of vector is myVector
std::sort(myVector.begin(), myVector.end(), sort);

只需更改排序方法以说明您要如何排序

于 2013-06-05T11:57:26.627 回答