Работа с полигонами
Полигон — это абстрактная геометрическая фигура, на которой основывается вся трехмерная компьютерная графика. С греческого языка слово «полигон» переводится как многоугольник.
Для рисования полигона используется функция 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); ?>
Результат работы этой программы выглядит следующим образом:
Полигоны очень удобно использовать при работе с векторной графикой. Я использовал полигоны для отрисовки карты мира на сайте
Ниже приведен пример программы, работающей подобным образом. В примере, вместо карты, используется силуэт Софийского Собора в Великом Новгороде.
Пример 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); ?>
Результат работы этой программы выглядит следующим образом:
Воспользуемся главным достоинством векторного изображения — увеличим его до 500×375, а потом и до 1024×768:
Автор: mike (