Шлях «Лінія зору» через навігаційну сітку


9

Я хочу обчислити лінію зору в навігаційній сітці.

Розглянемо зображення нижче, жовта лінія є результатом лише A *, а червона - результат алгоритму видимості ", який використовує жовту лінію як вхідний. Тепер пристрій може рухатися безпосередньо без" зигзагування ".

Що таке алгоритм для обчислення цієї "лінії зору"?

введіть тут опис зображення

Відповіді:


6

Ви шукаєте алгоритм воронки.

Ось ви простий

http://digestingduck.blogspot.com.es/2010/03/simple-stupid-funnel-algorithm.html

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

На кроці A лійка будується зі стартовим положенням і порталом, перекресленим жовтою лінією.

На етапі B перевіряється наступний портал, верхня вершина знаходиться всередині воронки, тому верхня лінія воронки тепер проходить, хоча вона. Але нижня вершина знаходиться поза лійки, оскільки червона лінія знаходиться під зеленою лінією, тому нижня лінія не буде проходити, хоча вона продовжить проходити через нижню вершину попереднього порталу.

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

введіть тут опис зображення

Зрозумійте, що подібний алгоритм дає можливість простого вирішення проблеми розміру моделі, тому що ви можете врахувати, що портали менші за 2xрадіус вашої моделі.

введіть тут опис зображення


6

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

введіть тут опис зображення

Стаття про Gamasutra має такий приклад псевдокоду:

checkPoint = starting point of path
currentPoint = next point in path
while (currentPoint->next != NULL)
if Walkable(checkPoint, currentPoint->next)
// Make a straight path between those points:
temp = currentPoint
currentPoint = currentPoint->next
delete temp from the path
else
checkPoint = currentPoint
currentPoint = currentPoint->next

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


Я розумію, що ви говорите, але я досі не знаю, як обчислити лінію зору. Чи можете ви описати, що було б у функції Walkable за допомогою трикутної навігаційної сітки?
Янік Ланге

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