Работа с полигонами

Автор: content Понедельник, Апрель 9th, 2012 Нет комментариев

Рубрика: Язык PHP

Полигон — это абстрактная геометрическая фигура, на которой основывается вся трехмерная компьютерная графика. С греческого языка слово «полигон» переводится как многоугольник.

Для рисования полигона используется функция imagepolygon.

int imagepolygon ( resource image, array points, int num_points, int color )

где,

  • image — идентификатор изображения;
  • points — массив точек;
  • num_points — количество точек в полигоне;
  • color — цвет.

Массив точек содержит X и Y координату каждой точки. Таким образом, для трех точек, массив содержит шесть элементов: Array( X1, Y1, X2, Y2, X3, Y3)

Пример 1. Вывод самого простого полигона (треугольник):

<?php
header ("Content-type: image/png");
$im = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($im, 255, 255, 255);

imagepolygon($im, Array(
	100,100,
	120,180,
	210,160,
	), 3, $ink);

imagepng($im);
imagedestroy($im);
?>

Результат работы этой программы выглядит следующим образом:

1Полигоны очень удобно использовать при работе с векторной графикой. Я использовал полигоны для отрисовки карты мира на сайте http://top.novgorod.ru/. Файлы с контурами стран я создавал в Adobe Photoshop с помощью «Paths» и экспортировал их встроенным плагином «Export Paths to Illustrator».

Ниже приведен пример программы, работающей подобным образом. В примере, вместо карты, используется силуэт Софийского Собора в Великом Новгороде.

Пример 2. Чтение файла Adobe Illustrator и вывод полигона:

<?php
// Ширина и высота изображения
$W=320;
$H=240;

// Чтения файла
$d=file("Sophia_Novgorod.ai");

// Если массив $d содержит только один элемент, // то в качестве переноса строк используется символ // возврата каретки, и нам необходимо разбить текст // на строку вручную
if (count($d)==1) $d=explode("\r",$d[0]);

// С помощью регулярного выражение выберем координаты // всех точек
$points=Array();
for ($i=0;$i<count($d);$i++)
	if (eregi("([0-9.]+) ([0-9.]+) [lm]",$d[$i],$r)) {
		$points[]=$r[1];
		$points[]=$r[2];
		}

// Найдем точки с самыми большими координатами. // Эти значения нам понадобятся для нормализации.
$maxw=$maxh=0;
for ($i=0;$i<count($points);$i+=2) {
	if ($maxw<$points[$i]) $maxw=$points[$i];
	if ($maxh<$points[$i+1]) $maxh=$points[$i+1];
	}

// Нормализуем значения координат.
for ($i=0;$i<count($points);$i+=2) {
	$points[$i]/=$maxw;
	$points[$i+1]/=$maxh;
	}

for ($i=0;$i<count($points);$i+=2) {
 // Отмасштабируем изображение
	$points[$i]*=($W-20);
	$points[$i+1]*=($H-20);

 // Сдвинем изображение
	$points[$i]+=10;
	$points[$i+1]=$H-$points[$i+1]-10;
	}

// Создадим изображение и выделим цвета
header ("Content-type: image/png");
$im = imagecreatetruecolor($W, $H);
$ink = imagecolorallocate($im, 255, 255, 255);

// Вывод полигона
imagepolygon($im, $points, count($points)/2, $ink);

imagepng($im);
imagedestroy($im);
?>

Результат работы этой программы выглядит следующим образом:

2Воспользуемся главным достоинством векторного изображения — увеличим его до 500×375, а потом и до 1024×768:

3Автор: mike (www.codenet.ru)

Источник: http://www.php.su/articles/?cat=graph&page=008

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты