使用for循环不使用sort函数对OpenCV中的vector<Point>,按照x坐标降序、y坐标升序(即从右上角开始并沿顺时针方向)对点进行排序?
时间: 2024-12-23 21:14:28 浏览: 11
在OpenCV中,如果你有一个`std::vector<cv::Point>`并且你想根据x坐标降序、y坐标升序对其进行排序,但又不想使用`std::sort`函数,你可以自定义一个比较函数,然后使用标准库提供的`std::stable_sort`或直接用迭代器进行遍历并手动调整元素位置。
首先,你需要创建一个比较函数,用于确定两个点的顺序。这个函数应该接受两个`cv::Point`参数,返回一个布尔值表示第一个点是否应该排在第二个之前:
```cpp
bool comparePoints(const cv::Point& a, const cv::Point& b) {
if (a.x == b.x) { // 如果x坐标相同,则看y坐标
return a.y < b.y; // y坐标越小越先
}
else {
return a.x > b.x; // x坐标越大越先(逆序)
}
}
```
接下来,你可以使用`std::stable_sort`函数,它会保持相等元素的原始顺序:
```cpp
std::stable_sort(vec.begin(), vec.end(), comparePoints);
```
如果你想使用迭代器直接操作,可以这样做:
```cpp
for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
while (it != vec.rend() && comparePoints(*it, *next(it))) {
std::iter_swap(it, next(it));
++it;
}
}
```
这里使用了反向迭代器`vec.rbegin()`和`vec.rend()`,因为我们在从右上角开始并按顺时针顺序排列。
阅读全文