折线自动关闭 - 如何绘制开放的折线?

Posted

技术标签:

【中文标题】折线自动关闭 - 如何绘制开放的折线?【英文标题】:polyline auto-closes - how to draw an open polyline? 【发布时间】:2012-03-29 10:46:00 【问题描述】:

我需要在 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有解决方案,我也很高兴。不,我不能简单地将单独的线条串在一起,因为我想要线条的粗细。

【问题讨论】:

【参考方案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);

你会得到你想要的。

【讨论】:

【参考方案2】:

看GD折线的文档。也许你想要的:http://bonzoli.com/sourcecode/index.php/man/GD::Polyline

【讨论】:

不幸的是,GD 的 PHP 接口没有公开 imagepolyline() 函数。【参考方案3】:

您应该同时定义描边和填充颜色,否则 Imagick 将使用填充颜色“填充”由线条和起点和终点限定的区域。这些值的默认值为“white”和“black”。

此代码将按预期工作,即它产生一个镜像的“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");

【讨论】:

以上是关于折线自动关闭 - 如何绘制开放的折线?的主要内容,如果未能解决你的问题,请参考以下文章

在图例折线图中找不到带有标签的句柄

如何在 JavaScript API 的 Google 地图中放置 10,000,000 个标记或折线 [关闭]

如何在柱状图中添加折线图

如何在谷歌地图的折线中点绘制标记?

excel中如何用一个图表绘制多条折线

如何在 watchOS WKInterfaceMap 上绘制折线?