Smooth Move

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Kabelbinder

Sieger des WM-Contest 2006

Betreff: Smooth Move

BeitragMi, Aug 01, 2007 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man ein Objekt zu einem bestimmten Punkt bewegen möchte setzt man normalerweise den Winkel der Bewegung in die entsprechende Richtung und bewegt das Objekt solange mit der gleichen Geschwindigkeit in diese Richtung, bis es da ist. Das ist eine Gleichförmige Bewegung.

Nun wollte ist gerne, dass mein Objekt sich nicht in eine gleichförmigen Bewegung bewegt, sondern beschleunigt und schließlich vor dem Zielpunkt langsam abbremst.
Das kann man einerseits umsetzen, indem man zur Geschwindigkeit des Objekts im jedem Umlauf eine Beschleunigung addiert; und wieder abzieht, sobald das Objekt die Hälfte des Weges hat.

Ich habe es mal noch anders probiert und eine Funktion für die Geschwindigkeit entwickelt. Diese ist allerdings ein Parabel, es handelt sich also nicht um eine Gleichmäßige Beschleunigung und Verzögerung, sondern um eine verzögerte Beschleunigung und eine beschleunigte Verzögerung Confused Very Happy Shocked . Den Unterschied merk man aber kaum.

Das ist die Funktion:

v(i) = a * i² - a * t * i

Wenn man bei der Parabel von der Form y = c*x² + p*x + q ausgeht
so wäre a in diesem Fall -(6*b)/(t^3) das c, also die Krümmung der Parabel
b ist die länge des Weges, der zurückgelegt werden soll.
t ist die Anzahl der Umläufe bis zur Ankunft

i ist Ersatz für x, steht für die Umläufe
p wäre = a * t, also eigentlich -((6*b)/(t^3))*t. Die Einrechung von a benötigt man, damit die zweite Nullstelle der Parabel genau in t liegt.
q, der y-Achsenabschnitt ist 0, weil die Geschwindigkeit zum Zeitpunkt 0; gleich 0 ist.

die vollständige Funktion lautet also:
v(i) = (-(6*b)/(t^3))*i^2 - (-(6*b)/(t^3))*t*i

Das schöne daran ist, dass man mit t die Anzahl der Umläufe, die die Bewegung überdauern soll, genau einstellen kann.


Wenn ihr die Funktion anwenden wollt, müsst ihr nur den Abstand zum Punkt berechnen(b), t irgendwie festlegen (vielleicht nicht unbedingt < 50, je nach dem) und eine Variable i, die in der Hauptschleife von 0 bis t zählt.
Sie liefert euch dann die Gschwindigkeit.

Hier eine Anwendung:
(t, also die Anzahl der Umläufe, über die die Bewegung gehen soll, kann man mit dem Mausrad im Programm, oder im Code verändern. je kleiner t desto schneller die bewegung)

Code: [AUSKLAPPEN]
AppTitle "Smooth Move"
Graphics 800,600,16,2
SetBuffer BackBuffer()

Const zoom = 1

Global xcor#,ycor#,i#,t,mx,my,zx,zy,b,ox,oy,v#,a#

Function spat#(x1#,y1#,x2#,y2#)
Return Sqr#((x1-x2)^2+(y1-y2)^2)
End Function

xcor = 400
ycor = 300
t = 170
i = t

ox = 610
oy = 570

Repeat
mx = MouseX()
my = MouseY()

t = t + MouseZSpeed()

If MouseHit(1) Then
zx = mx
zy = my
i = 0
b = spat(xcor,ycor,zx,zy)
EndIf

If i<t Then
roll# = ATan2(zy-ycor,zx-xcor)
a = -(6*b)/(t^3)
v = a*i^2 - a*t*i
xcor = xcor + Cos(roll)*v
ycor = ycor + Sin(roll)*v
i = i + 1
EndIf

Color 255,255,255
Text 100,0,"Umläufe "+Str$(i),1,0
Text 100,10,"Obergrenze "+Str$(t),1,0
Text 100,20,"Geschwindigkeit "+Str$(v),1,0

Color 255,255,255
Rect zx-5,zy,11,1
Rect zx,zy-5,1,11

Color 255,0,0
Rect xcor-5,ycor,11,1
Rect xcor,ycor-5,1,11

;Parabel

Color 255,255,255
Rect ox-20,oy,200,1
Rect ox,oy-180,1,200

Color 0,0,255
For u = -20 To 180
WritePixel ox+u*zoom,oy-((a*u^2 - a*t*u)*zoom),255*$10000 + 255*$100
Rect ox+u*zoom,oy-(a*u^2 - a*t*u)*zoom+1,zoom,(a*u^2 - a*t*u)*zoom-1
Next

Color 0,255,0
Rect ox+t*zoom,oy*zoom-2,1,5
Text ox+t*zoom,oy*zoom+8,"t",1,1

Color 255,0,0
Rect ox+i*zoom-1,oy-v*zoom-1,3,3

Flip
Delay 20
Cls
Until KeyHit(1)
End


Wie ich drauf gekommen bin? Mit Intergralrechnung. Soll ich präzisieren?
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
  • Zuletzt bearbeitet von Kabelbinder am Mi, Aug 15, 2007 19:48, insgesamt einmal bearbeitet
 

Marek

BeitragMi, Aug 01, 2007 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt noch nen kleinen Bug bei Minimal-Extrem-Werten(also extrem kleine Werte):
user posted image

Ich denke der Fehler wird daraus ersichtlich Wink
Wer lesen kann ist klar im Vorteil...

Kabelbinder

Sieger des WM-Contest 2006

BeitragMi, Aug 01, 2007 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, ich sehe kein Bild.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

d-bug

BeitragDo, Aug 02, 2007 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Wunder, er hatte es in der Galerie hoch geladen, dafür ist sie aber nicht gedacht. Ich schrieb ihm eine PM, dass er es woanders hoch laden solle und löschte den Galerieeintrag!

cheers

Kabelbinder

Sieger des WM-Contest 2006

BeitragDo, Aug 02, 2007 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok...

@Marek: Kam dieser Bug vielleicht daher, dass im Code steht:

Code: [AUSKLAPPEN]
If i<t Then

müsste es dann eigentlich
Code: [AUSKLAPPEN]
If i<=t Then

heißen? Denn sonnst nimmt er den letzten Wert nicht mehr, glaube ich.

War es das, was du meintest?

Edit: Wobei mir gerade auffällt, dass der letzte Wert (t) nicht wirklich relavant sein sollte:

v = -(6*b)/(t^3)*t^2 - -(6*b)/(t^3)*t*t
v = -(6*b)/(t) - -(6*b)/(t)
v = -(6*b)/(t) + (6*b)/(t)
v = 0
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

Marek

BeitragDo, Aug 02, 2007 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, mache t mal so klein, das er fast die y-Achse des Graphen berührt un mach dann mal nen Linksklick. Das rote Kreuz geht dann nicht mehr bis zum weißen Kreuz, sondern bleibt vorher stehen. Is nur ein minibug und i.a. zu vernachlässigen...

Ps.: Der Fehler tritt bei ungefähr 20Umläufen auf, wenn man eine lange Distanz wählt (Fensterdiagonale).
Wer lesen kann ist klar im Vorteil...

Kabelbinder

Sieger des WM-Contest 2006

BeitragDo, Aug 02, 2007 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, Tatsache.

Liegt glaube ich daran, dass bei kleinen werten für t das Treppenstufenmuster unter der Parabel mehr zur Geltung kommt.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group