Думаю, проблема в том, что ваши функции сравнения делают слишком сильные предположения о форме ограничивающей рамки.Рассмотрим эти две точки:
1
/
/
/
2
Правильный ограничивающий прямоугольник:
+---1
| /|
| / |
|/ |
2---+
Обратите внимание, что углы ограничивающего прямоугольника не являются точками в вашем векторе.Вместо этого это точки, образованные путем объединения координат из разных точек в векторе.Более того, если вы посмотрите на две свои функции сравнения, то обнаружите, что с учетом этих двух точек ни одна точка не сравнивается ни меньше, ни больше, чем другая точка, поскольку каждая из них имеет одну координату, которая выше, чем другая, и ту, которая нижечем другие.
Чтобы получить ограничивающий прямоугольник, вы должны сделать следующее:
- Найти точку со значением min x.
- Найти точку с помощьюмаксимальное значение x.
- Найдите точку со значением min y.
- Найдите точку со значением max y.
- Объедините x и y из точек с помощьюзначения min x и y в одну угловую точку.
- Объедините x и y из точек с максимальными значениями x и y в одну угловую точку.
Вы можете сделать этоиспользуя новый алгоритм C ++ 11 std::minmax_element
вместе с лямбдами:
auto xExtremes = std::minmax_element(v.begin(), v.end(),
[](const ofPoint& lhs, const ofPoint& rhs) {
return lhs.x < rhs.x;
});
auto yExtremes = std::minmax_element(v.begin(), v.end(),
[](const ofPoint& lhs, const ofPoint& rhs) {
return lhs.y < rhs.y;
});
ofPoint upperLeft(xExtremes.first->x, yExtremes.first->y);
ofPoint lowerRight(xExtremes.second->x, yExtremes.second->y);
Надеюсь, это поможет!