полилинии авто-закрытие - как нарисовать открытую полилинию? - PullRequest
1 голос
/ 29 марта 2012

Мне нужно рисовать непрерывные линии в 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");

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

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

Ответы [ 3 ]

1 голос
/ 21 декабря 2012

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

, поэтому, если у вас есть

$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 голосов
/ 28 мая 2017

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

Этот код будет работать так, как задумано, то есть он создает зеркальный объект в форме буквы "c" с черными линиями шириной 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");
0 голосов
/ 29 марта 2012

Смотрит документацию по полилинии GD. Возможно это то, что вы хотите: http://bonzoli.com/sourcecode/index.php/man/GD::Polyline

...