描画メソッドが終点を含むか含まないかを調べてみました

 

プログラムや仕様において、一貫性は大切ですが
使う「人」はワガママなので、時に少々変な仕様になる事もあります。

毎度、管理人イガジーです。

例えば、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なんだなと
なんとなく思える例ですね。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)