

就是背景得表盤移動
在網上找了個代碼,有2個問題 一是 圖片轉動比較慢 轉幾次以后就卡死了 二是 轉動以后 圖片失真 并且有白得地方
void picturexz(Graphics::TBitmap *Source,Graphics::TBitmap *NewPic,int angle)//
{
if(angle>180){
angle=360-angle;
}
if(angle <-180){
angle=360+angle;
}
float radians=(2*3.1416*angle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
float Point1x=(Source->Height*sine);
float Point1y=(Source->Height*cosine);
float Point2x=(Source->Width*cosine-Source->Height*sine);
float Point2y=(Source->Height*cosine+Source->Width*sine);
float Point3x=(Source->Width*cosine);
float Point3y=(Source->Width*sine);
float minx=0,miny=0,maxx=0,maxy=0;
minx=Point2x<Point3x?Point2x:Point3x ;
minx=minx<Point1x?minx:Point1x;
minx=minx<0?minx:0;
miny=Point2y<Point3y?Point2y:Point3y ;
miny=miny<Point1y?miny:Point1y;
miny=miny<0?miny:0;
maxx=Point2x>Point3x?Point2x:Point3x ;
maxx=maxx>Point1x?maxx:Point1x;
maxx=maxx>0?maxx:0;
maxy=Point2y>Point3y?Point2y:Point3y ;
maxy=maxy>Point1y?maxy:Point1y;
maxy=maxy>0?maxy:0;
int DestBitmapWidth,DestBitmapHeight;
if(angle>90&&angle <180)
DestBitmapWidth=(int)ceil(-minx);
else
DestBitmapWidth=(int)ceil(maxx-minx);
if(angle>-180&&angle <-90)
DestBitmapHeight=(int)ceil(-miny);
else
DestBitmapHeight=(int)ceil(maxy-miny);
NewPic->Height=DestBitmapHeight;
NewPic->Width=DestBitmapWidth;
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 <Source->Width&&SrcBitmapy>=0&&
SrcBitmapy <Source->Height)
{
NewPic->Canvas->Pixels[x][y]=Source->Canvas->Pixels[SrcBitmapx][SrcBitmapy];
}
}
}
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Graphics::TBitmap *pBmp=new Graphics::TBitmap();
picturexz(this->Image1->Picture->Bitmap,pBmp,10);
this->Image1->Picture->Bitmap=pBmp;
delete pBmp;
}
uj5u.com熱心網友回復:
轉動以后 圖片失真————
每次轉動都用原始圖片重新計算,而不是接著上次轉動。
uj5u.com熱心網友回復:
轉動幾次以后 卡死 是什么原因 也不是卡死 就是半天沒反應 過幾十秒就又好了uj5u.com熱心網友回復:
1.卡死一般是有資源漏洞造成的。
2.一般這種儀表盤都是用組態王做。
uj5u.com熱心網友回復:
最簡單的方法是準備一套各角度的圖,根據需要貼上去。要實時旋轉的話可以考慮用FMX,FMX框架中任意組件都支持旋轉、3D坐標變換(2D組件也可以附在3D層上實作)。如果是左圖這樣的效果也可以實時繪制。uj5u.com熱心網友回復:
要想效率高,直接使用win7中的Direct2D就行了,方便,直接在VCL中就可以用,不用去FMXuj5u.com熱心網友回復:
用GDI+也可以旋轉uj5u.com熱心網友回復:
只旋轉不能滿足功能需求吧, 還有俯仰角度。還是老老實實畫吧 :
void draw( 坐標原點,水平旋轉角度,俯仰角度 )
{ ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42685.html
標籤:基礎類
下一篇:求助
