У меня есть вектор точек, хранящийся в экземпляре 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
Если мои точки представляют диагональную линию, меня интересуют только точки 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;
}