如何使用c++Builder在c++中连续旋转车轮图像
How to spin image of wheel continuously in c++ using 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;
}
如果我做对了,你在image1.bmp文件中有一个轮子图像,你想连续旋转它。首先,你似乎把你的旋转代码放进了一个点击事件中!事件是用户触发的事件,不利于连续行为。将它们用作某些操作的触发器是很常见的。。例如,在这种情况下,可能会启动连续旋转行为并停止它
如果我们转到您的代码,那么在开始时您将创建输入和输出位图。
Graphics::TBitmap *SrcBitmap = new Graphics::TBitmap;
Graphics::TBitmap *DestBitmap = new Graphics::TBitmap;
并从外部源文件加载输入(它完好无损!!)
SrcBitmap->LoadFromFile("image1.bmp");
然后你的代码旋转TImage对象,然后旋转每个像素。。。然后将结果设置为输出位图,该位图是一个动态计时对象。。。由于源像素不是连续变化的,所以您总是从相同的数据开始,并以相同的结果结束!
我的建议是在连续旋转开始之前加载图像对象(例如在Form.Show期间),然后从TImage对象创建的位图开始修改代码(在Form.Sow加载),并将输出刷新回该位图。类似于将整数数组求和到求和变量:
int sum = 0
for(int i=0;i<ListSize;i++)
sum = sum+List[i];
可能,在你修改后,你无法获得正确的旋转行为。。你可以使用定时器来处理旋转触发的频率,这样你就可以连续旋转轮子。。
相关文章:
- 程序仅正确旋转方形图像
- 在C++中使用OpenCV矩阵中的特征将图像旋转90度
- 无法编译此图像旋转代码
- 如何使用OpenCV从图像中检测旋转对象
- 逐像素旋转和翻转图像
- 使用接口上的C 旋转图像
- 在QML中旋转图像时降低CPU使用情况
- 旋转图像不起作用
- Openframeworks-通过OpenGL调用从图像中心旋转图像
- 如何在QT QWidgets C++中围绕图像中心旋转图像
- 如何在 openGL 中旋转图像
- 轻松BMP旋转图像到任何角度
- 在 C 语言中旋转图像对象和指针
- 在画布上绘制旋转图像
- BMP旋转图像
- 程序旋转图像时发生内存泄漏
- 如何在旋转图像时填充边框
- 在opengl中寻找旋转图像的中心
- 在opencv中裁剪旋转图像
- 旋转图像PPM