C#旋转(转换)问题

本文关键字:问题 转换 旋转 | 更新日期: 2023-09-27 17:58:18

我正在尝试创建一个程序,其中将显示画布上绘制的鱼类列表。(下一步将根据一些计算更改鱼类的位置)每条鱼都用位图表示(png文件7x12px,带有鱼的图片)

我创建了Form,上面是PictureBox,这是我的绘画画布。它的大小为640x480像素

下面的代码是我使用的简化代码(我删掉了所有不必要的东西)。我的问题是关于变换矩阵,目前只涉及旋转

问题出现在类Fish方法Draw()中,我试图进行转换,当时我为每条鱼设置了30度的旋转,但后来每条鱼都会有不同的开始旋转角度。我想做一个变换,鱼将在哪里旋转,旋转角度围绕它的中心。所以在这种情况下,所有的鱼都应该在一条线上,并按其旋转角度(这里是30度)旋转
但它们被放在对角线上,所以变换不知怎么搞砸了。我该怎么解决这个问题我可能是在不正确地使用晒黑

类中使用的命名空间

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());
        }
    }

C#旋转(转换)问题

您应该使用RotateAt而不是Rotate。Rotate方法围绕控件(原点)的左上角旋转鱼,而RotateAt则围绕您指定的点旋转某些对象。

只需计算每条鱼的中心(X=左侧+鱼类宽度/2,Y=顶部+鱼类高度/2),然后围绕该点旋转。