Kleines Problem mit rekursiver Animation?
Übersicht

![]() |
KnorxThieusBetreff: Kleines Problem mit rekursiver Animation? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) ![]()
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! ![]() Mit freundlichen Grüßen, –KnorxThieus |
||
Version: BlitzPlus / Blitz+ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
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+ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
SpionAtomBetreff: Ich bin zu doof |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, aber du musst mir nochmal erklären, was du erreichen willst. Ich habe es nicht verstanden.
![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! BlitzBasic: [AUSKLAPPEN] s1_ = 1 - (1 - p) ^ 4 ;Pos. d. 1. Rechtecks bestimmen 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 ![]() 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 |
||
![]() |
KnorxThieusBetreff: Danke |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() 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? ![]() Jetzt geht's! ![]() ![]() |
||
Version: BlitzPlus / Blitz+ |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic ist nicht sonderlich gut für Objektorientierte Programmierung, dass ist klar, aber irgendwie muss man seine Variablen sinnvoll bündeln. Ein einzelner Type![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
KnorxThieus |
![]() Antworten mit Zitat ![]() |
---|---|---|
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+ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group