![]() |
Bitmap schnell drehen
hi leute!
bin grad dabei ein spiel zu programmieren bei de ich ziemlich viele bitmaps drehen muss. (Türme in TowerDefence). Ich hab es auch schonmal geschafft eine procedure zu schreiben die das macht, die ist allerdings zu langsam... :( hier der code:
Delphi-Quellcode:
das is halt sehr viel und geht dementsprechend langsam...
function GetDistance(X1, Y1, X2, Y2: Double): Double;
begin Result := sqrt(Power(X2 - X1, 2) + Power(Y2 - Y1, 2)); end; function GetAngle(X1, Y1, X2, Y2: Double): Extended; var DX, DY: Extended; begin DX := X2 - X1; DY := Y2 - Y1; try if DY <> 0 then Result := ArcCos(-DY / GetDistance(X1, Y1, X2, Y2)) else Result := 1.5707963267948966192313216916398; // = ArcCos(0); if DX < 0 then Result := 2 * Pi - Result; except Result := 0; end; end; procedure RotateBmp(CX, CY, R: Double; var Bitmap: TBitmap); var X, Y, NX, NY: Integer; Angle, Distance: Double; TmpBmp: TBitmap; begin if Round(R + 360) mod 360 <> 0 then begin TmpBmp := TBitmap.Create; TmpBmp.Width := Bitmap.Width; TmpBmp.Height := Bitmap.Height; for Y := 0 to Pred(Bitmap.Height) do for X := 0 to Pred(Bitmap.Width) do begin Distance := GetDistance(CX, CY, X, Y); Angle := PI - GetAngle(CX, CY, X, Y); NX := Round(CX + sin(Angle + (R * Pi / 180)) * Distance); NY := Round(CY + cos(Angle + (R * Pi / 180)) * Distance); if (NX >= 0) and (NX < Bitmap.Width) and (NY >= 0) and (NY < Bitmap.Height) then TmpBmp.Canvas.Pixels[X, Y] := Bitmap.Canvas.Pixels[NX, NY]; end; Bitmap.Assign(TmpBmp); TmpBmp.Free; end; end; die vorgehensweise ist es, den winkel zu jedem einzelnen punkt im Bitmap zu erfragen und den punkt dann entsprechend zu drehen mit sinus cosinus un so halt... :P danke an alle antworten (wenn sie wenigstens teilweise mit dem Thema zu tun haben) bei google bin ich leider nicht fündig geworden also spart euch das oder gebt mir direkt nen link |
AW: Bitmap schnell drehen
Der Zugriff über Canvas.Pixel ist halt sehr langsam. Schau dir mal Scanline an und versuche deinen Algorithmus darauf umzubauen, dann wird das schneller gehen.
|
AW: Bitmap schnell drehen
werd mal versuchen mich mit scanline auseinander zu setzten...
EDIT: hab mal bei dem ganzen das komplette pixel kopieren raus gemacht. und selbst ohne ist die prozedur noch voll lahm. hat keiner ne andere idee? trotzdem danke :) |
AW: Bitmap schnell drehen
Zitat:
![]() gruss |
AW: Bitmap schnell drehen
DANKE!!! werd ich gleich mal probieren :D :D :D
wenns funktioniert bin ich dir für ewig dankbar :P |
AW: Bitmap schnell drehen
Zitat:
Sollte auch mit Bitmaps gehen da die *png's in ein T/HBitmap format konvertiert werden. gruss |
AW: Bitmap schnell drehen
Liste der Anhänge anzeigen (Anzahl: 1)
Statt das Bitmap umzurechnen kannst Du auch das Canvas "verbiegen" Zoom und Rotation
|
Dieses Thema wurde am "29. Dec 2011, 01:41 Uhr" von "TBx" aus dem Forum "Neuen Beitrag zur Code-Library hinzufügen" in das Forum "Algorithmen, Datenstrukturen und Klassendesign" verschoben.
|
Dieses Thema wurde am "29. Dec 2011, 02:36 Uhr" von "Luckie" aus dem Forum "Algorithmen, Datenstrukturen und Klassendesign" in das Forum "Multimedia" verschoben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz