我有一个充满cv :: Point的向量,我想组织这个向量,那么具有最小x和y值的Point应该是第一个,而最后一个应该具有最高的x,y值?任何想法我该怎么做?
答案 0 :(得分:10)
使用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);
答案 1 :(得分:2)
如果你的Point类有运算符&lt;评估类似于您的规则(或者您可以添加一个),只需调用std::sort
即可。否则编写比较函数并调用std::sort第二种形式,将其作为最后一个参数传递。如果编译器与C ++ 11兼容,则可以将其设为lambda。
请记住,比较功能必须是可传递的。
答案 2 :(得分: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);
只需更改排序方法即可说明您想要排序的方式