Самое простое решение, и я предполагаю, что вы, скорее всего, будете искать, - это вычислить выровненную по оси ограничивающую рамку, которая представляет собой простой случай нахождения минимальных / максимальных значений x и y, а затем создание прямоугольника из те.
Я дам вам псевдокод для этого, учитывая, что вы не опубликовали типы, в которых выражается ваша геометрия ...
type point { float x; float y; }
type box { point topleft; point topright; point bottomleft; point bottomright; }
function bounding_box(points)
{
xmin = min(points.x)
xmax = max(points.x)
ymin = min(points.y)
ymax = max(points.y)
return new box{
topleft = { x = xmin, y = ymax },
topright = { x = xmax, y = ymax },
bottomleft = { x = xmin, y = ymin },
bottomright = { x = xmax, y = ymin }
};
}
Итак, учитывая эти:
point[] points = [[x = -2, y = 0], [x = 1, y = 2], [x = 1, y = 1], [x = -1, y = -2]];
box bounds = bounding_box(points);
Все следующее будет правдой:
bounds.topleft == [x = -2, y = 2];
bounds.topright == [x = 1, y = 2];
bounds.bottomleft == [x = -2, y = -2];
bounds.bottomright == [x = -1, y = -2];
Конечно, если система координат имеет самые низкие координаты вверху (например, как на обычном дисплее), тогда вам нужно инвертировать вычисление; или сначала вычислить результат в объектном пространстве, а затем перевести в логическое пространство.
Обратите внимание, что я выбрал тип поля, который выражает все четыре угла, на случай, если вы решите в будущем обновиться до произвольно выровненного поля в будущем (хотя по тому же признаку вы можете просто использовать точку + 2 вектора для что).
person
Andras Zoltan
schedule
27.01.2012