如何使用C ++ Builder在c ++中连续旋转轮子图像?

时间:2012-03-22 16:21:32

标签: c++ c++builder

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

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

1 个答案:

答案 0 :(得分:0)

如果我说得对,你在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];

可能在你修改之后,你无法获得正确的旋转行为......你可以使用计时器来处理旋转触发的频率,这样你就可以连续旋转轮子。