c# - 在其中心旋转图形位图

标签 c# graphics

我正在为学校做一个项目,我们需要在不使用 XNA 的情况下用 C# 制作一个基本的自上而下的赛车游戏。 首先让我告诉你,到目前为止我们学到的关于编程的知识与制作一些看起来像赛车游戏的东西几乎没有关系。它并没有比数组、循环等更难。 所以我们没有学习图形或类似的东西。

说了这么多,我遇到了以下问题。

我们创建了一个 Graphics 对象,然后使用 DrawImage 并使用来自 car.jpg 的位图。

graphics = e.Graphics;
graphics.RotateTransform(angle);
graphics.DrawImage(car, xPos, yPos, car.Width, car.Height);

然后我们等待按键,例如 Right

case Keys.Right:
  if (angle != 360)
  {
    angle += 10;
  }
  else
  {
    angle = 0;
  }
  this.Refresh();
  break;

我们遇到的问题是旋转的轴心点在左上角。因此,一旦我们将汽车移动到类似 (20,25) 的地方并开始旋转它,它就会使用 (0,0) 作为旋转中心。我们想要实现的是让旋转的中心点位于我们汽车的中心。

我们已经尝试寻找改变 RotateTransformcenterXcenterY 的方法,但得出的结论是这不是可能与位图。 我们已经为这个问题苦苦挣扎了 2 天多,似乎找不到任何解决方案来实现我们想要的东西。

是我们在创建 Graphics 对象时做错了什么,还是有一种完全不同的方法来改变汽车的 centerXcenterY

最佳答案

要绘制旋转的位图,您需要执行几个步骤来准备Graphics 对象:

  • 首先将其原点移动到旋转的中点
  • 然后旋转所需的角度
  • 接下来你把它移回去
  • 现在您可以绘制位图
  • 最后你重置了Graphics

这需要为每个位图完成。

以下是在位置 (xPos, yPos) 绘制 Bitmap bmp 的代码步骤:

float moveX = bmp.Width / 2f + xPos;   
float moveY = bmp.Height / 2f+ xPosf;   
e.Graphics.TranslateTransform(moveX , moveY );
e.Graphics.RotateTransform(angle);
e.Graphics.TranslateTransform(-moveX , -moveY );
e.Graphics.DrawImage(bmp, xPos, yPos);  
e.Graphics.ResetTransform();

有一种可能的复杂情况:如果您的位图具有与屏幕不同的dpi分辨率,即与图形不同,您必须首先调整位图dpi设置!

要使位图适应通常的96dpi,你可以简单地做一个

bmp.SetResolution(96,96);

要为将来的类似视网膜的显示器做好准备,您可以创建一个在启动时设置的类变量:

int ScreenDpi = 96;
private void Form1_Load(object sender, EventArgs e)
{
  using (Graphics G = this.CreateGraphics()) ScreenDpi = (int)G.DpiX;
}

并在加载Bitmap后使用它:

bmp.SetResolution(ScreenDpi , ScreenDpi );

像往常一样,DrawImage 方法使用Bitmap 的左上角。您可能需要为旋转点使用不同的 Points,也可能需要为汽车的虚拟位置使用不同的 Points,可能在汽车前部的中间。

关于c# - 在其中心旋转图形位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525965/

相关文章:

c# - list 可能无效或文件无法打开。

android - 通过 Canvas 类硬件绘制在 Android 上加速了吗?

java - 如何缩放图像

c# - 在 C# 中模拟雷达的最佳方法是什么?

Java图形(画线)

c# - 用户输入月份编号 1-12 并且 http post 返回月份名称的应用程序不起作用

c# - WebResource.axd 404

高精度的Java图形drawArc

c# - Word 互操作 : How to obtain valid selected cells collection from Word table when selection area is not a rectangle?

c# - 为什么构造函数中的空字符串参数不会引发异常?