Теорема, що розділяє вісь, з кількома багатокутниками?


9

Я намагаюся реалізувати теорему розділення осі в C #. У мене є функція, яка може обчислити мінімальний вектор перекладу між двома многокутниками. Однак я не можу створити функцію, яка обчислює мінімальний вектор перекладу між одним багатокутником і кількома іншими багатокутниками. Чесно кажучи, я над цим працював місяцями і не наближаюся до рішення та не зміг знайти рішення в Інтернеті. Завжди є кілька крайніх випадків, які не повертають правильного результату, що призводить до помилок з високим пріоритетом у моїй грі.

Ось загальні крайові випадки, які працюють не правильно:

крайові корпуси

Чи існує відоме рішення цієї проблеми? Все, що я можу знайти, це люди, які говорять "просто виконати SAT на кожному полігоні", але це рідко створює мінімальний вектор перекладу.

Будь-яка допомога буде дуже вдячна.


Однією ідеєю, яку я ніколи насправді не мав на тестуванні, є те, що деякі осі розділення - ті, які перенесуть вас убік у сусідній багатокутник - можуть бути позначені як мінімум. Тоді якийсь повторний тест дасть хороші результати (можливо, з якоюсь межею FIFO та / або ітерації, щоб запобігти застрягання в циклі).
Ендрю Рассел

Ще важче вирішити цю версію, коли край фігури лише частково покритий іншою. Наприклад, у правій верхній частині зображення, якщо середній квадрат витягнутий праворуч, - це більший прямокутник. Це схоже на вихід деякого коду, який я використовую, який займає десятки тисяч окупованих / не зайнятих осередків і зводить це до ста більш великих фігур зіткнення
Річард Тінгл,

Відповіді:


2

В ідеалі ви не будуєте своє оточення з полігонів. Ви будуєте його з ребер (що, можливо, ви обчислюєте з набору багатокутників). Наприклад, у вашому першому прикладі є один діагональний край; в останньому прикладі ящик спирається на один горизонтальний край.

Те, що ваш редактор або інструменти використовують менші, окремі фігури для створення рівня, не повинно впливати на час виконання.

Трохи простіший підхід просто видалить "внутрішні" краї основної форми. Для вашого останнього прикладу, між ящиками "підлоги" є два ребра; ігноруйте їх під час виявлення зіткнень.

Ви можете знайти кілька кращих зображень та деякі ідеї щодо реалізації, прочитавши розділ 4.5 (краї та ланцюги) в документації Box2D .


2
Використання країв (особливо ребер, це трохи краще з крайовими ланцюжками) має головний недолік у тому, що фізичним об'єктам стає дуже легко провалюватися всередині геометрії рівня.
Ендрю Рассел

1
@AndrewRussell: цих проблем уникнути звичайними виправленнями тунелю. Переконайтесь, що ваші рухомі об’єкти мають досить пристойний об'єм / площу, тримайте їх максимальну швидкість на кадр досить низькою, щоб вони не могли рухатись більше ~ половини найкоротшого розміру (або наступайте кілька разів, якщо вам потрібно, щоб рухатися швидше), уникайте дійсно гострі щілини та такі, як у вашій геометрії рівня, ітератуйте роздільну здатність кілька разів, поки не
сходите
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.