CodeNet - все для программиста!CodeNet - 10 лет - мегавстреча!
Все для программиста!
  Статьи   Форум   Исходники   Каталог   Хостинг   IRC  
 Справочник функций

Ваш аккаунт

Логин:
Пароль:

Забыли пароль?
Регистрация

Почтовая рассылка



Подписчиков: 6553
(Из них RSS: 0)

Последний выпуск: 22.06.2010

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

Автор: mike, www.codenet.ru
8 марта 2005 года

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

Для рисования полигона используется функция 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:

Все примеры к этому уроку можно скачать здесь.

Смотрите также:


Назад | Оглавление | Далее

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

Оставлять комментарии могут только зарегистрированные пользователи.

Если вы не являетесь зарегистрированным пользователем, то вам необходимо зарегистрироваться. Регистрация бесплатна. Если вы уже зарегистрированы на CodeNet, то вам необходимо ввести логин и пароль в верхней (Alt-U) части страницы.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог