Масштабирование произвольного многоугольника

StackOverflow https://stackoverflow.com/questions/6830480

  •  27-10-2019
  •  | 
  •  

Вопрос

Я шла в Интернете в течение нескольких дней, но не смог найти хороший ответ (или, по крайней мере, тот, который имел для меня смысл) на то, что кажется, это должно быть общим вопросом. Как можно масштабировать произвольный многоугольник? В частности, вогнутые многоугольники. Мне нужен алгоритм, который может обрабатывать вогнутые (определенно) и самостоятельные (если возможно) многоугольники. Очевидный и простой алгоритм, который я использовал для обработки простых выпуклых многоугольников, является расчетом центроида многоугольника, перевод этого центроида в начало начала, масштабируя все вершины и переводит многоугольник обратно в свое исходное местоположение.

Этот подход не работает для многих (или, может быть, всех) вогнутых многоугольников, поскольку центроид часто выходит за пределы многоугольника, поэтому операция масштабирования также приводит к переводу, и мне нужно иметь возможность масштабировать многоугольник «на месте» без конечного результата перевод.

Кто -нибудь знает о методе масштабирования вогнутых многоугольников? Или, может быть, способ найти «визуальный центр», который может быть использован в качестве системы отсчета для операции масштабирования?

Просто чтобы уточнить, я работаю в 2D -пространстве, и я хотел бы масштабировать свои многоугольники, используя «визуальный центр» в качестве отсчета. Так что, может быть, еще один способ задать вопрос, как мне найти визуальный центр вогнутого и/или самостоятельного переуправляющего многоугольника?

Спасибо!

Это было полезно?

Решение

Причина, по которой вы не можете найти хорошего ответа, заключается в том, что вы неточно со своими требованиями. Сначала явно определите, что вы имеете в виду под "на месте". Что сохраняется постоянным?

После того, как вы поняли это, затем переведите постоянную точку на начало, масштабируйте многоугольник как обычно и переведйте обратно.

Другие советы

Я не уверен, в чем твоя проблема.

Вы работаете в аффинном пространстве, и вы ищете аффинное преобразование, чтобы масштабировать свой многоугольник?

Если я прав, просто напишите матрицу преобразования:

И преобразовать свой многоугольник с помощью матрицы

Вы можете искать матрицу аффинной трансформации.

Надеюсь, поможет


РЕДАКТИРОВАТЬ

Если вы хотите сохранить тот же «центр», вы можете просто сделать гомутету параметров лямбда с центром G = барицентром полигона:

это проверяет:
enter image description here

G не будет двигаться, так как это центр гомотети.

Это все еще будет проверять отношение ниже, так что оно все равно будет барицентрором. (вы просто умножаете отношение на лямбда)

В вашем случае g легко определить: g (x, y): (среднее значение x значений точек, среднее значение y точек)

И это должно делать то, что вам нужно

Возможно, Крейг ищет алгоритм «смещения полигона», где каждый край в многоугольнике компенсируется заданным значением. Например, с помощью полигона, ориентированного по часовой стрелке, смещение краев влево увеличит размер многоугольника. Если это то, что ищет Крейг, то это было задано и ответило здесь - Алгоритм надувания/дефляции (смещение, буферизация) многоугольников.

Если вы ищете готовое изготовленное (OpenSource Freeware) решение, я также создал библиотеку зарезервирования (Клиппер) написано в Delphi, C ++ и C#, которая включает в себя довольно простую функцию компенсации многоугольника.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top