Как эффективно рассчитать поворот фигуры?

13

Фото 1 Фото 2

У меня есть рисунок, представленный через матрицу байтов (растровую матрицу). Пример рисунка показан на Picture 1.

Цель состоит в том, чтобы найти лучший угол поворота некоторого данного рисунка . Когда рисунок поворачивается на лучший угол, прямоугольник, параллельный осям X и Y и вписывающий рисунок, имеет наименьшую площадь.

Прямоугольники, которые вписывают фигуру, показаны на изображениях светло-серым цветом. В Picture 2, вы можете увидеть , что идеальный поворот рисунка составляет около 30 градусов по часовой стрелке.

Теперь я знаю алгоритм, как найти этот угол, но мне кажется, что это очень неэффективно. Это выглядит так:

  1. Проход по углам от 0 до 45.
  2. Для текущего угла, для каждой точки фигуры рассчитайте новое, повернутое местоположение
  3. Найдите границы прямоугольника, который содержит фигуру (минимальное и максимальное значения x, y), и зарегистрируйте ее, если на данный момент наилучшее совпадение
  4. Следующий угол

Это своего рода метод грубой силы, который работает хорошо и достаточно быстро для маленьких фигур. Однако мне нужно работать с фигурами, которые содержат до 10 миллионов точек, и мой алгоритм становится медленным.

Какой будет хороший алгоритм для этой проблемы?

Душан
источник

Ответы:

20

Похоже, что вы можете найти произвольно выровненную минимальную ограничивающую рамку, используя алгоритм вращающихся измерителей линейного времени .

Когда у вас есть ограничивающий прямоугольник, вам просто нужно определить угол поворота, рассчитав наклон одной из сторон.

Дэн Пичельман
источник
Это отличное решение, очень хорошее.
ИнформированА
Отлично, поскольку я уже отсортировал точки по x и y, я могу найти выпуклую оболочку с помощью этого en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/… и использовать существующий алгоритм с точками корпуса.
Душан
12

Первый шаг вашего подхода ошибочен - существует бесконечное количество реальных значений от 0 до 45, поэтому нет смысла «проходить через них». Тем не менее, ваш алгоритм может быть восстановлен:

  • найти выпуклую оболочку многоугольника

  • пройти через конечное (!) число углов, заданных внешними краями выпуклой оболочки

  • Теперь примените шаги с 2 по 4, используя эти углы.

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

Док Браун
источник
Да, это именно то, что я собираюсь сделать, уже нашел помощь с ответом Дэна. Спасибо.
Душан
@Dusan: я не уверен, что другой ответ описывает тот же подход, поэтому я попытался описать решение более простым способом, надеюсь, немного яснее. Нашел описание здесь: cgm.cs.mcgill.ca/~orm/maer.html
Док Браун
Да, вы правы, ваш подход гораздо более конкретен, проще и яснее, но я сам пришел к выводу о том же подходе на основании подсказок, данных в ответе Дэна, поэтому я дал ему согласие. Надеюсь, ваш ответ получит гораздо больше голосов. Никаких обид. Ура!
Душан