1

私はキャンバスに描画された魚のリストがどこになるのかをプログラムを作成しようとしています。 (次のステップは、ある計算に基づいて魚の場所を変更します) 各魚はビットマップ(魚の画像を持つpngファイル7x12ピクセル)で表されます。

C#rotation(transformation)issue

私は自分の描画キャンバスであるPictureBoxのフォームを作成しました。サイズは640x480ピクセルです。

以下のコードは、私が使用する簡略化されたコードです(私は必要なものではありません)。私の問題は、現時点では回転だけで、トランスフォーメーションマトリックスです。

問題方法ドロー()私はそれぞれの魚のために回転30度を設定したが、後にそれぞれの魚があります現時点では、形質転換のを作るしようとしているクラスの魚であります異なる開始回転角。私は魚がその中心の回りの回転角によってどこに回転するかを変えたいと思う。したがって、この場合、すべての魚は1つの線にあり、それぞれの回転角度(ここでは30度)だけ回転しなければなりません。
しかし、それらは対角線に置かれているので、何らかの形で変換が乱れてしまいます。 これを修正するにはどうすればよいですか? 私はおそらくtansformation incorectlyを使用しています。授業で使用して

名前空間

using System.Drawing;//Graphics, Point 
using System.Drawing.Drawing2D;//Matrix 

class Fish { 
     public Point position; 
     public int rotation; 
     public Graphics g; 
     public Image fishImage; 
     private Rectangle rect; 
     private Matrix matrix; 

     public Fish(ref Graphics g, int x, int y, int rotation,Image img){ 
     this.g = g; 
     position = new Point(x,y); 
     this.rotation = rotation; 
     this.fishImage = img; 
     this.rect = new Rectangle(position.X,position.Y, fishImage.Width, fishImage.Height); 

     } 

    public void Draw() { 
    matrix = new Matrix(); 
    matrix.Rotate((float)rotation, Matrix.Append); //if i comment this it 
    //will be drawn in one line 
    //according to the initial values for position 
    //if i let the rotation here it will be on diagonale 
    //i want it on one line but rotated 
    g.Transform = matrix; 

    rect = new Rectangle(position.X, position.Y, fishImage.Width, fishImage.Height); 
    g.DrawImage(fishImage, rect); 
    } 
}//end Fish class 

フォーム

public partial class Form1 : Form 
{ 
private Bitmap canvasBitmap; //bitmap for drawing 
private Graphics g;   
Image fishImage; 

private List<Fish> fishes = new List<Fish>(); 
    public Form1() { 
    InitializeComponent(); 
    //png image 7x12 pixels 
    fishImage = FishGenetic.Properties.Resources.fishImage; 
    //on Form there is placed PictureBox called canvas 
    //so canvas is PictureBox 640x480 px 
    canvasBitmap = new Bitmap(canvas.Width, canvas.Height); 
    canvas.Image = canvasBitmap; 

    //prepare graphics 
    g = Graphics.FromImage(canvasBitmap); 
    g.SmoothingMode = SmoothingMode.AntiAlias; 

    InitFishes(); 
    DrawFishes(); 
    canvas.Invalidate(); //invalidate the canvas 

    }//end Form1 constructor  


private void InitFishes() { 

    Fish fish1 = new Fish(ref g, 10, 10, 30, fishImage); 
    Fish fish2 = new Fish(ref g, 20, 10, 30, fishImage); 
    Fish fish3 = new Fish(ref g, 30, 10, 30, fishImage); 
    Fish fish4 = new Fish(ref g, 40, 10, 30, fishImage); 
    Fish fish5 = new Fish(ref g, 50, 10, 30, fishImage); 
    fishes.Add(fish1); 
    fishes.Add(fish2); 
    fishes.Add(fish3); 
    fishes.Add(fish4); 
    fishes.Add(fish5); 
} 

private void DrawFishes() { 
    foreach(Fish fish in fishes) { 
     fish.Draw(); 
    } 
} 

}//end Form1 class 

メインクラス

static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 
+0

@x ...しかし、どうやってPaintイベントを使うべきですか?そのオーバーライド私は物事OnPaintメソッド、しかしどこですか?私はどのようなオブジェクトを意味するのですか?フォームにキャンバス(PictureBox)を作成するために使用するGrafic gにどのように接続されていますか? – user1097772

答えて

1

[回転]の代わりに[回転]を使用してください。 Rotateメソッドは、コントロール(原点)の左上隅にある魚を回転させ、RotateAtは指定されたポイントを中心に何かを回転させます。

各魚の中心を計算して(X =左+ FishWidth/2、Y =上+ FishHeight/2)、その点を中心に回転します。

+0

これは、回転を解決しますが、私はより多くの変換をしたいですか?例えばスケーリング?私はそれについて何かを学ぶために使用する、起源に移動するようなものがあった、tranformationsを行うと戻るか、何かのようなもの。 – user1097772

+1

(イメージの中点が0,0になるように)原点に移動し、その周りを回って移動して、いくつかの場所で見た例です。これはあなたが探しているローテーションを行う別の方法ですが、RotateAtを使用する方がはるかに明確です。ただし、変換を正しい順序で実行することが重要です。 [ここには良い記事があります](https://msdn.microsoft.com/en-us/library/eews39w7(v = vs.110).aspx)。実際には、GDN +関連の記事がMSDNでかなり多く見つかります。 – hankide

+0

e.Graphicsはどのように使用されていますか? OnPaintメソッドをオーバーライドする必要があることがわかりましたが、どのオブジェクトがどのように使用されていますか? ここではDrawメソッドを使用して描画するので、FishクラスのOnPaintメソッドやfish.Invalidate()と同じようになります。 – user1097772