c# 围绕中心旋转位图

  • 本文关键字:旋转 位图 c# graphics
  • 更新时间 :
  • 英文 :


我为覆盖层构建了一个小地图,它根据玩家的位置正确更新图像。我现在正在尝试让它旋转,虽然图形函数 rotateTransform,围绕左上角旋转,我怎样才能绕中心旋转?

if (ShowRadar)
{
  //Center point
  RadarCenter = new Vector2(this.GameWindowRect.Right - 125, this.GameWindowRect.Top + 125 + 25 - 15);
  //If map exists
  if (originalBitmap != null)
  {
    DXSprite.Begin(SpriteFlags.None);
    //Transpose player posistion to map position and create the current mini map image
    //player location range -4000 - 4000, bitmap range 0 - 8000
    x = (int)(Math.Abs(-4000 - player_Z));
    z = (int)(Math.Abs(4000 - player_X));
    //minimap rec loc on bitmap with a scale of 1000x1000
    mini = new Rectangle(x-500, z-500, 1000, 1000);
    croppedBitmap = new Bitmap(200, 200);
    croppedBitmapFinal = new Bitmap(200, 200);
    //draw the crop
    using (Graphics grD = Graphics.FromImage(croppedBitmap))
    {
      grD.DrawImage(originalBitmap, new Rectangle(0, 0, 158, 158), mini, GraphicsUnit.Pixel);
      grD.Dispose();
    }
    //redraw crop as circle
    using (Graphics grD = Graphics.FromImage(croppedBitmapFinal))
    {
      GraphicsPath path = new GraphicsPath();
      path.AddEllipse(0, 0, croppedBitmapFinal.Width-45, croppedBitmapFinal.Height-45);
      grD.SetClip(path);
      //apply rotate - direction 0 to 3.15 = 0 to 180, -3.15 to 0 = 180 to 360; so multiply by (180/3.15)
      grD.RotateTransform(player_D * 57);
      grD.DrawImage(croppedBitmap, 0, 0);
      grD.Dispose();
    }
    //make texture from final bitmap
    using (MemoryStream s = new MemoryStream())//s is a MemoryStream
    {
      croppedBitmapFinal.Save(s, System.Drawing.Imaging.ImageFormat.Png);
      s.Seek(0, SeekOrigin.Begin); //must do this, or error is thrown in next line
      currentMinimap = Texture.FromStream(DXDevice, s);
      s.Dispose();
    }
    //clean up and print to screen
    croppedBitmapFinal.Dispose();
    croppedBitmap.Dispose();
    DXSprite.Draw(currentMinimap, new Vector3(0f, 0f, 0f), new Vector3(this.GameWindowRect.Right - 225, this.GameWindowRect.Top + 35, 0f), Color.White);
    DXSprite.End();
    currentMinimap.Dispose();
  }
}

只需要像这样移动原点

if (ShowRadar)
{
  //Center point
  RadarCenter = new Vector2(this.GameWindowRect.Right - 125, this.GameWindowRect.Top + 125 + 25 - 15);
  //If map exists
  if (originalBitmap != null)
  {
    DXSprite.Begin(SpriteFlags.None);
    //Transpose player posistion to map position and create the current mini map image
    //player location range -4000 - 4000, bitmap range 0 - 8000
    x = (int)(Math.Abs(-4000 - player_Z));
    z = (int)(Math.Abs(4000 - player_X));
    //minimap rec loc on bitmap with a scale of 1000x1000
    mini = new Rectangle(x-500, z-500, 1000, 1000);
    croppedBitmap = new Bitmap(200, 200);
    croppedBitmapFinal = new Bitmap(200, 200);
    //draw the crop
    using (Graphics grD = Graphics.FromImage(croppedBitmap))
    {
      grD.DrawImage(originalBitmap, new Rectangle(0, 0, 158, 158), mini, GraphicsUnit.Pixel);
      grD.Dispose();
    }
    //redraw crop as circle
    using (Graphics grD = Graphics.FromImage(croppedBitmapFinal))
    {
      //add circle clip to graphics
      GraphicsPath path = new GraphicsPath();
      path.AddEllipse(0, 0, croppedBitmapFinal.Width-45, croppedBitmapFinal.Height-45);
      grD.SetClip(path);
      //move origin to center for rotate
      float hw = (croppedBitmapFinal.Width / 2)-22.5f;
      float hh = (croppedBitmapFinal.Height / 2)-22.5f;
      grD.TranslateTransform(hw, hh);
      //apply rotate - direction 0 to 3.15 = 0 to 180, -3.15 to 0 = 180 to 360; so multiply by (180/3.15)
      grD.RotateTransform((player_D * 57)-90);
      //Move origin back to original pos
      grD.TranslateTransform(-hw, -hh);
      //Draw to bitmap
      grD.DrawImage(croppedBitmap, 0, 0);
      grD.Dispose();
    }
    //make texture from final bitmap
    using (MemoryStream s = new MemoryStream())//s is a MemoryStream
    {
      croppedBitmapFinal.Save(s, System.Drawing.Imaging.ImageFormat.Png);
      s.Seek(0, SeekOrigin.Begin); //must do this, or error is thrown in next line
      currentMinimap = Texture.FromStream(DXDevice, s);
      s.Dispose();
    }
    //clean up and print to screen
    croppedBitmapFinal.Dispose();
    croppedBitmap.Dispose();
    DXSprite.Draw(currentMinimap, new Vector3(0f, 0f, 0f), new Vector3(this.GameWindowRect.Right - 225, this.GameWindowRect.Top + 35, 0f), Color.White);
    DXSprite.End();
    currentMinimap.Dispose();
  }

相关内容

  • 没有找到相关文章

最新更新