Kleines Problem mit rekursiver Animation?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

KnorxThieus

Betreff: Kleines Problem mit rekursiver Animation?

BeitragSa, Jun 27, 2015 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich programmiere gerade (mit B+ und Funktionssammlung, ist aber auch egal) die Drehung eines Würfels mit den Maustasten. Ich habe mir eine mir ganz gut fallende Animation für die Drehbewegung ausgedacht (Code: a# = 1 - (1 - p#) ^ 4, p# ist der Fortschrittswert zwischen 0 und 1), was soweit auch klappt.
Leider schaffe ich es jedoch nicht, diese Animation rekursiv umzuwandeln, damit der Würfel nur weitergedreht wird, wenn man die Bewegung ein zweites Mal ausgeführt wird, und nicht von der ursprünglichen Position erneut startet.

Hier habe ich die gesamte Situation mal mit einem nach rechts zu bewegendem Rechteck nachgestellt – der Code: [AUSKLAPPEN]
Graphics 800, 600


Local p#, s1#, s1_#, s2#, s2_#


fps = CreateTimer(60)

Repeat
   If KeyHit(57)      ;Leertaste zur Bewegung betätigen!
      anim = True
      ticks = TimerTicks(fps)
   EndIf
   
   Cls
   
   If anim = True
      If TimerTicks(fps) - ticks < 50
         p = (TimerTicks(fps) - ticks) / 50.      ;Fortschrittswert ergibt sich linear
                                       ;aus der vergangen Zeit seit Animationsbeginn
         
         s1_ = 1 - (1 - p) ^ 4         ;Pos. d. 1. Rechtecks bestimmen
         s1 = 50 * s1_
         
         s2_ = 50 * -(p - 1) ^ 3 / 13.      ;Pos. d. 2. Rechtecks bestimmen
         s2 = s2 + s2_
      Else
         anim = False
      EndIf
   EndIf
   
   Color 255, 255, 255         ;1. Rechteck zeichnen
   Rect s1, 100, 50, 50
   
   Color 100, 100, 100         ;2. Rechteck zeichnen
   Rect s2, 200, 50, 50
   
   Flip 0
   WaitTimer fps
Until KeyHit(1)
Arrow Zum Bewegen die Leertaste drücken!

  • Das erste Rechteck hat die korrekte Animation als Bewegung, beginnt jedoch immer wieder bei 0.
  • Für das zweite Rechteck habe ich mir gedacht, um die Gleichung rekursiv auszudrücken, einfach die 1. Ableitung der nicht-rekursiven Gleichung von 1. zu verwenden, und behelfsweise den Faktor nach Augenmaß angepasst. Das kann eigentlich nicht richtig sein! Außerdem ist die Animation jetzt ganz anders!

Ich weiß nicht mehr weiter, Ableitung hatten wir in der Schule eigentlich auch noch gar nicht richtig, auch wenn ich die Grundregeln kenne … kann mir bitte jemand helfen?
Wäre toll! Very Happy

Mit freundlichen Grüßen,
–KnorxThieus
Version: BlitzPlus / Blitz+

Xeres

Moderator

BeitragSa, Jun 27, 2015 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir wäre neu, dass Ableitungen was mit Rekursion zu tun hätten.
Es gibt auch keinen Grund, eine Animation per Rekursion abzuspielen - das ist eher unpraktisch in BlitzBasic würde ich meinen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragSa, Jun 27, 2015 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, es war ja auch nur eine Idee …
Und wie soll ich mein Ziel sonst erreichen – im Codebeispiel, bei jedem Tastendruck das Rechteck weiterzubewegen anstatt immer vorne zu beginnen? An der Lösung, für die Anzahl der bisherigen Bewegungen eine weitere Variable zu erschaffen, habe ich gezweifelt, weil das bei der eigentlichen Anwendung am Würfel zu riesigen Zahlen führen würde. Außerdem gab es da Probleme, wenn ich noch während der Animation die Taste ein zweites Mal drücke.
Version: BlitzPlus / Blitz+

Xeres

Moderator

BeitragSa, Jun 27, 2015 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Sinnvoller weise arbeitet man mit Objekten und speichert in denen ihre Position, bzw. die Animation.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

SpionAtom

Betreff: Ich bin zu doof

BeitragSo, Jun 28, 2015 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber du musst mir nochmal erklären, was du erreichen willst. Ich habe es nicht verstanden.
Embarassed
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

BladeRunner

Moderator

BeitragSo, Jun 28, 2015 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht mir ähnlich.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Chester

BeitragSo, Jun 28, 2015 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube er verwirrt uns alle mit der falschen Verwendung des Begriffs Rekursion. Das was du hier eigentlich hast, ist ne parametrisierte Kurvengleichung. Du hast ne festgelegte Kurve, und die Eingabe eines Wertes zwischen 0 und 1 liefert einen Punkt auf der Kurve.

Das er immer wieder bei 0 anfängt, kannst du verhindern indem du die Position zwischenspeicherst:

BlitzBasic: [AUSKLAPPEN]
 If KeyHit(57)      ;Leertaste zur Bewegung betätigen!
anim = True
ticks = TimerTicks(fps)
soffset = s1 ; alte Position speichern
EndIf


BlitzBasic: [AUSKLAPPEN]
         s1_ = 1 - (1 - p) ^ 4         ;Pos. d. 1. Rechtecks bestimmen
s1 = soffset + 50*s1_ ; alte Position dazu addieren


Und dann sieht es auch mit der Bewegung mithilfe die Ableitung identisch aus. Und das ist prinzipiell auch kein schlechter Ansatz, das ist mathematisch äquivalent mit der Beschreibung einer Bewegung über Ort, Geschwindigkeit (1. Abl) und Beschleunigung (2. Abl.).

Aber wie es jetzt letztendlich aussehen soll, hab ich jetzt auch nicht ganz verstanden Wink


Und kleiner Tipp: Wenn du Matheprobleme hast, kannst du auch immer gut mit Wolframalpha vergleichen:
Link (Kopier manuell, URL-Tags spinnen hier)

~EDITIERT~

Link geht jetzt. Das Hochzeichen ^ war das Problem, in solchen Fällen einfach den kritischen Teil der URL durch urlencode jagen (gibt online Tools dafür).
MfG,
Holzchopf

KnorxThieus

Betreff: Danke

BeitragMo, Jun 29, 2015 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, da bin ich wieder.

Tut mir leid, dass ich den Begriff Rekursion falsch verwendet habe – ich hatte das mal so gelernt für Folgen a(n), die auf sich selbst zurückgreifen, also etwa a(n) = a(n – 1) + 1 als rekursiv zu bezeichnen.

@Xeres: Ich wüsste nicht, wieso Objekte? Ich habe eigentlich nur ein Objekt!
@SpionAtom & BladeRunner: Ich will einen dreidimensional dargestellten Würfel mit den Pfeiltasten ↑ → ↓ ← drehen können und dies animieren. Hierfür habe ich mir besagte Animationsgleichung für den prozentualen Fortschritt p# überlegt, die leider nur zwischen 0 und 1 funktioniert. Also wusste ich nicht, wie ich jede Drehbewegung ab der zweiten realisieren sollte, um die Drehung des Würfels nicht wieder zurückzusetzen.

@Chester: Danke! Smile
Vor so einer Lösung mit zwischenspeichern habe ich erst zurückgeschreckt, weil ich den Komplex, wenn man die Leertaste vor Ablauf der Animation erneut betätigt, nicht überblicken konnte. Aber wie ich sehe, hast du das sehr schön gelöst, klappt alles bestens!
Meine zweite Sorge war, dass – in diesem Fall soffset – zu groß würde, aber bei Winkeln (Drehung d. Würfels), kann ich ja eigentlich problemlos soffset# = s1 Mod 360 schreiben, oder? Smile

Jetzt geht's! Arrow Kleine EXE (Mausbedienung noch instabil …) Very Happy
Version: BlitzPlus / Blitz+

Xeres

Moderator

BeitragMo, Jun 29, 2015 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic ist nicht sonderlich gut für Objektorientierte Programmierung, dass ist klar, aber irgendwie muss man seine Variablen sinnvoll bündeln. Ein einzelner Type wäre da schon mal besser, als ein Haufen einzelner Variablen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

KnorxThieus

BeitragDi, Jun 30, 2015 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, aber das tut ja nichts zur Funktion, oder?
Das scheint mir nämlich nicht wirklich von Mark Sibly so gedacht, zumindest sehe ich keinen Sinn, solange der Würfel im Mittelpunkt des ganzen Programmes steht.
Version: BlitzPlus / Blitz+

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group