RotateImage, eigene Umsetzung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

s_m_w

Betreff: RotateImage, eigene Umsetzung

BeitragDo, Nov 06, 2008 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mich mal an einer eigenen Umsetzung von RotateImage versucht:

Code: [AUSKLAPPEN]
Dim rgb(1,1),rgbnew(1,1),target(2)
Timer = CreateTimer(30)

;TestImage = LoadImage("Image.png")
TestImage = CreateImage(30,30)
SetBuffer ImageBuffer(TestImage)
Rect 0,0,29,29,1

Graphics 800,600,0,2

SetBuffer BackBuffer()
While Not KeyHit(1)
  Cls
  Ang = Ang+10
  Now = MilliSecs()
  DrawImageR(TestImage ,400,300,Ang)
  DebugLog(MilliSecs()-Now)
  WaitTimer(Timer)
  Flip
Wend

Function DrawImageR(Image,X,Y,Angle)
  Width=ImageWidth(Image):Height=ImageHeight(Image)
  Dim rgb(Width,Height)
  ImageNewWidth = Int(Sqr((Width)^2+(Height)^2))
  ImageNewHeight = Int(Sqr((Width)^2+(Height)^2))
  Dim rgbnew(ImageNewWidth,ImageNewHeight)
  ImageNew = CreateImage(ImageNewWidth,ImageNewHeight)
  LockBuffer ImageBuffer(Image)
  For ix=0 To Width-1
    For iy=0 To Height-1
      rgb(ix,iy) = ReadPixelFast(ix,iy,ImageBuffer(Image))
    Next
  Next
  UnlockBuffer ImageBuffer(Image)
  LockBuffer ImageBuffer(ImageNew)
  For ix=0 To Width-1
    For iy=0 To Height-1
      target(0) = Int(Sin((Angle+ATan2(iy-height/2,ix-Width/2)) Mod 360)*Sqr((ix-Width/2)^2+(iy-Height/2)^2))+ImageNewWidth/2
      target(1) = Int(Cos((Angle+ATan2(iy-height/2,ix-Width/2)) Mod 360)*Sqr((ix-Width/2)^2+(iy-Height/2)^2))+ImageNewHeight/2
      WritePixelFast(target(0),target(1),rgb(ix,iy),ImageBuffer(ImageNew))
    Next
  Next
  UnlockBuffer ImageBuffer(ImageNew)
  DrawImage ImageNew,X,Y
  FreeImage ImageNew
End Function


Funktioniert ganz okay (5ms pro Aufruf bei mir), nur entstehen durch das runden der Koordinaten lücken im Bild, weiß jemand dafür eine Lösung. Und, kann ich das ganze noch besser machen (schneller, speicherschonender, was auch immer)?
Sheep Happens

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Nov 06, 2008 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Lösung zu ist, dass du nicht das Bild gedreht zeichnest sondern gedreht ausliest. Also eine umgekehrte Berechnungsart. Man zeichnet mit einer doppelt verschahtelten X, Y -Schleife und liesst die Pixel aus dem Quellbilf entsprechend aus. Bei diesem Vorhaben kann man dann auch gleich interpolieren was zwar mehr Rechenzeit benötigt, aber auch besser aussieht. Ansonsten kann du auch zum Beispiel die Draw3D (siehe Signatur) benutzen, wenn du Blitz3D hast. Dann kannst du komplett stufenlos in Echtzeit nach Belieben rotieren, skallieren färben und transparenz angeben einzelner Bilder.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

s_m_w

BeitragDo, Nov 06, 2008 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
Ansonsten kann du auch zum Beispiel die Draw3D (siehe Signatur) benutzen, wenn du Blitz3D hast. Dann kannst du komplett stufenlos in Echtzeit nach Belieben rotieren, skallieren färben und transparenz angeben einzelner Bilder.

Ja, das habe ich mir schon überlegt, aber ich wollte nicht unbedingt 100$ ausgeben für etwas, das blitzplus kann. Aber da blitzplus es scheinbar nicht kann werde ich mir wohl mal blitz3d anschaffen.
Sheep Happens

Progger93

BeitragDo, Nov 06, 2008 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
kauf doch gleich bmax da kriegst du dann maxgui auch noch dazu
außerdem gibt es OOP und man kann ebenfalls echtzeit drehen,scalen...
MfG Pascal
Win 7|T7250@2.0Ghz|3GB RAM|M8600GT

s_m_w

BeitragDo, Nov 06, 2008 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
bmax würde viel Umgewöhnung erfordern und 3D interessiert mich schon lange. (Kann BMax 3D Zeug?)

Und: ich habe gehört, dass BMax um einiges schneller sein soll als B+/B3D, stimmt das?
Sheep Happens

Progger93

BeitragDo, Nov 06, 2008 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
mit MiniB3D schon Wink
MfG Pascal
Win 7|T7250@2.0Ghz|3GB RAM|M8600GT

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group