Як обчислити обертання фігури ефективно?


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
Doc Brown

Так, ви маєте рацію, ваш підхід набагато конкретніший, простіший і зрозуміліший, але такий же підхід я зробив сам натяками, наведеними у відповіді Дена, тому я дав йому згоду. Сподіваюся, ваша відповідь набере набагато більше голосів. Ніяких важких почуттів. Ура!
Душан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.