RotateImage, eigene Umsetzung
Übersicht

![]() |
s_m_wBetreff: RotateImage, eigene Umsetzung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
mit MiniB3D schon ![]() |
||
MfG Pascal
Win 7|T7250@2.0Ghz|3GB RAM|M8600GT |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group