0

我在 gd 库的imagefilledpolygon().

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

alt text http://www.degreeshowcase.com/other/1.gif 如果你看图片,你会看到一些点在形状内部......有些在外面......它非常不合逻辑。

(图片已按比例放大以使其更明显)

有没有人有办法解决吗?

更新:

我对上述形状的观点是:0,0 40,0 40,20 20,20 20,40 0,40

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

我已经制作了一个脚本来计算得到我想要的形状的要点,但我无法弄清楚为什么,所以我无法制定一个脚本来纠正我所有的形状。

<?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);


?>
4

3 回答 3

2

我的猜测是您将宽度与位置混淆了。

例如,从 0px 到 9px 的线是 10px 长...如果您使用长度作为第二个参数而不是位置,那么它最终会是 11px 长。

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

于 2009-10-12T11:14:18.650 回答
1

法线多边形渲染确保每个像素只能在一个多边形中,如果 2 个多边形共享一条边。如果您想象绘制 2 个正方形,彼此相邻,因此它们共享一个共同的边缘,您不希望沿该边缘渲染像素两次。

这里有一个关于确定多边形边缘的哪些像素应该被考虑在多边形内部的解释:http: //www.gameprogrammer.com/5-poly.html

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

于 2009-10-12T11:22:10.610 回答
1

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

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

于 2009-11-05T16:53:55.853 回答