Працюючи з алгоритмом воронки, показаним на Digesting Duck, я не впевнений, як працює виявлення воронки.
Чи може хтось мені пояснити метод чітко або запропонувати альтернативний спосіб виявлення воронки і якщо сторони воронки перекриваються?
Працюючи з алгоритмом воронки, показаним на Digesting Duck, я не впевнений, як працює виявлення воронки.
Чи може хтось мені пояснити метод чітко або запропонувати альтернативний спосіб виявлення воронки і якщо сторони воронки перекриваються?
Відповіді:
Алгоритм починається зі шляху, який ви знайшли раніше, в даному випадку - списку трикутників:
Код у нижній частині публікації щоденника Мікко будує масив порталів, що представляє собою список лінійних сегментів, що представляють лінійні відрізки між полігонами шляху. Це "портали", якими повинен пройти згладжений шлях (або краї полігону від "давайте простежимо середину ребер полігону"). Зауважте, що список порталів починається і закінчується виродженими відрізками рядків у початковій та цільовій точках.
Цей список порталів відображається як жовті пунктирні лінії на його фотографіях.
Алгоритм починається з широкої воронки і продовжується ітераційним переміщенням сторони воронки вперед уздовж бічних точок порталу (кінцевих точок відрізків рядків) до тих пір, поки це затягне воронку (AD).
Це означає, що кожен хід вперед повинен переміщувати краї воронки всередину, це можна перевірити за допомогою поперечного добутку векторів, що представляють стару сторону та потенційну нову сторону ( P × Q на зображенні нижче; також див. triarea2
У коді Мікко). Якщо просування вперед для сторони не затягує воронку, ми не оновлюємо цю сторону для поточної ітерації порталів (E).
Інший випадок, який потрібно обробити, це коли воронка перероджується в сегмент лінії. Для того, щоб врахувати це, алгоритм перевіряє, чи одна із сторін знаходиться на «неправильній» стороні шляхом повторного використання поперечного добутку, на цей раз векторів, зроблених вершиною воронки, та правою та лівою кінцевими точками відповідно ( R × S у зображення нижче).
Якщо це так, вектор з вершини воронки та правильна бічна кінцева точка додаються до згладженого контуру ( R на зображенні вище) і алгоритм перезапускається з його кінцевою точкою як новий вершина (FG), якщо, звичайно, якщо це точка мети.