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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 19:07   #1
mrandrew1990
Пользователь
 
Регистрация: 02.05.2011
Сообщений: 13
По умолчанию Обход препятствий (модель движения толпы к выходу)

Всем доброго времени суток. Уважаемы товарищи-программисты, столкнулся с проблемой при написании программы (модель движения толпы). Суть такова – поле, на котором все происходит, представляет собой сетку из клеток; одна единственная клетка – выход, другие либо пустые (белый цвет), либо там люди (зеленый цвет) или погибшие люди в результате паники (красный цвет), либо черный (препятствие). Так вот не могу довести до ума алгоритм движения людей к выходу при столкновении с препятствиями…. По идее надо, допустим, если перед человеком сверху (или снизу от него) в горизонтальную (либо вертикальную слева или справа от него) линию (т.е. несколько подряд клеток черного цвета в один ряд) – нужно чтобы он обходил эту стенку как полагается относительно выхода (т.е. также стремился достигнуть выхода), т.е. не долбился в нее (как у мя сейчас происходит, при этом он стопорится там и умирает как бы), а должно быть чтобы он вдоль стенки двигался пока не найдет свободную клетку для движения к выходу, т.е. вперед…. С боковыми, т.е. вертикальными препятствиями тоже так…. Вот не пойму как это дело соорудить… Вот схема, которую нарисовал как должно быть
Вложения
Тип файла: rar прога_толпа.rar (195.2 Кб, 18 просмотров)
mrandrew1990 вне форума Ответить с цитированием
Старый 15.05.2012, 19:30   #2
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Алгоритм нахождения кратчайшего пути "A*" вам в помощь. Расчитайте его для каждого человека.
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 15.05.2012, 20:53   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

при выборе направления проверяй доступность пути(есть препятствие типа стена) и при его наличии корректруй направление.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.05.2012, 21:04   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от vovken1997 Посмотреть сообщение
Алгоритм нахождения кратчайшего пути "A*" вам в помощь. Расчитайте его для каждого человека.
А* ищет не кратчайший путь, а лишь близкий к оптимальному. Зато намного экономичнее поиска кратчайшего пути. Поэтому, когда именно оптимальный путь не требуется (как в данном случае), целесообразно использовать именно А*.
s-andriano вне форума Ответить с цитированием
Старый 15.05.2012, 21:11   #5
mrandrew1990
Пользователь
 
Регистрация: 02.05.2011
Сообщений: 13
По умолчанию

просто у меня еще одна сложность, ведб человек не один может быть (зеленая клетка). их несколько и они рандомно расположены. т.е. я координаты не могу знать. и получается придется еще проверять условие кроме наличия препятствия - нет ли там человека.... ну что-то в этом роде.... пока у мя получается, что препятствие и наличие человека в клетке, на которую хочет перейти человек - обрабатываются одинаково - т.е. если та клетка занята, то идем на другую какая свободна...
блин, что-то запутался сам(
mrandrew1990 вне форума Ответить с цитированием
Старый 15.05.2012, 21:34   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от mrandrew1990 Посмотреть сообщение
т.е. я координаты не могу знать.
Это как?
Цитата:
и получается придется еще проверять условие кроме наличия препятствия - нет ли там человека....
Причем есть два варианта:
1. Считать другого человека за препятствие как при поиске пути, так и при передвижении.
2. Считать за препятствие только для передвижения, путь строить без учета других людей.
s-andriano вне форума Ответить с цитированием
Старый 15.05.2012, 21:37   #7
mrandrew1990
Пользователь
 
Регистрация: 02.05.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Это как? Причем есть два варианта:
1. Считать другого человека за препятствие как при поиске пути, так и при передвижении.
2. Считать за препятствие только для передвижения, путь строить без учета других людей.
ну в принципе объединить и людей и препятствие - тупо проверять, занята ли клетка (пуста или нет).... наверное так...
mrandrew1990 вне форума Ответить с цитированием
Старый 15.05.2012, 22:02   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от mrandrew1990 Посмотреть сообщение
ну в принципе объединить и людей и препятствие - тупо проверять, занята ли клетка (пуста или нет).... наверное так...
На самом деле неочевидно - если проход закрыт другими людьми, оставшиеся будут фланировать в отдалении, даже не пытаясь приблизиться к выходу.
А если при поиске пути людей не учитывать, возникнет характерная давка на выходе.

Кстати, есть и третий вариант: считать, что у клеток занятых людьми, существенно ниже коэффициент проходимости.
Ну а если длина пути (с учетом людей) выше некоторого предела, человек впадает в панику и начинает метаться.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Моделирование паникующей толпы в замкнутом пространстве mrandrew1990 Общие вопросы Delphi 9 15.05.2012 20:54
Счетчик элементов массива (для модели толпы) mrandrew1990 Общие вопросы Delphi 6 05.03.2012 18:58
По выходу из потока не работают элементы скроллинга компонента dataGridView zakaev C# (си шарп) 2 07.09.2011 08:11
Обход динамичных препятствий CrHD Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 19.05.2009 23:10