2012-03-22 26 views
3

ホイールの画像を連続的に回転しようとしています。私は一度だけホイールを回転させることができました。しかし、私はその車輪を連続的に回転させたい。助けが必要。ここ は、コードは次のとおりです。C++でホイールのイメージを連続的に回転させるには?

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

ここで、xとyを変更しますか? – Flot2011

答えて

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

、あなたの改正後、あなたがcontiously得るようbehaviour..youがトリガー回転の周波数を処理するためにタイマーを使用することができ、回転正しいを取得することはできません

+0

hmmmmmありがとう:) –

関連する問題