座標の誤差について


 次のプログラムのように座標を指定すると、思ったように結果が得られないことがあります。

線太さは1
塗りスタイルは「透明」
線色は黒色
0,0から100,100へ四角
0,0から100,100へ円
線色は緑色
0,0から100,100へ線
線色は赤色
0,100から100,100へ線
100,0から100,100へ線

線色は黒色
100,250から0,150へ四角
100,250から0,150へ円
線色は緑色
100,250から0,150へ線
線色は赤色
100,150から0,150へ線
0,250から0,150へ線

 上の図では、四角形の右辺と下辺を赤い線にするつもりでしたが、赤い線が四角に接しています。
 同じ座標を指定したのに。。。
 下の図では、四角形の左辺と上辺を赤い線にするつもりでしたが、少しはみ出しています。しかも左上角は赤くなっていません。

 どうしてこうなるのでしょうか?

 調べたところ、四角形と円を描く際に、始点(左上)x1,y1と終点(右下)x2,y2を指定するのですが、このx2,y2の座標値がそれぞれ(-1)されていることが分かりました。
 下の図では始点を右下、終点を左下にしていますが、この場合右下の座標値x1,y1が(-1)されています。

 また、直線を描く際にも、終点のx2,y2の座標値がそれぞれ(-1)されていました。上の図をよく見ると、四角の右下角で赤い直線がつながっていません。
 さらに、下の図では、直線の場合は終点を左上にすると(+1)されます。

 まとめると、x1,y1からx2,y2へ指定する場合、

描画 左→右 左←右 上↓下 上↑下
四角 x2-1 x1-1 y2-1 y1-1
x2-1 x1-1 y2-1 y1-1
x2-1 x2+1 y2-1 y2+1

 なんだか、手前で寸止めされているようですな。

クジラ飛行机さんの説明

さて、質問の件なのですが、これなんですが、
Windows APIの特性です。

基本的に、なでしこは、Delphiの命令をそのまま
使っているのですが、描画関連においては、
Delphiのライブラリは、Windows APIを呼んでいるだけです。

私も、時々、オヤッと思うことがあるのですが、
矩形(+円)を描画するときは、-1されるようです。

昔、直そうかと思ったこともあるのですが、Delphiのライブラリも
そのままなので、いろいろと面倒なことがあるかもと思って、
そのままになっています。

。。。だそうです。

回避策

0,0から101,101へ四角
のように、ひとつひとつの動作を確認しながら、自分で対処するしかないようです。
最終更新:2009年10月23日 16:09