Работа с полигонами
Полигон - это абстрактная геометрическая фигура, на которой
основывается вся трехмерная компьютерная графика. С греческого языка
слово "полигон" переводится как многоугольник.
Для рисования полигона используется функция
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:
Все примеры к этому уроку можно скачать здесь.
Автор: mike
Источник: www.codenet.ru
|