Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как нарисовать многоугольник?
 
 автор: coloboc66   (12.03.2008 в 16:11)   письмо автору
 
 

К примеру, мне нужен 5-ти угольник. Можно ли в РНР динамически нарисовать такой многоугольник и задать для рисования размеры сторон в пикселах и углы (в градусах или как)?
Спасибо.

   
 
 автор: sim5   (12.03.2008 в 17:02)   письмо автору
 
   для: coloboc66   (12.03.2008 в 16:11)
 

Способы:
imagefilledpolygon()
imagepolygon()
imageline()

   
 
 автор: coloboc66   (12.03.2008 в 17:38)   письмо автору
 
   для: sim5   (12.03.2008 в 17:02)
 

Почему пример не работает???
<?
// создаем изображение 400x300
$image imagecreate(400300);

// устанавливаем цвет бордюра многоугольника
$col_poly imagecolorallocate($image255255255);

// рисуем многоугольник
imagepolygon($image, array (00,100200,300200),3$col_poly);

// вывод картинки в браузер
header("Content-type: image/png");
imagepng($image);
?>

   
 
 автор: cheops   (12.03.2008 в 17:49)   письмо автору
 
   для: coloboc66   (12.03.2008 в 17:38)
 

Ошибки какие-нибудь выводятся?

   
 
 автор: coloboc66   (12.03.2008 в 17:52)   письмо автору
 
   для: cheops   (12.03.2008 в 17:49)
 

Никаких. Просто белая пустая страница.

   
 
 автор: sim5   (12.03.2008 в 18:13)   письмо автору
 
   для: coloboc66   (12.03.2008 в 17:52)
 

А потому, что нужно задать фон, на котором вы рисовать собрались:

<?
// создаем изображение 400x300 
$im imagecreatetruecolor(400300); 
//заливаем фон
imagecolorallocate($im000);
//устанавливаем цвет бордюра многоугольника 
$col_poly imagecolorallocate($im255255255); 
// рисуем многоугольник 
imagepolygon($im, array (00,100200,300200),3$col_poly); 
// вывод картинки в браузер 
header("Content-type: image/png"); 
imagepng($im);
?>

   
 
 автор: Max Vasin   (12.03.2008 в 18:17)   письмо автору
 
   для: coloboc66   (12.03.2008 в 16:11)
 

$img = imagecreatetruecolor(500, 500);
$col_poly = imagecolorallocate($img, 255, 255, 255);
imagepolygon($img, array (
        0,   0,
        100, 200,
        350, 200,
    100, 50,
    150, 20
    
    ),
    5,
    $col_poly);


header("Content-type: image/png");
imagepng($img);
imagedestroy($img);


----
Regards, Max Vasin.

   
 
 автор: coloboc66   (13.03.2008 в 09:08)   письмо автору
 
   для: Max Vasin   (12.03.2008 в 18:17)
 

А без фона (холста) никак нельзя? И он обязательно должен быть прямоугольным? А как бы так сделать, чтобы фон повторял форму многоугольника, т.е. чтобы можно было наложить на страницу не прямоугольник, а многоугольник?

   
 
 автор: vitali   (13.03.2008 в 10:04)   письмо автору
 
   для: coloboc66   (13.03.2008 в 09:08)
 

Развлекитесь:

<?php ## Рисование заполненного текстурой многоугольника 
/**
** (кол-во углов вычисляются с помощью генератора случайных чисел после каждого обновления страницы)
**/
  
$fname "…/fon.jpg"// Ваша текстура многоугольника
$tile imagecreatefromjpeg($fname); //текстура фона
$image imagecreatetruecolor(800800); //создаем палитру
imagefill($image00imagecolorallocate($image02550)); //закрашиваем область определ.(.)0,0
imagesettile($image$tile); //заполняем образ текстурой
// установление массива точек для многоугольника (set up array of points for polygon)
$p = array();
for (
$i=0$i<9$i++)
 {
   
array_push($pmt_rand(0imagesx($image)), mt_rand(0imagesy($image)));
   
//Добавляем произвольные эл-ты в конец массива
 
}

// Рисуем заполненный многоугольник (draw a polygon)
imagefilledpolygon($image$pcount($p)/2IMG_COLOR_TILED);

// flush image
header('Content-type: image/jpeg');
imagejpeg($image''100); //качество картинки = 100
imagedestroy($image);
?>

   
 
 автор: coloboc66   (13.03.2008 в 11:07)   письмо автору
 
   для: vitali   (13.03.2008 в 10:04)
 

За предложение поразвлечься спасибо, но мне нужно решить конкретную задачу: по массиву точек построить многоугольник и наложить его в определённое координатами х и у место страницы. Как это сделать? Во-первых, мешает непрозрачный холст, потому что сам по себе холст мне на странице не нужен...

   
 
 автор: sim5   (13.03.2008 в 11:38)   письмо автору
 
   для: coloboc66   (13.03.2008 в 11:07)
 

Цвет холста (а без него никак нельзя) берете равный цвету страницы, получаете картинку верхние левые координаты которой привязываете к заданным Х, Y на странице.

   
 
 автор: coloboc66   (13.03.2008 в 11:55)   письмо автору
 
   для: sim5   (13.03.2008 в 11:38)
 

Почему-то цвет холста (фона) не делается белым?
$img = imagecreatetruecolor(400, 300);  
//заливаем фон 
imagecolorallocate($img, 255, 255, 255);   
// рисуем многоугольник   
$color = imagecolorallocate($img, 0, 0, 255); 
imagefilledpolygon($img, array ( 
        0,   0, 
        100, 200, 
        350, 200, 
    100, 50, 
    150, 20 
     
    ), 
    5, 
    $color); 
imagepng($img,'img1.png'); 
imagedestroy($img);
echo "<img src='img1.png'>";

   
 
 автор: vitali   (13.03.2008 в 11:55)   письмо автору
 
   для: coloboc66   (13.03.2008 в 11:07)
 

1) Как построить многоугольник из массива точек - это понятно из предложенных примеров.
2) наложить его в определённое координатами х и у место страницы?
Громоздкий вариант:
- сохранить картинку в /tmp (не забыть в конце работы файл удалить);
- затем используя контейнер <div с указанныими координатами> <img src="/tmp/имя_картинки"> ...</div> поместить в указанное место.
3) мешает непрозрачный холст?
А его нельзя убить функцией imagecolortransparent() -- Определение цвета как прозрачный?

   
 
 автор: coloboc66   (13.03.2008 в 11:58)   письмо автору
 
   для: vitali   (13.03.2008 в 11:55)
 

Может и можно, только у меня пока не получается с приведенным выше примером.

   
 
 автор: vitali   (13.03.2008 в 13:22)   письмо автору
 
   для: coloboc66   (13.03.2008 в 11:58)
 

Ответ наверное здесь:
Замечание: Задание прозрачного цвета поддерживают только палитровые изображения, но не полноцветные
т.е изображения созданные imageCreateFromJpeg() или imageCreateTrueColor() не могут его
содержать
Пример: $ts = imagecolorclosest($im, 0, 255, 0);
imagecolortransparent($im, $ts);

   
 
 автор: coloboc66   (13.03.2008 в 15:44)   письмо автору
 
   для: vitali   (13.03.2008 в 13:22)
 

Ну хорошо, а вот такой вопрос: у меня координаты для вершин многоугольника хранятся в файле в виде строк вида:
one|535,195, 556,197, 562,212, 538,220
two|535,220, 569,220, 562,231, 541,231
Я делаю так:
$items_arr=file('fname.dat');
foreach($items_arr as $row)
{
$row=stripslashes(trim($row));
$row=explode('|',$row);
$arr_coords=explode(',',$row[1]);
$width=...; $height=...; //тут вычисляю размеры холста
$img = imagecreatetruecolor($width,$height);   
$white=imagecolorallocate($img, 255, 255, 255); 
imagefill($img,0,0,$white);     
$color = imagecolorallocate($img, 0, 0, 255); 
//imageColorTransparent($img,$white);
imagefilledpolygon($img,$arr_coords,count($arr_coords)/2,$color); 
imagepng($img,"i/$row[0].png"); 
imagedestroy($img);
echo "<img src=i/$row[0].png />";
}

Но в итоге получаю только пустые холсты. Правильный ли у меня синтаксис для функции imagefilledpolygon() ???

   
 
 автор: vitali   (13.03.2008 в 16:31)   письмо автору
 
   для: coloboc66   (13.03.2008 в 15:44)
 

Синтаксис:
imagefilledpolygon() -- Рисование заполненного многоугольника
(Draw a filled polygon)
Описание: bool imagefilledpolygon ( resource image, array points, int num_points, int color )
Создание заполненного многоугольника в изображении

Список параметров
image - Ресурс изображения, возвращанный одной из функций создания изображениq, как например,
imagecreatetruecolor()
points - Массив, содержащий x и y координаты граней многоугольника последовательно, т.е
точки[0] = x0, точки[1] = y0, точки[2] = x1, точки[3] = y1, и т.п.
num_points - Общее число точек (граней) Total number of points (vertices). Общее число граней,
должно быть большим чем 3
color - Цветной идентификатор созданный imagecolorallocate()

Проверьте на корректность Ваш массив, который Вы сформировали из файла.
И палитру сделайте не полноцветной, если хотите иметь прозрачность.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования