2012-03-29 1 views
1

Мне нужно рисовать непрерывные строки в PHP. Очевидно, что GD этого не может сделать, но у imagick есть функция полилинии. Теперь мой тестовый код:полилиния автозакрытия - как рисовать открытую полилинию?

$image = new Imagick(); 
$image->newImage(100, 100, new ImagickPixel('white')); 
$draw = new ImagickDraw(); 
$draw->setStrokeWidth(3); 
$line = array(
    array('x'=>10, 'y'=>10), 
    array('x'=>50, 'y'=>10), 
    array('x'=>70, 'y'=>40), 
    array('x'=>30, 'y'=>60), 
); 
$draw->polyline($line); 
$image->drawImage($draw); 
$image->setImageFormat('jpg'); 
$image->writeImage("test.jpg"); 

производит CLOSED (и заполненный) полигон по причинам, я не могу понять. Что здесь происходит и как это исправить? Я хочу, чтобы он остановился в последней точке и НЕ закрыл или не заполнил.

Если в GD есть решение, я тоже счастлив. Нет, я не могу просто сгруппировать отдельные строки, потому что мне нужна толщина линий.

ответ

1

можно нарисовать открытую ломаную линию, рисуя в одном направлении, а затем обратно с той же точкой таблицы, без первой и последней точки (они не необходимые)

так, если у вас есть

$line = array(
    array('x'=>10, 'y'=>10), 
    array('x'=>50, 'y'=>10), 
    array('x'=>70, 'y'=>40), 
    array('x'=>30, 'y'=>60), 
); 

вы должны добавить

$line[] = array('x'=>70, 'y'=>40); 
$line[] = array('x'=>50, 'y'=>10); 

, а затем

$draw->polyline($line); 

и вы получите то, что хотите.

+0

Это умный чувак. +1 –

0

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

Этот код будет работать, как задумано, то есть он производит зеркальное «с» образный объект с черными линиями 3 пикселей Ширина:

$image = new Imagick(); 
$image->newImage(100, 100, 'white'); 
$draw = new ImagickDraw(); 
$draw->setStrokeWidth(3); 
$draw->setStrokeColor ("black"); 
$draw->setFillColor ("none"); 
$line = array(
    array('x'=>10, 'y'=>10), 
    array('x'=>50, 'y'=>10), 
    array('x'=>70, 'y'=>40), 
    array('x'=>30, 'y'=>60), 
); 
$draw->polyline($line); 
$image->drawImage($draw); 
$image->writeImage("test.jpg");