• ベストアンサー

塗りつぶしモード ALTERNATEとWINDING

WINDOWSプログラミングで CreatePolygonRgnで多角形のリージョンを つくるときに、 http://www.kumei.ne.jp/c_lang/sdk2/sdk_126.htm にあるように、塗りつぶしモードがALTERNATEとWINDINGの2つあるのですが、 ALTERNATE:多角形の奇数番号の辺と偶数番号の辺の間を塗りつぶす WINDING:ワインディング値(多角形を描画するペンがリージョンの周囲を回る回数)が0でないリージョンを塗りつぶす という説明なんですが、意味がよくわからないでおります。 http://wisdom.sakura.ne.jp/system/winapi/win32/win29.html に描画例があるのですが、なんでこういう図になるのかがわかりません。 多角形の奇数番号の辺と偶数番号の円の間とは、どんな領域になるのでしょうか。回る回数が0でないとは、どういう意味になるのでしょうか。 ご存知の方いましたら教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

閉曲線 (多角形など) を塗りつぶすには,当然ながら内部と外部を区別する必要があります. 閉曲線が単純 (辺同士が交差・接触しない) ならば,その内部と外部の区別は自明ですが, 単純でない場合はあいまいになる場合があります. ALTERNATE と WINDING はどちらも,閉曲線の内部と外部を区別 (定義) するための規則です. ●ALTERNATE (交互) (図が崩れているので,テキストエディタにコピー&ペーストして固定幅フォントで見てください.)      ┏━━━━━━━━━━━━━━━━━┓      ┃ Y               ┃      ┃ ┏━━━┓   ┏━━┓    ┃  L   ┃ ┃ P ┃   ┃  ┃    ┃ ─────╂─╂─・ ┃   ┃  ┃    ┃C      ┃ ┃   ┃   ┃  ┃    ┃     W┗━╋━━━┛X  ┃  ┃    ┃        ┃       ┃  ┃    ┃        ┗━━━━━━━┛  ┃    ┃        Z          ┃    ┃                   ┗━━━━┛ ある点Pが閉曲線Cの内部にあるかどうかを判定したい場合,Pから無限遠に半直線Lを引き, それがCと何回交差するかを数えます.奇数回ならばPはCの内部,偶数回ならば外部にある と定義します.上の図の場合は2回なので,PはCの外部ということになります. 点が多角形の内部にある? http://bal4u.dip.jp/mt/program/archives/2004/11/_ph.html ●WINDING (巻) 閉曲線C上の点QがCを1周するとき,点Pのまわりを何回回るかにより内外を定義する方法. (1) Pが単純閉曲線Cの内部にある場合   ┏━━━━━┓C   ┃  P  ┃   ┃  ・  ┃   ┃     ・Q   ┗━━━━━┛   QがCを1周すると,Pのまわりを1回回る. (2) Pが閉曲線Cの「明らかに」外部にある場合   ┏━━━━━━━┓C   ┃ ┏━━━┓ ┃   ┃ ┃   ┃ ・Q   ┗━┛   ┃ ┃         ・P      ┏━━╋━┛      ┃  ┃      ┗━━┛   QがCを何周しようが,Pからみれば8時の方向と10時の方向の間をウロウロするだけで,   Pの回りを1周もすることはない.つまり巻数は0回. そこでPの回りを1周以上するとき内部と定義すれば,最初の ALTERNATE の図のPは ・多角形を描く順序が W→X→Y→Z (あるいはその逆) の場合:巻数は2なので内部. ・多角形を描く順序が W→Y→X→Z (あるいはその逆) の場合:巻数は0なので外部.

msndance
質問者

お礼

なるほど、これで理解しました。ありがとうございました。

その他の回答 (1)

noname#50176
noname#50176
回答No.1

まず、描画例の図を追跡しましょう。 【描画手順】 ?5→→→→6 1→→→2?↓ ↑↑??↓?↓ 8↑←←↓←7 ?4←←3 【走査手順】 ?3→→→→4 12→→↓?↓ ↑↑??↓?↓ A9←←6←5 ?8←←7 (A=10です) ずれて見にくいかもしれませんが、各数字が座標点です。 描画手順において、1>2>…7>8>1 の順で描画します。 これは一筆書きを1回したので塗りつぶすことが可能な多角図は 最低1回以上は始点と終点をたどってつなげますね。 これが0回抜きの意味です。 次に走査手順において、隣接して(直接つながって)いない辺は、 <奇数辺> (1、2)と(3,4)と(5,6)と(7,8)と(9、A) <偶数辺> (2,3)と(4,5)と(6,7)と(8,9)と(A,1) 奇数辺*偶数辺の四角短形を仮想的に作り、内部合成部分を抜きます。 (1,2,3)・・範囲外 (3,4,5)・・(3>4>5>9>3)-(2>6>9>2) (5,6,7)・・範囲外 (7,8,9)・・(7>8>9>6>7)(抜く合成部分なし) (9、A、1)・・(1>2>9>A>1)(抜く合成部分なし) これらを塗りつぶすのが、ALTERNATEモードです。 WINDINGモードは合成部分も塗りつぶしますが、 描画手順で、(1>2>7>6>5…)のように向かい合う辺 の線画方向が同一だと描画されないと言うことです。 かなり昔やったことなのでおぼろげですが、たぶん合ってると 思います。

msndance
質問者

お礼

丁寧なご回答、ありがとうございました。どちらも大変明瞭で、助かりましたが、こちらを次点として、締め切りさせていただきます。ありがとうございました。

関連するQ&A