Получение ограничивающего прямоугольника вектора точек?

У меня есть вектор точек, хранящийся в экземпляре std :: vector . Я хочу вычислить ограничивающая рамка этих точек. Я пробовал с этим кодом:

bool _compare1(ofPoint const &p1, ofPoint const &p2) {
    return p1.x < p2.x && p1.y < p2.y;
}
bool _compare4(ofPoint const &p1, ofPoint const &p2) {
    return p1.x > p2.x && p1.y > p2.y;
}
vector<ofPoint> points;

// ...
if(points.size()>1) {
    ofPoint p_min = *std::min_element(points.begin(), points.end(), &_compare1);
    ofPoint p_max = *std::min_element(points.begin(), points.end(), &_compare4);
}

Но этот код дает странные результаты. На самом деле меня интересуют только первая и последняя точки моего ограничивающего прямоугольника:

1------2
|\     |
| \    |
|  \   |
|   \  |
|    \ |
|     \|
3------4

Если мои точки представляют диагональ line меня интересуют только пункты 1 и 4.

Есть ли разумные способы добиться этого с помощью стандартных библиотек или Boost?


ТЕКУЩЕЕ РЕШЕНИЕ:

bool _compare_min_x(ofPoint const &p1, ofPoint const &p2) { return p1.x < p2.x; }
bool _compare_min_y(ofPoint const &p1, ofPoint const &p2) { return p1.y < p2.y; }

// ....

    if(points.size()>1) {
        min_x = (*std::min_element(points.begin(), points.end(), &_compare_min_x)).x;
        min_y = (*std::min_element(points.begin(), points.end(), &_compare_min_y)).y;

        max_x = (*std::max_element(points.begin(), points.end(), &_compare_min_x)).x;
        max_y = (*std::max_element(points.begin(), points.end(), &_compare_min_y)).y;
    }
8
задан nkint 31 January 2012 в 19:46
поделиться