●前回まで
[画像処理](x1,y1,x2,y2) vs (x,y,width,height)
[画像処理](x1,y1,x2,y2) vs (x,y,width,height) その2
※以下PnPとPnSは私の造語です。
PnP・・・Point and Point。座標2つで矩形領域を表す方式
PnS・・・Point and Size。座標1つと領域のサイズで矩形領域を表す方式
(3/18 1:00 「長方形」という表現を「矩形」に改めました。 恣意のさんご指摘ありがとうございました。)
前回までの私の書き方もまずかったのですが、
注意深く考えるとこの話には2つの問題が隠れています。
1.PnPとPnSの違いでミスをする、という話
つまりこれが一般的なPnPとPnSの話です。
まずPnPとPnSの違いは第3第4引数が座標か大きさかという違いです。
第3引数=第1引数+大きさ横、第4引数=第2引数+大きさ縦
なのか
第3引数=大きさ横、第4引数=大きさ縦
なのか。
サイズを先に頭に思い描いた時、PnPでは足し算という手間が発生しうっかりミスをする、という問題になるかと思います。
(逆に2点を先に思い描けばPnSで引き算が発生します。同じことです。)
VS2008環境なら引数リストはヒントで表示されますので、
よっぽど慌てなければ間違うことは少ないと思います。
ということは・・・この問題は「慣れればどっちでもよい」で解決!?(汗
2.実際の図形の大きさが分からないという話
一般的なPnPとPnSの比較で考察を進めようと思ったんですが、
あまりこの2つの間に対立している技術ってなさそうですね??
なのでGDI vs GDI+の話に当面なりそうです。
そしてGDI vs GDI+の話になればPnPとPnSの違いよりも
ここで取り上げる描画ルーチンの特性の違いの話の方が問題は大きそうです。
まず最終目標を「横4ドット縦3ドットの矩形を表示する」とします。
第1第2引数が0であればPnPとPnSの違いによる足し算問題は
考慮しなくてすみますので左上は原点(0,0)としましょう。
矩形の描画はGDIに1種類、GDI+には2種類用意されています。(※1)
GDI:Rectangle(hdc, x1, y1, x2, y2)
GDI+:Graphics.DrawRectangle(pen, x, y, width, height)
GDI+:Graphics.FillRectangle(pen, x, y, width, height)
さてこれらにどういう引数を渡せば最終目標をディスプレーに実現できるでしょうか?
答えがすぐに分かる人は相当にGDI/GDI+に慣れ親しんだ方でしょう。
※1:
この種類数の違いは思想(発想)の違いにあります。
GDIに機能が少ないわけではありません。
ここではGDIのメソッドはGDI+の2つのメソッドの機能を
合わせ持っているという感じの理解でいいです。
(私はそれで困った事はないです)
答えは、
GDI:Rectangle(hdc, 0, 0, 4, 3)
GDI+:Graphics.DrawRectangle(pen, 0, 0, 3, 2)
GDI+:Graphics.FillRectangle(pen, 0, 0, 4, 3)
いつもの注意:
ここに書いている事柄は一度は必ず実物でご確認ください。
前エントリーに示したPnPPnSを使えば簡単に確認できます。
あるいは私のプログラムに頼らず自作するのも素敵だと思います。
確認せずに納得・推論を進める事は自己責任でお願いいたします。
さてこの結果を見ていくつか疑問が出てきませんか?
疑問1
GDIはPnPなので第3第4引数は右下座標のはず。どうして(・・・3,2)とならないのか?
疑問2
GDI+のDrawRectangleは第3第4引数は大きさのはず。どうして(・・・4,3)とならないのか?
疑問3
FillRectangleは”大きさ”という意味では(・・・4,3)で合っている。
しかしDrawRectangleと同じ数値でないのは変じゃないのか?
●疑問がでてしまうのは・・・
これは、そもそも画像処理ライブラリが「何を描画して」いるのかを理解していないために起きる疑問でした。
私は頭では色々と理解はしているつもりですよ。
でもやっぱりお手軽に画像処理を楽しみたいってのも私にはあります。
そこらへんをあえてブラックボックスとしてフィーリングで何とか理解できないかなあって思っていたりもします。
●続きは次のエントリーへ
全然進展してませんねえ。まあ今私UMLの勉強中であまり面白そうなことがおもいつかないのですよ。なのでしばらくこんなエントリーばっかりかもです(すみません)
●本日のアテにならないかも「知れない」
・GDI+はWindowなどのPnS思想にただ合わせただけかも知れない。
・GDI+はJavaの描画にただ合わせただけかも知れない。