nikeeshi のコーディング記

コーディングの成果をはっつけるとこ。このブログにあるソースコードはNYSL Version 0.9982に従い公開します(2014/06/18)。

C#のDrawRectangleとFillRectangleに関するメモ

前書き

C#でDrawRectangleとFillRectangleを組み合わせて枠付き矩形を描画しようとしたらなんかずれるぞ💢💢ってなってちょっと実験してみた。

実験

x,y=50,60の目安を引いた(金色)。

黒の矩形はDrawRectangleで描画、矩形は(50,50,3,3)で指定。

赤の矩形はDrawRectanglesで描画、矩形は(55F,50F,3F,3F)で指定。

緑の矩形はFillRectangleで描画、矩形は(60,50,3,3)で指定。

すると以下のようになる。なんだこのずれは💢💢

f:id:nikeeshi:20151216120547p:plain

考察

画素の座標が整数か端数に0.5がつくかわからないが、整数だと仮定して話をすることにしよう。 矩形の各値を(x,y,w,h)って呼ぶ。

DrawRectangle(s)は[x,x+w][y,y+h]の矩形を塗るらしい。 一辺はw+1,h+1となるので気持ち悪い。半開区間で設定させてくれ。 ちなみに線の太さが1だからこうなるのであって2にすると[x-1,x+w][y-1,y+h]を塗りだす。

FillRectangleは[x,x+w)*[y,y+h)の矩形を塗りつぶす。 一辺はw,hとなるのできりが良い。

まとめ

Drawの方はあくまで線を引く意識でつくってるのでこうなるのではないか。 外側をきっちりしたいなら線の太さを考えて書くかFillを使うべきなのかもしれない。

あとがき

DrawRectangleは整数座標なのに配列版は小数を許していたり、 線を書くのに使うPenはクラスなのに塗るBrushはインターフェースだったり、 ライブラリに一貫性がなくて非常に気味が悪い。