Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка координат, нужен запрос к бд 
:(
    Опции темы
ewolf
Дата 15.9.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 15.8.2006
Где: г. Москва

Репутация: 2
Всего: 18



Зачем вставлять фигурные скобки в phpmyadmin? они служат только для вставки переменных в строки php, это называется сложный синтаксис, хотя, можно конечно и без них. Greatest выбирает наибольшее значение из 2х..

Вообще, извини, изначально в коде была ошибка smile

Правильно вот так (хотя не имея реальной базы - не проверял)

Код

function checkFreeZone($x, $y, $x2, $y2, $free_zone, $table)
{
   $left = $x - $free_zone;
   $right = $x2 + $free_zone;

   $top = $y - $free_zone;
   $bottom = $y2 + $free_zone;

   $no_free_obs = mysql_query("SELECT * FROM {$table} WHERE (sx1 < {$right} AND sx2 > {$left} AND sy1 < {$bottom} AND sy2 > {$top})");
   $found = mysql_num_rows($no_free_obs);
   if( $found > 0 )
      return false;
   return true;
}

В твоих for нужно вызывать функцию ckeckFreeZone каждый раз, когда ты определяешь координаты некоторой зоны, которую ты хочешь проверить на свободу размещения в ней объекта

PM MAIL ICQ   Вверх
Gtaman
Дата 20.9.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



ewolf, с кодом вроде все понятно, но не мог бы ты написать полный вариант, т.е. начиная с for? А то я вставлять пробовал полюбому, не получаеться smile
PM MAIL   Вверх
ewolf
Дата 21.9.2006, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 15.8.2006
Где: г. Москва

Репутация: 2
Всего: 18



Ну, я вообще если речь идет о поиске свободной позиции для вставки объекта размерами WxH, то есть конечно более оптимальные алгоритмы, но попробуем обойтись вышеприведенной функцией

Код


$ZONE_WIDTH = 200;
$ZONE_HEIGHT = 200; // Карта квадратная, размером 200x200 единиц

function insertObject($obj_width, $obj_height, $obj_freezone)
{
   global $ZONE_WIDTH, $ZONE_HEIGHT;
   for( $x = $obj_freezone; $x <= $ZONE_WIDTH - $obj_freezone - $obj_width; $x++ )
   {
      for( $y = $obj_freezone; $y <= $ZONE_HEIGHT - $obj_freezone - $obj_height; $y++ )
      {
         // Проверяем свободную зону на свободу от камней и т.п.
         if( checkFreeZone($x, $y, $x + $obj_width, $y + $obj_height, $obj_freezone, 'second') )
         {
            // Проверяем зону на свободу от домов
            if( checkFreeZone($x, $y, $x + $obj_width, $y + $obj_height, $obj_freezone, 'first') )
            {
               // Вставка информации об объекте с координатами $x, $y
               return true;
            }
         }
      }
   }
   return false;
}

// Ну и вставка нужного числа объектов

$TOTAL_OBJECTS = 10;

for( $i = 0; $i < $TOTAL_OBJECTS; $i++ )
   insertObject(rand(3,10), rand(3,10), 2);



Я не уверен, что правильно понял твою идею для формирования карты. Может быть тебе нужна какая-то случайно создаваемая карта? Тогда поищи в интернете алгоритмы формирования случайных графов, карт и т.п. Они не имеют отношения к php или какому-то другому языку программирования, но ты сможешь почерпнуть от туда немало полезных знаний smile
PM MAIL ICQ   Вверх
Gtaman
Дата 21.9.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



ewolf, ну идея формирования простая - есть карта, 200*200 клеток. На этих клетках расположены разные объекты, как я уже говорил - здания и камни. при добавлении объекта - минимальное расстояние его от любого объекта должно быть 2 клетки. Ширина и высота зданий - одинакова(всмысле, у каждого экзэмпляра можетбыть разная длина, но если ширина 5, то и высота 5). Камни - тут по другому, тут уже ставиться радиус. т.е. сам объект имеет площадь 1 клетка, но если к примеру поставить у него x1 = 3; x2 = 6; y1 = 3; y2 = 5; то это как бы один объект, но в графическом варианте должно отображаться 6 объектов. я подумал, так будет лучше, чтобы не загружать базу. Экономнее так.

Что кавсается твоего кода - сейчас попробую, может быть получиться.  smile
PM MAIL   Вверх
Gtaman
Дата 24.9.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 10.4.2006

Репутация: нет
Всего: нет



Вроде все работает как надо...... Если что то не так будет - напишу...... Кстати, в WHERE надо ставить еще и =, т.е.

Код

$no_free_obs = mysql_query("SELECT * FROM {$table} WHERE (sx1 <= {$right} AND sx2 >= {$left} AND sy1 <= {$bottom} AND sy2 >= {$top})");


А вот схемка. Это я написал для более простого наблюдения. Пришлось сделать 25 клеток, так как при 200 очень все тормозит. Сам скрипт тормозит и вывод таблицы в браузер.... так вот, не заполненые цветом ячейки - свободные, желтые - здания, зеленые - лес, камни и.т.д.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  out_scheme_1.JPG 31,77 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0418 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.