PHP-多边形GD库中的错误?

PHP-多边形GD库中的错误?,php,gd,shape,Php,Gd,Shape,我在gd图书馆遇到了一些麻烦 由于某些原因,我的一些线条最终出现了1px的错位,因此我决定使用imagepixelset对其进行调试,以将形状点的颜色设置为红色 如果你看图片,你可以看到一些点在形状里面。。。有些人在外面……这很不合逻辑 (图片已放大以使其更可见) 有人有解决办法吗 更新: 我对上面形状的分数是:0,040,040,2020,020,400,40 我要求制作的形状的高度和宽度应该是20的倍数。。。。但由于某些原因,某些形状最终会达到21px高或宽 我已经做了一个脚本来计算得到我

我在gd图书馆遇到了一些麻烦

由于某些原因,我的一些线条最终出现了1px的错位,因此我决定使用imagepixelset对其进行调试,以将形状点的颜色设置为红色

如果你看图片,你可以看到一些点在形状里面。。。有些人在外面……这很不合逻辑

(图片已放大以使其更可见)

有人有解决办法吗

更新:

我对上面形状的分数是:0,040,040,2020,020,400,40

我要求制作的形状的高度和宽度应该是20的倍数。。。。但由于某些原因,某些形状最终会达到21px高或宽

我已经做了一个脚本来计算得到我想要的形状的要点,但是我不能计算出原因,所以我不能计算出一个脚本来纠正我所有的形状

<?php

// set up array of points for polygon
$values = array(0,0, 39,0, 39,20, 19,20, 19,39, 0,39);

//My original values were 0,0 40,0 40,20 20,20 20,40 0,40
//I do not understand why some values require minus 1 and others can remain as they were (a multiple of 20)

// create image
$image = imagecreatetruecolor(40, 40);

// allocate colors
$bg   = imagecolorallocate($image, 200, 200, 200);
$blue = imagecolorallocate($image, 0, 0, 255);

// fill the background
imagefilledrectangle($image, 0, 0, 39, 39, $bg);

// draw a polygon
imagefilledpolygon($image, $values, 6, $blue);

// flush image
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);


?>

我猜你把宽度和位置弄混了

例如,从0px到9px的一条线的长度是10px。。。如果使用length作为第二个参数而不是position,它的长度将达到11px


如果我能看到一些代码,我可以证实这一点。

我猜你把宽度和位置弄混了

例如,从0px到9px的一条线的长度是10px。。。如果使用length作为第二个参数而不是position,它的长度将达到11px


如果我能看到一些代码,我可以确认这一点。

如果两个多边形共享一条边,则法线多边形渲染确保每个像素只能位于一个多边形中。如果设想绘制两个相邻的正方形,使它们共享一条公共边,则不希望沿该边渲染两次像素

这里有一个关于确定多边形边缘上的哪些像素应在多边形内部考虑的解释:


一个常见的解决方案是说“多边形左边缘和上边缘的像素属于该多边形,而右边缘和下边缘的像素不属于该多边形”。我不能100%确定GD使用什么解决方案,因为我找不到任何关于它的文档,但我希望它与此类似。

如果两个多边形共享一条边,则法线多边形渲染确保每个像素只能位于一个多边形中。如果设想绘制两个相邻的正方形,使它们共享一条公共边,则不希望沿该边渲染两次像素

这里有一个关于确定多边形边缘上的哪些像素应在多边形内部考虑的解释:


一个常见的解决方案是说“多边形左边缘和上边缘的像素属于该多边形,而右边缘和下边缘的像素不属于该多边形”。我不能100%确定GD使用什么解决方案,因为我找不到任何关于它的文档,但我希望它与此类似。

我与目前开发GD库的人交谈,他解释说它遵循“卷绕数算法”——可以找到。查看我的示例图像后,它确实与“卷绕数算法”的工作方式相匹配,但是函数应该考虑到这一点,并生成输入的形状


就我所知,唯一能精确(到像素)的方法使用此函数生成凹多边形是为了编写另一个函数,该函数也将卷绕规则应用于坐标,并相应地调整坐标,然后将其放入函数。

我与当前开发GD库的人交谈,他解释说它遵循“卷绕数算法”——可以找到。查看我的示例图像后,它确实与“卷绕数算法”的工作方式相匹配,但是函数应该考虑到这一点,并生成输入的形状



据我所知,使用此函数准确(对像素)生成凹多边形的唯一方法是编写另一个函数,该函数也将缠绕规则应用于坐标,并相应地调整坐标,然后将其放入函数中。

无需一些代码,我们不知道应该发生什么。不可能是舍入误差点是由一个整数乘以20生成的。。。等一下,我会提供点。我们是点:0,0 40,0 40,20,20,40 0,40如果没有一些代码,我们不知道应该发生什么。不可能是舍入错误。点是由整数乘以20生成的。。。等一下,我会提供点。我们是点:0,0 40,0 40,20 20,20,40,0,40我也想知道。。。但是组成形状的正方形都是20px乘20px,我已经检查了它们都可以除以20的点……但是对于多边形,不应该有任何宽度。只有轮廓点的位置。你似乎部分正确。。。但有些要点不应该是“-1”。。。很奇怪,假设你的多边形只有1个像素宽。x坐标是多少?0,1听起来不错,但那是2像素。0,0是正确的答案-这是1像素,我也想知道。。。但是组成形状的正方形都是20px乘20px,我已经检查了它们都可以除以20的点……但是对于多边形,不应该有任何宽度。只有轮廓点的位置。你似乎部分正确。。。但有些要点不应该是“-1”。。。很奇怪,假设你的多边形只有1个像素宽。x坐标是多少?0,1听起来不错,但那是2像素。0,0是正确的答案-这是1像素我想我理解你的意思。。。在正方形中:左上角的像素完全处于形状中,右上角的像素与左侧接触,右下角的像素与对角线接触,左下角的像素与顶部接触,但如果你看起来不是这样。。。实际上,你的例子似乎没有遵循任何我能确定的合理的像素选择规则,所以我不知道如何解释你看到的结果。我们需要的是一些清晰的文档来解释