Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bitmap schnell drehen (https://www.delphipraxis.net/165404-bitmap-schnell-drehen.html)

Possseidon 28. Dez 2011 17:50

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:
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;
das is halt sehr viel und geht dementsprechend langsam...

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

omata 28. Dez 2011 18:03

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.

Possseidon 28. Dez 2011 18:09

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 :)

EWeiss 28. Dez 2011 18:11

AW: Bitmap schnell drehen
 
Zitat:

Zitat von Possseidon (Beitrag 1143518)
werd mal versuchen mich mit scanline auseinander zu setzten...

http://www.delphipraxis.net/130998-a...-rotation.html

gruss

Possseidon 28. Dez 2011 18:14

AW: Bitmap schnell drehen
 
DANKE!!! werd ich gleich mal probieren :D :D :D

wenns funktioniert bin ich dir für ewig dankbar :P

EWeiss 28. Dez 2011 18:16

AW: Bitmap schnell drehen
 
Zitat:

Zitat von Possseidon (Beitrag 1143521)
DANKE!!! werd ich gleich mal probieren :D :D :D

wenns funktioniert bin ich dir für ewig dankbar :P

Kein problem ;)

Sollte auch mit Bitmaps gehen da die *png's in ein T/HBitmap format konvertiert werden.

gruss

Bummi 28. Dez 2011 19:48

AW: Bitmap schnell drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Statt das Bitmap umzurechnen kannst Du auch das Canvas "verbiegen" Zoom und Rotation

DP-Maintenance 29. Dez 2011 00:41

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.

DP-Maintenance 29. Dez 2011 01:36

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 20:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz