Smooth Move
Übersicht

![]() |
KabelbinderSieger des WM-Contest 2006Betreff: Smooth Move |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Es gibt noch nen kleinen Bug bei Minimal-Extrem-Werten(also extrem kleine Werte):
![]() Ich denke der Fehler wird daraus ersichtlich ![]() |
||
Wer lesen kann ist klar im Vorteil... |
![]() |
KabelbinderSieger des WM-Contest 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, ich sehe kein Bild. | ||
<Wing Avenger Download> ◊◊◊ <Macrophage Download> |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
KabelbinderSieger des WM-Contest 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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... |
![]() |
KabelbinderSieger des WM-Contest 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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> |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group