// This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ class ImageRenderer { var $image_width; var $image_height; /* Количетсво блоков разбиения */ var $width_blocks; var $height_blocks; var $block_height_size; var $block_width_size; var $level; /* Коэффициенты измения относительной координаты для отрисованного объекта */ var $zoom_factor_x; var $zoom_factor_y; var $ellipse_radius=5; var $images_path; var $map_objects = array(); function ImageRenderer($image_width, $image_height, $horizontal_blocks, $vertical_blocks , $map_name, $x, $y, $level, $extension ,$objects) { if (is_null($x) && is_null($y)) $x = $y = 0; $level = ($level)? $level : 0; $this->level = $level; $this->image_width = $image_width; $this->image_height = $image_height; $this->width_blocks = $horizontal_blocks; $this->height_blocks = $vertical_blocks; $this->block_height_size = (integer)($this->image_height/$this->height_blocks); $this->block_width_size = (integer)$this->image_width/$this->width_blocks; $this->map_objects = $objects; $this->zoom_factor_x = pow($this->height_blocks,$level); $this->zoom_factor_y = pow($this->width_blocks, $level); } /*Функция отрисовки обьекта на карте *ВХОД: *====================================== *$x - номер ячейки по вертикали *$y - номер ячейки по горизонтали *$map_name - имя изображения, на котором формируются оъекты *$extension - расширение файла с изображением *$level - уровеь отображения картинки по глубине *====================================== */ function render_object($x, $y, $map_name, $extension, $level) { $ellipse_radius = 10; $image_descr = @imagecreatefromjpeg($this->images_path.$map_name.$x.$y.$level.$extension); if (!$image_descr) { echo "error loading image from: ".$map_name.$x.$y.$level.$extension.""; exit; } $obj_color2 = @imagecolorallocate($image_descr,240,240,0); $obj_color1 = @imagecolorallocate($image_descr,200,0,0); $ellipse_radius = $this->ellipse_radius*$this->zoom_factor_x; if (is_array($this->map_objects)) foreach ($this->map_objects as $object) { if ($object = $this->create_coords(&$object,$x, $y, $level)) { if ($object['object_y'] && $object['object_x']) /*if (!$this->level) { imagefilledellipse($image_descr,$object['object_y'],$object['object_x'],$ellipse_radius,$ellipse_radius,$obj_color); } else {*/ imagefilledellipse($image_descr,$object['object_y']*$this->zoom_factor_y,$object['object_x']*$this->zoom_factor_x,$ellipse_radius+3*$this->zoom_factor_y,$ellipse_radius+3*$this->zoom_factor_y,$obj_color1); imagefilledellipse($image_descr,$object['object_y']*$this->zoom_factor_y,$object['object_x']*$this->zoom_factor_x,$ellipse_radius,$ellipse_radius,$obj_color2); /* }*/ } } header( 'Content-Type: image/jpeg' ); imagejpeg($image_descr, '', 90); imagedestroy($image_descr); } /* Функция вычисления относительных координат для объекта *ВХОД: *====================================== *$object - элемент массива c абсолютной координатой *$x - номер ячейки по вертикали *$y - номер ячейки по горизонтали *$level - уровеь отображения картинки по глубине *ВЫХОД: массив $object с относительными координатами *====================================== */ function create_coords($object, $x, $y, $level) { if (!$this->level) { $x_rel_first = 0; $y_rel_first = 0; $x_rel_last = $this->image_height; $y_rel_last = $this->image_width; } else { $x_rel_first = $x * $this->block_height_size; $y_rel_first = $y * $this->block_width_size; $x_rel_last = $x_rel_first + $this->block_height_size; $y_rel_last = $y_rel_first + $this->block_width_size; } if (($object['object_x'] >= $x_rel_first && $object['object_x'] <= $x_rel_last) && ($object['object_y'] >= $y_rel_first && $object['object_y'] <= $y_rel_last)) { $object['object_x'] -= $x_rel_first; $object['object_y'] -= $y_rel_first; return $object; } return 0; } function generate_map_tags($x, $y, $level) { reset($this->map_objects); foreach ($this->map_objects as $object) { if ($object = $this->create_coords($object,$x, $y, $level)) if ($object['object_x'] && $object['object_y']) { echo "zoom_factor_x).",".($this->ellipse_radius*$this->zoom_factor_x)." href=\"javascript:GetInfo(".$object['object_id'].")\" title='".$object['object_name']."'/>"; } } } } class Map { var $display_map_shape = "rect"; var $map_name; var $level; /* размер изображения */ var $map_width; var $map_height; /* количество блоков */ var $width_blocks; var $height_blocks; /* размеры блоков в пикселах */ var $block_height_size; var $block_width_size; var $map_script_name = "map.php?1"; var $render_file = "imagerender.php?1"; var $map_coords = array(); function Map($image_width, $image_height, $horizontal_blocks, $vertical_blocks,$map_name ,$level=0, $maximum_level,$x, $y, $extension, $objects) { $level = ($level)? $level : 0; //if ($level == $maximum_level-1) /* вычитается для отмены генерирования map и тега usemap на максимальном уровне */ //Map::stop_rendering($map_name, $x, $y, $extension, $level); $this->level = ($level>$maximum_level)?$maximum_level : $level; $this->maximum_level = $maximum_level; $this->map_width = $image_width; $this->map_height = $image_height; $this->width_blocks = $horizontal_blocks; $this->height_blocks = $vertical_blocks; $this->x = ($x)?$x:0; $this->y = ($y)?$y:0; $this->map_name = $map_name; $this->objects = $objects; $this->block_height_size = (integer)($this->map_height/$this->height_blocks); $this->block_width_size = (integer)$this->map_width/$this->width_blocks; $this->create_map_coords(); $this->zoom_factor_x = pow($this->height_blocks,$level); $this->zoom_factor_y = pow($this->width_blocks, $level); } /* Функция вычисления индексов для разбитой карты *ВХОД: *====================================== *ВЫХОД: индексы сохранены в переменной класса map_coords *====================================== */ function create_map_coords() { for($i=0; $i < $this->height_blocks; $i++) { for($j = 0; $j < $this->width_blocks; $j++) { $this->map_coords[$i][$j]["x_1"] = $j*$this->block_width_size; $this->map_coords[$i][$j]["y_1"] = $i*$this->block_height_size; $this->map_coords[$i][$j]["x_2"] = ($j+1)*$this->block_width_size; $this->map_coords[$i][$j]["y_2"] = ($i+1)*$this->block_height_size; } } } /* Функция генерирования тега map *ВХОД: *====================================== *$object - элемент массива c абсолютными координатами *ВЫХОД: тег map с областями, соответствующими индексам *====================================== */ function display_map($objects) { echo "map_name>"; /* for($i=0; $i < $this->height_blocks; $i++) { for($j = 0; $j < $this->width_blocks; $j++) { $in = $this->x*$this->height_blocks + $i; $jn = $this->y*$this->width_blocks + $j; echo "display_map_shape coords=".$this->map_coords[$i][$j]['x_1'].",".$this->map_coords[$i][$j]['y_1'].",".$this->map_coords[$i][$j]['x_2'].",".$this->map_coords[$i][$j]['y_2']." href=map.php?i=".$in."&j=".$jn."&level=".($this->level+1)." />"; } }*/ $img_ren = new ImageRenderer($this->map_width, $this->map_height, $this->width_blocks, $this->height_blocks, $map_name,$this->x,$this->y, $this->level, $extension, $objects); //$img_ren->render_object($this->x, $this->x, "map", ".jpg",$this->level); $img_ren->generate_map_tags($this->x, $this->y, $this->level); echo ""; } /* Функция создает таблицу с навигацией вверх/вниз, влево/вправо *ВХОД: *====================================== *$name - имя карты *$x - номер ячейки по вертикали *$y - номер ячейки по горизонтали *$extension - расширение файла с изображением *ВЫХОД: таблица *====================================== */ function create_image($name, $x, $y, $render_file) { global $site_url; if (is_null($x) && is_null($y)) $x = $y = 0; echo ""; $this->map_name = strval($name); echo ""; echo ""; } echo ""; echo "
  "; /* ссылка ВВЕРХ */ if ($x) { echo "map_script_name}&i=".($x-1)."&j=".$y."&level=".($this->level).">Вверх"; } echo " 
 "; /* ссылки ВЛЕВО/ВПРАВО */ if ($this->level && $y) { echo "map_script_name}&i=".$x."&j=".($y-1)."&level=".($this->level).">Влево"; } echo ""; echo "level."\" usemap='#".$name."' style=\"width:".$this->map_width."px;height:".$this->map_height."px; position:relative; cursor:pointer;\" border=0>"; echo " "; if ($this->level && (!$y || $y < $this->zoom_factor_y-1)) { echo "map_script_name}&i=".$x."&j=".($y+1)."&level=".($this->level).">Вправо"; } echo "
  "; /* ссылка ВНИЗ */ if ($this->level && $x < $this->zoom_factor_x-1) { echo "map_script_name}&i=".($x+1)."&j=".$y."&level=".($this->level).">Вниз 
"; } /* Функция вывода таблицы без тега map на максимальном уровне *ВХОД: *====================================== *$name - имя карты *$x - номер ячейки по вертикали *$y - номер ячейки по горизонтали *$extension - расширение файла с изображением *ВЫХОД: таблица *====================================== */ function stop_rendering($map_name, $x, $y, $extension, $level) { echo ""; } echo ""; } echo ""; $this->map_name = strval($name); echo ""; } echo ""; echo ""; } else { echo ""; } echo ""; echo "
"; if ($x) { echo "ВВЕРХ"; } else { echo "
"; if ($y) { echo "ВЛЕВО"; } else { echo ""; echo "level."\" usemap='#".$name."' style=\"width:".$this->map_width."px;height:".$this->map_height."px; position:relative; cursor:pointer;\">"; echo ""; if (!$y || $y < $this->width_blocks) { echo "ВПРАВО"; } else { echo "
"; //last table here. Down link here if (!$x || $x < $this->width_blocks) { echo "ВНИЗ
"; } function create_coords(&$setx, &$sety, $x, $y, $level) { if (!$this->level) { $x_rel_first = 0; $y_rel_first = 0; } else { $x_rel_first = $x * $this->block_height_size; $y_rel_first = $y * $this->block_width_size; } $setx = round($setx/$this->zoom_factor_x); $sety = round($sety/$this->zoom_factor_y); $setx += $x_rel_first; $sety += $y_rel_first; } } //?>