Работа с полигонами
Полигон - это абстрактная геометрическая фигура, на которой основывается вся трехмерная компьютерная графика. С греческого языка слово "полигон" переводится как многоугольник.
Для рисования полигона используется функция 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)
Пример 25. Вывод самого простого полигона (треугольник):
<?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); ?>
Результат работы этой программы выглядит следующим образом:
Полигоны очень удобно использовать при работе с векторной графикой. Я использовал полигоны для отрисовки карты мира на сайте http://top.novgorod.ru. Файлы с контурами стран я создавал в Adobe Photoshop с помощью "Paths" и экспортировал их встроенным плагином "Export Paths to Illustrator".
Ниже приведен пример программы, работающей подобным образом. В примере, вместо карты, используется силуэт Софийского Собора в Великом Новгороде.
Пример 26. Чтение файла 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); ?>
Результат работы этой программы выглядит следующим образом:
Воспользуемся главным достоинством векторного изображения увеличим его до 500x375, а потом и до 1024x768:
Все примеры к этому уроку можно скачать здесь.