ポリゴンの塗りつぶしを一般的に理解するには、エッジの方向、巻き取り順序、および選択したポリゴンの塗りつぶしルールを理解する必要があります。
エッジの方向は、頂点が宣言された順序によって決まります。例えば ...
Polygon poly= new Polygon();
poly.addPoint(10, 10);
poly.addPoint(100, 10);
poly.addPoint(100, 100);
poly.addPoint(10, 100);
ポリゴンは、隣接する頂点(頂点の順序付きリストから)を結合してエッジを形成することによって描画されます。リストの最後の頂点も最初の頂点に結合しています(リストが円形であるかのように)。上記のポリゴンの最初のエッジは、最初の2つの頂点(Point(10,10)とPoint(100,10))から構成されています。
ポリゴンが自己交差またはオーバーラップする場合は常に、ポリゴンがどのように描画されるかを理解するために、巻き取り順序と適用されるポリゴン塗りつぶしルールの両方についての知識が必要です。ポリゴンが重なると、ポリゴンのサブ領域が作成されます。これは、エッジで囲まれた個別の領域です。これらのサブ領域の巻き順序と適用されるポリゴン塗りつぶしルールによって、これらのサブ領域が塗りつぶされるかどうかが決まります。
(出典:angusj.com)
任意のポリゴンサブ領域の回転数は、次の方法で導き出すことができます。
- 巻線数をゼロに設定します
- 特定のサブ領域内にあるポイント(P1)から、1つまたは複数のポリゴン(P2)の外側にある別のポイントに架空の水平線を描画します。
- この線をP1からP2に移動しながら、この架空の線と交差するポリゴンエッジごとに、上に向かっている場合は巻き数を増やし、そうでない場合は巻き数を減らします。
Java Graphics2Dのドキュメントによると、fillPolygonは、奇数番号のサブ領域のみが塗りつぶされる偶数奇数の塗りつぶしルールのみを使用します。
(出典:angusj.com)