Animierte Butterfly Curve verhält sich seltsam

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Flush

Betreff: Animierte Butterfly Curve verhält sich seltsam

BeitragSa, März 31, 2018 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe ein kleines Prg. deschrieben das eine Butterfly Curve zeichnet. Das ganze dient nur den Learning Purpuoses.
Ob LUT's einen Sinnmachen oder nicht ist hier nicht das Problem.

Ich lasse die verschieden gro0en Kurven nacheinander in der Funktion BlitzBasic: [AUSKLAPPEN]
DrawButterFly()
auf den BackBuffer zeichnen und flippe dann alles ständig auf den FrontBuffer und erreiche so eine kleine Animation.

Das funktioniert mit den ersten vier Kurven. Sobald ich die 5. flippe (auskommentierter Teil) gibt es ein Standbild!

Weshalb ist das so und wie mach ich's richtig?

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600, 24, 2
AppTitle "ButterflyCurve Final II"

;--------------------------------------------------------
Global fntArial ;Font Variablen
fntArial = LoadFont("Arial",24,True, False,True) ;Arial, 24, bold = True, Italic = False,underlined = True
SetFont fntArial ;Font setzen

;--------------------------------------------------------
Global arrBalls[5]
gfxBall = BallPic (255,128,128)
arrBalls[0] = gfxBall
gfxBall = BallPic (255,128,0)
arrBalls[1] = gfxBall
gfxBall = BallPic (0,0,160)
arrBalls[2] = gfxBall
gfxBall = BallPic (255,255,255)
arrBalls[3] = gfxBall
gfxBall = BallPic (255,0,128)
arrBalls[4] = gfxBall

;----------------------------------------------------------
Global fX# = 0
Global fY# = 0
Global e# = 2.71828182845904523536028747135266

;---------------------------------------------------------
Type tButterFly
Field arrX [720]
Field arrY[720]
Field arrX_1 [720]
Field arrX_2 [720]
Field arrX_3 [720]
Field arrX_4 [720]
Field arrX_5 [720]
Field arrY_1 [720]
Field arrY_2 [720]
Field arrY_3 [720]
Field arrY_4 [720]
Field arrY_5 [720]
End Type

;----------------------------------------------------------------
While Not KeyDown (1)
DrawButterFly()
Wend

;--------------------------------------------------------------

Function DrawButterFly()

SetBuffer BackBuffer ()
Local tButFly.tButterFly = New tButterFly
tButFly = CalcButterfly()
Local i% = 0

Repeat
For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_1[iter], tButFly\arrY_1[iter]
i = i + 1
If i = 5 Then i = 0
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_2[iter], tButFly\arrY_2[iter]
i = i + 1
If i = 5 Then i = 0
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_3[iter], tButFly\arrY_3[iter]
i = i + 1
If i = 5 Then i = 0
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_4[iter], tButFly\arrY_4[iter]
i = i + 1
If i = 5 Then i = 0
Next

; For iter = 0 To 720
; DrawImage arrBalls[i], tButFly\arrX_5[iter], tButFly\arrY_5[iter]
; i = i + 1
; If i = 5 Then i = 0
; Next
Flip
Forever

End Function

Function CalcButterfly.tButterFly()

Local t# = 0
Local iGroesse% = 0
i% = 0
Local tBFly.tButterFly = New tButterFly

For iGroesse% = 20 To 100 Step 20
For i = 0 To 719
fX = 400 - iGroesse * Sin(t) *(e^Cos(t) -2*Cos(4*t)-Sin^5*(t/12))
fY = 350 - iGroesse * Cos(t) *(e^Cos(t) -2*Cos(4*t)-Sin^5*(t/12))
tBFly\arrX[i] = fX
tBFly\arrY[i] = fY
t = t + 0.5

Select iGroesse
Case 100
tBFly\arrX_1[i] = tBFly\arrX[i]
tBFly\arrY_1[i] = tBFly\arrY[i]
Case 80
tBFly\arrX_2[i] = tBFly\arrX[i]
tBFly\arrY_2[i] = tBFly\arrY[i]
Case 60
tBFly\arrX_3[i] = tBFly\arrX[i]
tBFly\arrY_3[i] = tBFly\arrY[i]
Case 40
tBFly\arrX_4[i] = tBFly\arrX[i]
tBFly\arrY_4[i] = tBFly\arrY[i]
Case 20
tBFly\arrX_5[i] = tBFly\arrX[i]
tBFly\arrY_5[i] = tBFly\arrY[i]
End Select
Next
Next

Return tBFly

End Function

Function BallPic(r, g, b)

SeedRnd MilliSecs()

pic=CreateImage(4,4)
SetBuffer ImageBuffer(pic)

For i = 0 To 4
Color r, g, b
Oval 0, 0, 4, 4, 1
Next

Return pic
End Function


Vielen Dank für Eure Hilfe und frohe Ostern!

Grüße,
Flush

edit: Horizontale Kommentarzeilen gekürzt, damit das Forenlayout nicht zerschossen wird. - Xeres

Holzchopf

Meisterpacker

BeitragSa, März 31, 2018 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt daher, dass du fünf Schleifen hast und somit i immer wieder (immer zu Beginn der Repeat-Schleife) denselben Wert hat. Also hast du auch keine Bewegung mehr in deiner Animation.

Es gibt verschiedene Lösungsansätze:
1.) Als Workaround könntest du nach der 5. Schleife einfach noch einmal i um eins erhöhen *
2.) Eine zweite Zählvariable einführen, die du einmal pro Repeat-Schleife erhöhst und i immer zu Beginn der Repeat-Schleife deren Wert zuweist.

* Einfacher (und irgendwie auch sicherer) ist es, statt BlitzBasic: [AUSKLAPPEN]
i = i + 1
If i = 5 Then i = 0


BlitzBasic: [AUSKLAPPEN]
i = (i + 1) Mod 5

zu schreiben.

LG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Flush

BeitragSo, Apr 01, 2018 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf
Danke für die schnelle Antwort und das auch noch an einem Ostersonntag Exclamation

Ich nutze i doch nur um durch das Array mit den farbigen Bällen zu gehen und setze i dann wieder auf 0. In jeder For-Schleife das gleiche.
Das funktioniert 4 Mal, beim 5. mal nicht mehr.

Bei Deiner 1. Lösung bekomme ich eine Memory Access Violation, nachdem es etwa 1 Sekunde funktioniert hat, weil ich die Arraygrenzen überschreite!

Bei Deiner 2. Lösung passiert leider nichts.
Ich hab den Code der Draw Funktion nochmal mit Deinen Änderungen gepostet. Hast Du das so gemeint?

BlitzBasic: [AUSKLAPPEN]

Function DrawButterFly()

SetBuffer BackBuffer ()
Local tButFly.tButterFly = New tButterFly
tButFly = CalcButterfly()
Local i% = 0
Local j% = 0

Repeat
j = i
For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_1[iter], tButFly\arrY_1[iter]
i = i + 1
If i = 5 Then i = 0
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_2[iter], tButFly\arrY_2[iter]
i = i + 1
If i = 5 Then i = 0
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_3[iter], tButFly\arrY_3[iter]
i = i + 1
If i = 5 Then i = 0
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_4[iter], tButFly\arrY_4[iter]
i = i + 1
If i = 5 Then i = 0
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_5[iter], tButFly\arrY_5[iter]
i = i + 1
If i = 5 Then i = 0
Next
Flip
j = j + 1
If j = 5 Then j = 0
Forever

End Function



Viele Grüße und frohe Ostern,
Flush

Flush

BeitragSo, Apr 01, 2018 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Gelöst, ich hab einfach noch einen Index in dem Array der farbigen Bälle das ich durchgehe hinzugefügt Very Happy

BlitzBasic: [AUSKLAPPEN]

Function DrawButterFly()

Local tButFly.tButterFly = New tButterFly
tButFly = CalcButterfly()
Local i% = 0

Repeat
For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_1[iter], tButFly\arrY_1[iter]
i = (i + 1) Mod 6
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_2[iter], tButFly\arrY_2[iter]
i = (i + 1) Mod 6
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_3[iter], tButFly\arrY_3[iter]
i = (i + 1) Mod 6
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_4[iter], tButFly\arrY_4[iter]
i = (i + 1) Mod 6
Next

For iter = 0 To 720
DrawImage arrBalls[i], tButFly\arrX_5[iter], tButFly\arrY_5[iter]
i = (i + 1) Mod 6
Next
Flip
Forever

End Function


Viele Grüße,
Flush

Holzchopf

Meisterpacker

BeitragSo, Apr 01, 2018 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Flush hat Folgendes geschrieben:
Ich nutze i doch nur um durch das Array mit den farbigen Bällen zu gehen und setze i dann wieder auf 0. In jeder For-Schleife das gleiche.
Das funktioniert 4 Mal, beim 5. mal nicht mehr.


Gut, dass es jetzt funktioniert. Aber ich möchte noch deine Aussage korrigieren, denn vielleicht hilft es dir, in Zukunft Fehler schneller/selber zu finden oder du hast grad einfach nur einen Knoten in deiner Überlegung und dann wär's gut, den zu lösen Wink

Du setzt i zwar schon auf 0 ABER eben nur, wenn es nach dem Inkrementieren 5 ist. Zu Beginn der nächsten For-Schleife hat es dann einfach immer noch den Wert, den es beim Verlassen der vorherigen hatte. Schauen wir das mal im Detail an:

  1. i wird auf 0 gesetzt
  2. Die Repeat-Forever-Schleife fängt an
  3. Die erste For-Schleife wird abgerackert und läuft 721 mal durch (von 0 bis 720 inklusive, sind 721 Durchläufe). Danach ist i=1
  4. Die zweite For-Schleife wird 721 mal durchlaufen, danach ist i=2
  5. Die dritte For-Schleife wird 721 mal durchlaufen, danach ist i=3
  6. Die dritte For-Schleife wird 721 mal durchlaufen, danach ist i=4
  7. Die Repeat-Forever-Schleife endet und es wird wieder die erste For-Schleife gestartet, mit dem Wert, der i halt gerade hat


Wenn jetzt noch eine vierte For-Schleife kommt, würde da einfach noch dazwischen stehen:
Die vierte For-Schleife wird 721 mal durchlaufen, danach ist i=0
Und somit wäre zu Beginn der Repeat-Forever-Schleife der Wert von i immer wieder 0, also würde einfach jedes mal exakt dasselbe gezeichnet, weil immer die selben Startbedingungen herrschen.


Flush hat Folgendes geschrieben:
Bei Deiner 1. Lösung bekomme ich eine Memory Access Violation

Wahrscheinlich, weil i 6 sein kann? Da war ich wohl nicht klar genug, dass bei dieser Variante auch das If i=5 Then i=0 hingehört (oder das Mod 5).

Flush hat Folgendes geschrieben:
Hast Du das so gemeint?

Fast. Es müsste lediglich statt j = i heissen: i = j Smile
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Flush

BeitragSo, Apr 01, 2018 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf

Oh Mann, und ob ich da einen Knoten hatte Embarassed !
Vielen Dank, jetzt hat's gefunkt vor allem für die Zukunft Very Happy

Vielen Dank nochmal Holzchopf!

Vile Grüße,
Flush

Flush

BeitragSo, Apr 01, 2018 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf
Du hast ne PN Wink


Viele Grüße,
Flush

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group