2016年4月1日金曜日

C#のGraphicsのTransform

GraphicsのTransformで座標変換を行う。

例えば
gra.Clear(Color.DarkGreen);
gra.DrawLine(Pens.Lime, -50, -50, 50, 50);
gra.DrawLine(Pens.Lime, -50, 50, 50, -50);
というコードが合った場合、結果は以下のようになる。



本来はクロスを書いているのだが、負の座標は表示されない。しかし座標を負の位置でも扱い、Graphicsの方で座標変換をしてくれると助かる場合がある。ということでなんとかしてみる。

double deg = 45;
float scale = 1.00f;
float offsetX = 50;
float offsetY = 50;

double rad = deg * Math.PI / 180;
float sin = scale * (float)Math.Sin(rad);
float cos = scale * (float)Math.Cos(rad);

System.Drawing.Drawing2D.Matrix mtx = new System.Drawing.Drawing2D.Matrix(
    cos, sin,
    -sin, cos,
    offsetX, offsetY);

gra.Transform = mtx;

結果



CW方向の角度をdegreesで指定する。またscaleを指定することにより0.5fなら2分の1のサイズとなる。scaleを指定した場合でも、offsetは1/1で使用される。敵キャラのアイコンをX100,Y200の位置に5分の1の大きさで表示したいなら、offX=100; offY=200; scale=0.2f;のように指定すればいい。敵キャラを自キャラに向けたい場合は相対位置をatan2で角度に変換して渡せば自分の方を向くことになる。

Transformを使う注意点としては、上記のコードでは位置や角度は絶対位置で指定する点。なので自キャラの位置を表示するために座標を画面の中心に移動し、敵キャラを自キャラからの相対位置で指定する、といったことをするにはもう一工夫が必要となる。


0 件のコメント:

コメントを投稿