Показать сообщение отдельно
Старый 15.09.2006, 12:22
gl0om вне форума Посмотреть профиль Отправить личное сообщение для gl0om Посетить домашнюю страницу gl0om Найти все сообщения от gl0om
  № 17  
Ответить с цитированием
gl0om

Регистрация: Apr 2004
Адрес: Moscow city
Сообщений: 99
Отправить сообщение для gl0om с помощью ICQ
Цитата:
Сообщение от Ноябрь
хотя наверно не лучше, заключался он в том чтобы идти как будто препятствий нет, где полученная траектория пересекается с ними, определять контур и по наименьшей из дуг обходить.
+ не надо проверять при каждом шаге весь массив карты, а лишь один раз и только начальную траектории.
+ этот метод подойдет не только для шахматного поля, но и для простой карты, где будут функции-раектории, работающие по тому же алгоритму.
- я не уверен что это расстояние кратчайшее, точнее оно не кратчайшее, если препятствия обходить точно по контуру, а если контур будет простым, и в нем не будет лишних впадин (если убрать лишние впадины), то наверно кратчайшее..

еще я подумал что вовсе не обязательно просматривать всю карту при волновом алгоритме, при первом шаге достаточно проверить 9 клеток, на втором 25 и т.д, если подумать возможно еще удасться снизить площадь проверки массива.

пс
я прямо исследование провожу)
ппс
как копировать массив?
ну вообще у меня в примере путь просчитывается 1 раз, нету многократных пробегов по массиву.
Кратчайшее расстояние можно получить только просчитав полностью путь от начала до конца, проверяя вначале малое кол-во клеток можно уйти в другом направлении =). Если карта динамическая, конечно одним просчетом пути не обойтись, но каждый шаг просчитывать не надо, надо сравнивать прошлую координату объектов с текущей, если не совпадает - пересчитываем путь. К томуже если известна конечная и начальная точки - из этих координат можно построить область поиска и не пробегаться по всему массиву карты.

массив копироавть можно везде по всякому..
примитивно можно копировать во вложенном цикле
Код:
int a[MAX_ELEMENTS][MAX_ELEMENTS1];
int new_a[MAX_ELEMENTS][MAX_ELEMENTS1];
for (i=0; i<MAX_ELEMENTS; i++){
 for (j=0; j<MAX_ELEMENTS1; j++){
  new_a[i][j]=a[i][j];
 }
}
а можно и так
Код:
memcpy(new_a, a, sizeof(a));
но это не про флеш будет сказано =)
__________________
я всегда имею ввиду только то, что имею


Последний раз редактировалось iNils; 15.09.2006 в 13:11.