我在使用gd库的imagefilledpolygon()时遇到了一些麻烦。
出于某种原因,我的一些线条最终不到1px,所以我决定使用imagepixelset调试它,将我的形状点的颜色设置为红色。
替代文字http://www.degreeshowcase.com/other/1.gif
如果你看一下图片你可以看到一些点在形状内...有些在外面......它非常不合逻辑。
(图片已按比例放大,以使其更加明显)
有没有人有办法解决吗?
更新:
我对上述形状的观点是:0,0 40,0 40,20 20,20 20,40 0,40
我要求所产生的形状的高度和宽度应该是20的倍数....但由于某种原因,一些形状最终高21或高。
我已经制作了一个脚本来弄清楚要获得我想要的形状的要点但是我无法弄清楚为什么,所以我无法找出一个脚本来纠正我的所有形状。
// 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);
?>
没有一些代码,我们对应该发生的事情一无所知。
舍入错误?
不能通过将整数乘以20来生成点的舍入误差...我将提供点
以下是要点:0,0 40,0 40,20 20,20 20,40 0,40
我的猜测是你把宽度和位置混在一起。
例如,从0px到9px的行是10px长...如果你使用长度作为第二个参数而不是位置,它将以11px长结束。
如果我能看到一些代码,我可以证实这一点。
我也想知道......但是构成这个形状的正方形都是20px乘20px而且我已经检查了它们都可以被20分割的点......
但是,对于多边形,不应该有任何宽度。只有轮廓点的位置。
你似乎部分正确......但有些要点不应该是"-1"......这很奇怪
想象一下,你的多边形只有1像素宽。 x坐标是什么? 0,1声音正确,但那是2像素。 0,0是正确的答案 - 那是1个像素
我跟那个目前正在开发GD库的人交谈,他解释说它遵循'绕组数算法' - 可以在这里找到。看了我的示例图像,它确实匹配'绕线数算法'的工作方式,但是该功能应该考虑到这一点并产生输入的形状。
据我所知,使用此功能准确(到像素)生成凹多边形的唯一方法是编写另一个函数,该函数也将缠绕规则应用于坐标并相应地调整它们然后将其放入函数中。
如果2个多边形共享边,则正常多边形渲染可确保每个像素只能位于一个多边形中。如果您想象绘制2个正方形,彼此相邻,所以它们共享一个公共边,您不希望沿该边渲染两次像素。
有一个解释,确定多边形边缘的哪些像素应该在多边形内部考虑:http://www.gameprogrammer.com/5-poly.html
一种常见的解决方案是说"多边形的左边和顶边上的像素属于多边形,右边缘和下边缘上的像素不属于"。我不是100%确定GD使用什么解决方案,因为我找不到任何文档,但我希望它与此类似。
我想我理解你的意思......在一个正方形中:左上角的像素完全是形状,右上角的像素是左侧的像素,右下角的像素是对角线接触的,左下方的像素触摸到顶部,但如果你看起来不那样......只有一个像素在外面
实际上,您的示例似乎没有遵循我可以确定的任何理智的像素选择规则,因此我不确定如何解释您所看到的结果。我们需要的是一些清晰的文档,它解释了GD库如何确定像素是在多边形内部还是外部。
我与GD库的创建者进行了交谈,他说这是基于绕组规则,这里解释了en.wikipedia.org/wiki/Point_in_polygon,标题为"绕组数算法"。绕组编号在这里解释en.wikipedia.org / wiki / Winding_number但我不能为我的生活弄清楚如何调整我的坐标以适应。
嗯,匝数系统用于渲染其中具有潜在孔的多边形,或者具有彼此交叉的边的多边形,而不是解决确定沿边缘的哪些像素被认为是内部和外部的特定问题。也许这是一个错误,并没有强制执行适当的规则。尝试绘制2个方块。第一个角落在(0,0)和(10,10),另一个角落在(10,10)和(20,20),看看你得到了什么......
凸起的形状使它完美无缺。我决定最后废弃它,我使用多个imagefilledrectabgles制作我的多边形,这是一种享受...感谢您的帮助:D