Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2013, 15:30   #1
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию Поиск пути.

Как можно организовать поиск пути для НЕ однопиксельных объектов на огромной Ч/Б карте?
В общем сабж такой:
Есть круг радиуса R (от 20 до 200 пикселей) и 2 точки (старт-конец) на большой карте (8192х8192 или даже 16384х16384 пикселей), надо найти путь от старта до финиша учитывая радиус круга, и сохранить его куда-то (так как скорее всего вычисления будут достаточно долгими, и вызывать их часто будет накладно учитывая то, что объектов будет достаточно много, от 20 до 50).
Все это часть игрушки типа доты (в 2D исполнении, проект в институт), собственно все оттуда собираюсь содрать в том числе и карту (карты: высот, земную, летную, курьера, общие границы). Есть некоторые наработки по поводу этой части, но они слишком сырые (за 10 мин в тетради набросал пока ехал в автобусе), основаны на волновом алгоритме "какого-то там" Ли с некоторыми доработками, т.е. не просто волной поиск идет, а направленной волной (что-то типа: if finish.x>start.x then NEXT.x:=NOW.x+1; и так несколько условий, т.е. программа сначала пытается найти прямой путь до цели, и только если такого нет - ищет обходы)
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 23.05.2013, 16:20   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Сейчас почитал немного и понял что саму карту передвижений можно сделать более маленькой, т.е. вместо 8192х8192 2048х2048, а может даже и 1024х1024.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 23.05.2013, 21:54   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Стандартный метод нахождения пути для "большого" объекта - раздвинуть (расширить) границы препятствий на расстояние равное радиусу объекта.
s-andriano вне форума Ответить с цитированием
Старый 23.05.2013, 22:00   #4
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

судя по размеру карты у автора огромный монитор и мощнейшая видеокарта.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 23.05.2013, 23:01   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
судя по размеру карты у автора огромный монитор и мощнейшая видеокарта.
Гораздо вероятнее - просто отсутствие опыта.
s-andriano вне форума Ответить с цитированием
Старый 23.05.2013, 23:18   #6
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
судя по размеру карты у автора огромный монитор и мощнейшая видеокарта.
Я смотрю ты с зумом не знаком... А 8к Х 8к в памяти держать - не так уж и сложно, учитывая что в той же самой доте вся карта держится в памяти...
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 23.05.2013, 23:20   #7
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Гораздо вероятнее - просто отсутствие опыта.
Да. опыта нет, и да, я курю на эту тему, так что теперь у меня еще более продуманный алгоритм...
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 24.05.2013, 21:30   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Обычно количество клеток невелико. Например, шахматы - 8х8.
В стратегических играх количество клеток вдоль одной стороны может достигать несколько десятков, и обычно увеличивать их число до нескольких сотен нецелесообразно - в этом случае лучше отказаться от равномерной сетки и заменить ее произвольной геометрией, которую с некоторой мерой условности тоже можно считать "ячеистой", но с ячейками неправильной формы. Но и в этом случае количество ячеек разумно делать не более нескольких тысяч (всего, а не по одной стороне).
Другими словами, когда возникает сделать количество ячеек более нескольких десятков по одной стороне, целесообразно задуматься, а правильный ли вообще выбран подход к геометрии.
s-andriano вне форума Ответить с цитированием
Старый 24.05.2013, 23:34   #9
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Обычно количество клеток невелико. Например, шахматы - 8х8.
В стратегических играх количество клеток вдоль одной стороны может достигать несколько десятков, и обычно увеличивать их число до нескольких сотен нецелесообразно - в этом случае лучше отказаться от равномерной сетки и заменить ее произвольной геометрией, которую с некоторой мерой условности тоже можно считать "ячеистой", но с ячейками неправильной формы. Но и в этом случае количество ячеек разумно делать не более нескольких тысяч (всего, а не по одной стороне).
Другими словами, когда возникает сделать количество ячеек более нескольких десятков по одной стороне, целесообразно задуматься, а правильный ли вообще выбран подход к геометрии.
http://astralax.ru/articles/pathway вот нашел еще тогда. размер поля 500х500, сотни юнитов.

"В процессе отладки своей игры я использовал следующий прием. На карте размером 504 × 504 создавал 8 команд и делил их на 2 союза (бой 4 на 4). Чтобы самому не напрягаться, включал вместо себя компьютерный интеллект, т. е. живой игрок в игре не участвовал. Обычно такая баталия длится 40 — 50 минут. Ближе к концу счетчики показывают примерно 500 — 700 «живых» юнитов и 200 — 250 зданий. Примерно 10 — 15% юнитов являются летающими, т. е. алгоритм поиска пути не используют. В этом состояние на процессоре Celeron 1000 (разогнанный 667), играть становится очень некомфортно, но вполне можно. Если поделить команды не на 2 союза, а сделать их «каждый сам за себя», то притормаживание очень заметно снизится. Ускорение происходит за счет пункта 3.

На более современных процессорах типа Pentium-4 (1700 МГц) какого-то серьезного снижения скорости не чувствуется.

Можно попробовать оценить алгоритм еще таким способом. Выделяем мышкой 250 юнитов и направляем их одновременно в самый дальний угол игрового поля. В этот момент построение дискретной волны произойдет сразу 250 раз. Пауза на Celeron-1000 будет примерно полсекунды-секунда, далее все юниты спокойно направятся в указанное место уже без каких-либо притормаживаний."

В доте же юнитов максимум сотня-две, притом что управлять можно только 10-20.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 25.05.2013, 03:47   #10
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Есть у кого исходники поиска пути по битовой карте?
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск пути в массиве Niken Помощь студентам 9 14.03.2013 22:01
Поиск пути Alexandr555 Общие вопросы C/C++ 5 29.01.2013 20:00
поиск пути Nikita1111 Visual C++ 1 09.02.2012 00:44
Поиск пути Federal Помощь студентам 1 19.06.2011 12:24
поиск пути NiCola999 Общие вопросы C/C++ 19 16.11.2009 09:25