拡張された描画 API では、パスの「ワインディング」の概念も導入されました。これは、パスの方向を表します。パスのワインディングは、正(時計回り)または負(反時計回り)のいずれかです。data パラメーターに対してベクターで提供される座標をレンダラーが解釈する順序により、ワインディングが決まります。
正のワインディングと負のワインディング
-
A.
-
矢印は描画の方向を示す。
-
B.
-
正のワインディング(時計回り)
-
C.
-
負のワインディング(反時計回り)
さらに、
Graphics.drawPath()
メソッドには「winding」という第 3 のオプションのパラメーターがあります。
drawPath(commands:Vector.<int>, data:Vector.<Number>, winding:String = "evenOdd"):void
このコンテキストでは、3 番目のパラメーターは交差するパスのワインディングつまり塗り規則を指定する文字列または定数です。定数値は、GraphicsPathWinding クラスで
GraphicsPathWinding.EVEN_ODD
または
GraphicsPathWinding.NON_ZERO
として定義されています。ワインディング規則は、パスが交差するときに重要です。
偶奇規則は、標準的なワインディング規則であり、以前の描画 API で使用されていた規則です。偶奇規則は、
Graphics.drawPath()
メソッドのデフォルトの規則でもあります。偶奇規則では、交差するすべてのパスは開いた塗りと閉じた塗りが交互になります。同じ塗りの交差を使用して 2 つの四角形を描画した場合、交差が発生している領域は塗りつぶされます。一般に、隣接する領域が、両方とも塗られること、または両方とも塗られないことはありません。
一方、非ゼロ規則は、ワインディング(描画方向)に基づいて、交差するパスによって定義されている領域を塗るかどうかを決定します。ワインディングが反対のパスが交差すると、定義される領域は塗られません。これは偶奇規則と同じです。ワインディングが同じパスの場合は、偶奇規則では塗られなかった領域が塗られます。
交差する領域のワインディング規則
-
A.
-
偶奇ワインディング規則
-
B.
-
非ゼロワインディング規則
ワインディング規則名
名前は、これらの塗りを管理する方法を定義する、より具体的な規則を示します。正のワインディングのパスには +1 という値が割り当てられます。負のワインディングのパスには -1 という値が割り当てられます。シェイプの閉じた領域内のポイントから開始して、外側に無限に延びる直線を描画します。その直線がパスと交差した回数と、これらのパスの組み合わされた値を使用して、塗りが決定されます。偶奇ワインディングの場合は、直線がパスと交差した回数が使用されます。回数が奇数の場合、領域は塗られます。回数が偶数の場合、領域は塗られません。非ゼロワインディングの場合は、パスに割り当てられている値が使用されます。パスの組み合わされた値が 0 でない場合、領域は塗られます。組み合わされた値が 0 の場合、領域は塗られません。
ワインディング規則の回数と塗り
-
A.
-
偶奇ワインディング規則
-
B.
-
非ゼロワインディング規則
ワインディング規則の使用
これらの塗り規則は複雑ですが、状況によっては必要になります。例えば、星のシェイプを描画するとします。標準の偶奇規則では、シェイプを描画するために 10 本の異なる線が必要です。非ゼロワインディング規則では、必要な線が 5 本に減ります。5 本の線と非ゼロワインディング規則を使用して星を描画する ActionScript を次に示します。
graphics.beginFill(0x60A0FF);
graphics.drawPath( Vector.<int>([1,2,2,2,2]), Vector.<Number>([66,10, 23,127, 122,50, 10,49, 109,127]), GraphicsPathWinding.NON_ZERO);
次のような星のシェイプが描画されます。
異なるワインディング規則を使用した星のシェイプ
-
A.
-
偶奇と 10 本の線
-
B.
-
偶奇と 5 本の線
-
C.
-
非ゼロと 5 本の線
また、イメージをアニメーション化するとき、または 3 次元のオブジェクトおよび重ね合わせでテクスチャとして使用するときは、ワインディング規則がいっそう重要になります。
|
|
|