0

gd ライブラリのimagefilledpolygon().

何らかの理由で、一部の行が 1 ピクセルずれてしまうので、imagepixelset を使用してデバッグし、シェイプ ポイントの色を赤に設定することにしました。

代替テキスト http://www.degreeshowcase.com/other/1.gif 写真を見ると、いくつかの点が形状の内側にあることがわかります...いくつかは外側にあります....非常に非論理的です。

(画像は見やすいように拡大してあります)

誰にも解決策がありますか?

アップデート:

上記の形状のポイントは次のとおりです。0,0 40,0 40,20 20,20 20,40 0,40

生成される形状の高さと幅は 20 の倍数である必要があります....しかし、何らかの理由で形状の一部が 21 ピクセルの高さまたは幅になってしまいます。

必要な形状を取得するためのポイントを解決するためのスクリプトを作成しましたが、その理由を解決できないため、すべての形状を修正するためのスクリプトを作成できません。

<?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 です。位置の代わりに長さを 2 番目のパラメータとして使用すると、長さは 11px になります。

いくつかのコードを見ることができれば、これを確認できます。

于 2009-10-12T11:14:18.650 に答える
1

通常のポリゴンレンダリングでは、2つのポリゴンがエッジを共有している場合、各ピクセルは1つのポリゴンにのみ存在できます。2つの正方形を隣り合わせに描画し、それらが共通のエッジを共有することを想像する場合、そのエッジに沿ってピクセルを2回レンダリングすることは望ましくありません。

ポリゴンのエッジ上のどのピクセルをポリゴン内で考慮する必要があるかを決定するための説明がここにあります:http://www.gameprogrammer.com/5-poly.html

一般的な解決策は、「ポリゴンの左端と上端のピクセルはポリゴンに属し、右端と下端のピクセルは属さない」と言うことです。ドキュメントが見つからなかったため、GDがどのソリューションを使用しているかは100%わかりませんが、これに似たものになると思います。

于 2009-10-12T11:22:10.610 に答える
1

現在 GD ライブラリを開発している担当者に話を聞いたところ、GD ライブラリは「巻数アルゴリズム」に従っていると説明されまし。サンプル画像を見ると、「巻数アルゴリズム」の仕組みと一致していますが、関数はこれを考慮して、入力された形状を生成する必要があります。

私が見ることができる限り、この関数で凹面ポリゴンを正確に (ピクセルまで) 生成する唯一の方法は、ワインディング ルールを座標に適用し、それに応じて調整してから関数に入れる別の関数を作成することです。

于 2009-11-05T16:53:55.853 に答える