Як працює простий алгоритм дурної воронки?


14

Працюючи з алгоритмом воронки, показаним на Digesting Duck, я не впевнений, як працює виявлення воронки.

Чи може хтось мені пояснити метод чітко або запропонувати альтернативний спосіб виявлення воронки і якщо сторони воронки перекриваються?

Відповіді:


18

Алгоритм починається зі шляху, який ви знайшли раніше, в даному випадку - списку трикутників:

шлях

Код у нижній частині публікації щоденника Мікко будує масив порталів, що представляє собою список лінійних сегментів, що представляють лінійні відрізки між полігонами шляху. Це "портали", якими повинен пройти згладжений шлях (або краї полігону від "давайте простежимо середину ребер полігону"). Зауважте, що список порталів починається і закінчується виродженими відрізками рядків у початковій та цільовій точках.

Цей список порталів відображається як жовті пунктирні лінії на його фотографіях.

портали

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

алгоритм

Це означає, що кожен хід вперед повинен переміщувати краї воронки всередину, це можна перевірити за допомогою поперечного добутку векторів, що представляють стару сторону та потенційну нову сторону ( P × Q на зображенні нижче; також див. triarea2У коді Мікко). Якщо просування вперед для сторони не затягує воронку, ми не оновлюємо цю сторону для поточної ітерації порталів (E).

переміщення всередину

Інший випадок, який потрібно обробити, це коли воронка перероджується в сегмент лінії. Для того, щоб врахувати це, алгоритм перевіряє, чи одна із сторін знаходиться на «неправильній» стороні шляхом повторного використання поперечного добутку, на цей раз векторів, зроблених вершиною воронки, та правою та лівою кінцевими точками відповідно ( R × S у зображення нижче).

вироджена воронка

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


2
@Rolfcore Чи зрозуміла відповідь? Якщо ні, то які частини потребують вдосконалення?
Ерік

Я думаю, що він просто забув прийняти відповідь, ця дуже гарна і її слід серійно підтримувати ^^.
GameDeveloper

Можливо, тонна готча - це те, що в русі F ти не скажеш, що ми не починаємо знову з нуля, тому що існує ймовірність, що тугий кут, спрямований на південь, зробить можливим найтяжчу воронку, тому нам доведеться чекати, що сторони бота насправді не зможуть тест і не тільки один. Тож ми робимо це в G замість F .. гарне пояснення все одно :)
GameDeveloper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.