座標変換

C#にて簡単なツールの作成中(一応仕事)。んで。コンピュータはY軸が上から下へ。逆に数学とか設計分野ではY軸は下から上。この違いにより、画面上に数学・設計の座標を表現するには

 Point( X, (描画領域の高さ - Y) ); // 例として点の描画

とかやる必要があるわけですが、描画ごとの引き算がしちめんどくさい&ややこしいので、こうしてみました。

  Graphics g = e.Graphics; // 言語C#です。
  // 描画座標系自体を変更
  g.TranslateTransform( 0.0F, 描画領域の高さ ); // 座標軸平行移動・下へずらす
  g.ScaleTransform( 1.0F, -1.0F );              // Y軸反転・上下を逆に

これで座標データのまま描画できるぜー、あたまいーいとか調子ぶっこいていたら。
⇒フォントの表示が上下あべこべになっちゃうわけですね。(元々フォントの描画は左上を基点に右下へ向けた領域を描画。それのY軸反転をしたら当然…)

描画座標系自体の移動&反転を不採用にしたくなかったので描画する文字列ごとに

  g.TranslateTransform( フォント開始点X, フォント開始点Y );  // 描画位置まで移動
  g.ScaleTransform( 1.0F, -1.0F );                           // 上下をもう一度逆
  g.DrawString( "TEXT", this.Font, brush, 0.0F, 0.0F );      // 移動済みなので(0,0)
  g.ScaleTransform( 1.0F, -1.0F );                           // さっきの上下をリセット
  g.TranslateTransform( -フォント開始点X, -フォント開始点Y );// さっきの移動をリセット 

こうするようにしてみた。処理コスト大丈夫かな。(汗