Problem mit Nachbau einer Twirl funktion aus PB
Übersicht

![]() |
Xaymarehemals "Cgamer"Betreff: Problem mit Nachbau einer Twirl funktion aus PB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
Ich habe mal versucht ein Purebasic beispiel für BB umzusetzen(Twirl.pb für diejenigen die das Codearchiv haben). Leider ist es extrem Rechenlastig(so ~100ms). Kann man den Code irgendwie verbessern so dass dieser schneller läuft? Code: [AUSKLAPPEN] Graphics 800,600,16,2
SetBuffer BackBuffer() Function Twirl(X, Y, R, A#, B=0) If B=0 B = BackBuffer() IMG = CreateImage(R*2+2,R*2+2) : IB = ImageBuffer(IMG) : CopyRect X-R-1,Y-R-1,R*2+2,R*2+2,0,0,B,IB Red = ColorRed() : Gre = ColorGreen() : Blu = ColorBlue() : RGB = Red * $10000 + Gre * $100 + Blu LockBuffer B : LockBuffer IB For R1 = 1 To R VA# = 25.0/R1 : D# = 0 While D# < 360 D# = D# + VA# : De# = D# + A#*VA# C1# = X+Cos(D#) *R1 : S1# = Y+Sin(D#) *R1 : C2# = R+Cos(De#)*R1 : S2# = R+Sin(De#)*R1 RGB2 = ReadPixelFast(C1#, S1#, B) WritePixelFast(C2#, S2#, RGB2, IB) Wend LD = LD + 1 Next UnlockBuffer B : UnlockBuffer IB DrawBlock IMG,X-R-1,Y-R-1 : FreeImage IMG End Function img2 = CreateImage(400,400) SetBuffer ImageBuffer(img2) For A = 0 To 200 Color A,A,A Rect A,A,400-A*2,400-A*2,0 Next SetBuffer BackBuffer() A = -100 While Not KeyHit(1) Cls DrawImage img2,200,100 msec = MilliSecs() Twirl(MouseX(),MouseY(),100,A) msec = MilliSecs() - msec Text 0,0, msec If MouseDown(1) A = A + 10 If MouseDown(2) A = A - 10 Flip Wend MfG (Falls ihr an den oberen Rand des buffers geht bekommt man immer die Windows Oberfläche ![]() |
||
Warbseite |
- Zuletzt bearbeitet von Xaymar am Di, Nov 18, 2008 14:48, insgesamt einmal bearbeitet
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich vermute mal den Grund für die Langsamkeit ist, dass für jeden Pixel sein eigener Sin und Cos berechnet wird. Außerdem wird nicht jeder Pixel tatsächlich nur einmal berechnet. Durch überschneidungen kommt es auch mal vor, dass ein Pixel dann doppelt berechnet wird.
Aus diesem Grund schlage ich eine andere Berechnungsmethode vor. Sehe dir dazu mal mein folgenden Code an. In diesem werden nicht einzelne Pixel sondern ganze Zeilen und deren Breite berechnet. So lässt sich das ganze um den Faktor einer Quadratwurzel an rechenzeit verkürzen, und es werden nur noch die tatsächliche Pixelanzahl berechnet. Durch Spiegelung kann man dann noch einmal das ganze um die hälfte an Rechenzeit reduzieren. Übrig bleibt dann eine doppelt verschachtelte Schleife und die reinen aber schnellen Pixelbefehle von Blitz. Code: [AUSKLAPPEN] Graphics 800,600,0,2
SetBuffer FrontBuffer() radius#=200 xp=250 yp=250 For x#=0 To radius Step 1 wt%=Sin(ACos(x/radius))*radius Rect xp+x,yp-wt,1,wt*2,1 Rect xp-x,yp-wt,1,wt*2,1 Next WaitKey |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
so hatte ich es auch versucht(achtung der titel des themas täuscht etwas, mir fiel nichts ein wie ich das problem beschreiben soll). allerdings guck dir mal an was mein programm macht:
es "verstrudelt" einen radius und die mitte. sowas kann man bestimmt schneller machen. bei dem PB beispiel sinds ja nur ~10ms und es hat sogar noch antialias drin. mal gucken wieso das bei mir so langsam ist. Mfg [Edit] Bei dem beispiel von pb wird direkt auf den grafikbuffer zugegriffen(mit writebyte & co) |
||
Warbseite |
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde den Bresenham-Algorhitmus nehmen, den findest du auf Wikipedia. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group