Розпад клітин бустрофедона - це просто поділ середовища на ділянки, які можуть бути ефективно покриті бустрофедоновим шляхом. Трапецієподібне розкладання буде, і це може бути здійснено за допомогою алгоритму зчитування рядків. Див. [Choset 2000], цей веб-сайт
, або (рекомендую!) Відмінну книгу "Обчислювальна геометрія" Марка де Берга та ін. al, для повного опису потрібних структур даних та алгоритмів.
Чосет, Хауї. Автономні роботи "Покриття відомих просторів: клітинний розпад бустрофедона" , 2000.
Наприклад, розглянемо набір перешкод як ребра та вершини. Скажімо, навколишнє середовище також обмежене спеціальним багатокутником. У нас є щось на кшталт наступного. Щоб розкласти цей простір, ми просто додаємо вертикальні ребра між кожною вершиною та найближчою лінією чи вершиною.
Для цього в коді потрібен лише тест перетину ліній сегмента, відсортований список ребер та відсортований список вершин.
- vi
- livi
- На кожному перехресті створіть нову вершину.
Коли це зроблено, набір нових ребер і вершин містить лише трапеції. Але наголошую, ви не можете зробити це в Інтернеті (без попереднього знання перешкод). Якщо ви хочете зробити надійне покриття без попереднього знання, ви можете подивитися на "алгоритми помилок". Зокрема, ось простий алгоритм, припускаючи, що середовище обмежене.
З початкового положення рухайтеся вгору та вліво, поки не досягнете верхнього лівого кута середовища. Якщо ви зіштовхнетесь із перешкодою спочатку, ви повинні подорожувати по ній. Ви знаєте, що щось є перешкодою, якщо його можна обрізати (бити і рухати).
У верхньому лівому куті рухайтеся праворуч, поки не стикаєтесь з межею. Потім рухайтеся вниз і вліво (Ми робимо бустрофедон всього простору).
Коли ви знаходитесь на лівій правій лінії та стикаєтесь із перешкодою, у вас є два варіанти. (i) Ми можемо обійти кругообіг, поки не дійдемо ліво-правої лінії, яку ми намагаємось прикрити, а потім продовжити. (ii), ми можемо розвернутися і накрити нову ліво-праву лінію, поки не опинимось через перешкоду або знову опинимось у цій ситуації. Я проілюструю.
Ліворуч ми рухаємось навколо перешкоди, поки не зможемо повернутися до тієї «лінії», яку ми намагалися пройти. Праворуч ми продовжуємо охоплювати (меншу) зону з одного боку перешкоди.
Перевага першого методу полягає в тому, що ви завжди повністю накреслюєте перешкоду, перш ніж приймати рішення про те, як її обійти, таким чином, ви можете піти на коротший шлях. Перевага другого методу полягає в тому, що вам зовсім не доведеться обійти перешкоду, ви можете просто приступити до покриття ділянки, в якій перебуваєте.
Зауважте, що це визначає ваше розкладання бустрофедоном в Інтернеті : Ви покриваєте область між перешкодами або між перешкодами та межею.
Однак, наскільки мені відомо, перший метод простіше проаналізувати. Складніші алгоритми (наприклад, BFS тощо) вибираються або тому, що середовище не є обмеженим (ви не хочете витрачати вічно на межу), або є дійсно неприємна перешкода в тому, що в основному розділяє середовище. Чому це погано? подивіться на цей приклад:
Переміщення вліво-вправо, а потім по колу кожен перешкода створює шлях надто багато кришок дрібних деталей між кожним перешкодою. Насправді, без глобального планування шляху, ви можете зробити це так само погано, як роздільна здатність вашої сітки, розмістивши ці стовпчики шириною 1 пікс, висотою, як усе середовище та 1 пікс один від одного. Тоді вам доведеться пересуватися через перешкоду кожного разу, коли ви потрапляєте в неї.
Ось чому я запитав, чи маєте ви якесь уявлення про те, де ви знаходитесь у навколишньому середовищі чи можете зробити глобальне планування шляху. Але обговорення в режимі он-лайн та офлайн та оптимальні алгоритми для цього - це не те, що ви насправді хотіли.
Оновлення: мені довелося видалити зображення (не https) і опублікую це, що часто використовується у практичних реальних програмах. http://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf