//
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 "";
}
/* Функция создает таблицу с навигацией вверх/вниз, влево/вправо
*ВХОД:
*======================================
*$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 "
";
}
/* Функция вывода таблицы без тега map на максимальном уровне
*ВХОД:
*======================================
*$name - имя карты
*$x - номер ячейки по вертикали
*$y - номер ячейки по горизонтали
*$extension - расширение файла с изображением
*ВЫХОД:
таблица
*======================================
*/
function stop_rendering($map_name, $x, $y, $extension, $level)
{
echo " | ";
if ($x)
{
echo "ВВЕРХ";
} else {
echo " | |
";
}
echo "| ";
if ($y)
{
echo "ВЛЕВО";
} else {
echo " | ";
}
echo "";
echo " level."\" usemap='#".$name."' style=\"width:".$this->map_width."px;height:".$this->map_height."px;
position:relative; cursor:pointer;\">";
echo " | ";
$this->map_name = strval($name);
echo "";
if (!$y || $y < $this->width_blocks)
{
echo "ВПРАВО";
} else {
echo " | ";
}
echo "
";
echo " | "; //last table here. Down link here
if (!$x || $x < $this->width_blocks)
{
echo "ВНИЗ | ";
} else {
echo "";
}
echo " |
";
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;
}
}
//?>