@DeboshiR
Свободу разработчикам!!!

Как масштабировать произвольный многоугольник?

Суть: есть некий произвольный многоугольник, заданный множеством точек. Требуется эти все точки сместить так, чтобы размер многоугольника увеличился.
В интернетах видел идею о перемещении геометрического центра многоугольника или центра тяжести многоугольника в точку [0; 0], умножением всех углов на определённое число и возвращение многоугольника на место. Но центры многоугольника могут находится за пределами фигуры.
Моя идея: построить биссектрису углов многоугольника и сдвигать эти углы на некоторое расстояние, но вопрос в том, как определить в какое именно расстояние?
Или может существуют более простые алгоритмы?
Реализую всё на JS.
  • Вопрос задан
  • 1261 просмотр
Пригласить эксперта
Ответы на вопрос 3
GavriKos
@GavriKos
Ну самое простое - использовать матрицы преобразования. И предварительно перенести центр системы координат туда, относительно какой точки вам нужно масштабировать ваш многоугольник.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
Масштабирование происходит относительно выбранной точки, центра. Из центра проводятся векторы в каждую из вершин многоугольника. Длина каждого вектора умножается на k. При умножении на 0, многоугольник коллапсирует в эту точку. Или при плавном увеличении k, многоугольник «растет» из этого центра. И располагаться этот центр может где угодно – точка произвольная.

Вам нужно только решить, где центр.

Если расположить центр в (0, 0) задача упрощается, т.к. координаты вершин совпадают с векторами в них из центра.

На JS могла бы быть примерно такая функция, принимающая на вход коэффициент k, массив координат центра и массив массивов координат точек:
function scale( k, center, points) {
  return points.map( p => p.map( (x, i) => center[i] + k * (x - center[i])));
}

scale(
  2, // в два раза
  [3, 1], // относительно точки (3,1)
  [ [0,0], [1,1], [3,1], [10,10] ] // этот четырёхугольник
)
// [ [-3, -1], [-1, 1], [3, 1], [17, 19] ]

В любом N-мерном пространстве годится. Сделал живой пример, можно поиграть: клик по полю назначает центр масштабирования
Ответ написан
@AVKor
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы