【问题标题】:How to spin image of wheel continuously in c++ using C++ Builder?如何使用 C++ Builder 在 C++ 中连续旋转车轮图像?
【发布时间】:2012-03-22 16:21:31
【问题描述】:

我正在尝试连续旋转车轮的图像。我只能转动轮子一次。但我希望那个轮子不断旋转。需要帮忙。 代码如下:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int angle = 45; //45° for example
  Graphics::TBitmap *SrcBitmap = new Graphics::TBitmap;
  Graphics::TBitmap *DestBitmap = new Graphics::TBitmap;
  SrcBitmap->LoadFromFile("image1.bmp");
  //Convert degrees to radians
  float radians = (2*3.1416*angle)/360;

  float cosine = (float)cos(radians);
  float sine   = (float)sin(radians);

  float Point1x = (-SrcBitmap->Height*sine);
  float Point1y = (SrcBitmap->Height*cosine);
  float Point2x = (SrcBitmap->Width*cosine-SrcBitmap->Height*sine);
  float Point2y = (SrcBitmap->Height*cosine+SrcBitmap->Width*sine);
  float Point3x = (SrcBitmap->Width*cosine);
  float Point3y = (SrcBitmap->Width*sine);

  float minx = min(0,min(Point1x,min(Point2x,Point3x)));
  float miny = min(0,min(Point1y,min(Point2y,Point3y)));
  float maxx = max(Point1x,max(Point2x,Point3x));
  float maxy = max(Point1y,max(Point2y,Point3y));

  int DestBitmapWidth  = (int)ceil(fabs(maxx)-minx);
  int DestBitmapHeight = (int)ceil(fabs(maxy)-miny);

  DestBitmap->Height = DestBitmapHeight;
  DestBitmap->Width  = DestBitmapWidth;
  Form1->Refresh();

  for (int x=0; x < DestBitmapWidth; x++)
  {
    for (int y=0; y < DestBitmapHeight; y++)
    {
      int SrcBitmapx = (int)((x+minx)*cosine+(y+miny)*sine);
      int SrcBitmapy = (int)((y+miny)*cosine-(x+minx)*sine);

      if (SrcBitmapx >=0 && SrcBitmapx < SrcBitmap->Width 
          && SrcBitmapy >=0 && SrcBitmapy < SrcBitmap->Height)
      {
        DestBitmap->Canvas->Pixels[x][y] = 
        SrcBitmap->Canvas->Pixels[SrcBitmapx][SrcBitmapy];
      }
    }
  }

  //Show the rotated bitmap
  Image1->Picture->Bitmap=DestBitmap;
  delete DestBitmap;
  delete SrcBitmap;
}

【问题讨论】:

    标签: c++ c++builder


    【解决方案1】:

    如果我猜对了,你在 image1.bmp 文件中有一个轮子图像,你想连续旋转它。首先,您似乎将旋转代码放入点击事件中!事件是用户触发的事件,不利于持续行为。通常将它们用作某些操作的触发器。在这种情况下,例如可能会启动连续旋转行为并停止它。

    如果我们转向您的代码,则在开始时您会创建输入和输出位图。

    Graphics::TBitmap *SrcBitmap = new Graphics::TBitmap;
    Graphics::TBitmap *DestBitmap = new Graphics::TBitmap;
    

    并从外部源文件加载输入(原封不动!!)

    SrcBitmap->LoadFromFile("image1.bmp");
    

    然后您的代码旋转 TImage 对象,然后旋转每个像素...然后将结果设置为输出位图,它是一个动态 Timage 对象... 由于您的源像素不会不断变化,因此您总是从相同的数据开始并以相同的结果结束!

    我的建议是在您的连续旋转开始之前(例如在 Form.Show 期间)加载图像对象,然后从 TImage 对象(在 Form.Show 加载)创建的位图开始修改您的代码并刷新输出回到那个位图。就像将整数数组求和到求和变量一样:

    int sum = 0 
    for(int i=0;i<ListSize;i++)
     sum = sum+List[i];
    

    可能,在您修改后,您无法获得正确的旋转行为..您可以使用计时器来处理旋转触发的频率,以便您获得持续旋转的轮子..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2011-01-17
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多