描画メソッドが終点を含むか含まないかを調べてみました
プログラムや仕様において、一貫性は大切ですが
使う「人」はワガママなので、時に少々変な仕様になる事もあります。
毎度、管理人イガジーです。
例えば、JavaのCalenderにおける年月日では、「月」だけが0始まりです。
(「日」や「曜日」は1始まり)
一貫性が無いのですが、これはこれで使いやすかったりします。
Javaグラフィックの描画メソッドも、始点−終点指定のものと、始点−長さ指定のものがあります。
drawLine()は、始点−終点 で、終点を含みます。
drawRect()は、始点−長さ で、終点を含みます。
fillRect()は、始点−長さ で、終点を含みません。
上図は、描画ドットを拡大したものです。
g.drawLine(0,y, 0,y)の左にあるのが「1ドット」の点です。
始点=終点 として、drawLine()で線をひくと「1ドットの点」が描画されます。
(0,0)-(3,0) にdrawLine()すると、4ドットの線になります(終点を含むので)。
同様に (0,0)から「長さ=3」で、drawRect()すると、1辺が4ドットの四角形になります。
ところが、(0,0)から「長さ=3」で、fillRect()すると、1辺が3ドットの四角形になります。
drawImage(描画先座標始点−終点, 元画像座標始点−終点)は終点を含みません。
(10,10)-(13,13)を(0,0)-(3,3)にdrawImage()した場合、3ドットの四角形が描画されます。
(10,10)-(13,13)を(0,0)-(6,6)にdrawImage()すると、縦横それぞれ倍に拡大され
6ドットの四角形が描画されます。
ややこしいのですが、実際に使ってみると、あまり細かく考えなくて済むような
仕様になっていることが分かります(妙に悩むとワケがわからなくなる)。
仕様の一貫性よりも、使いやすいように、というのがJavaなんだなと
なんとなく思える例ですね。
この記事へのコメントはこちら