Objekt Richtungsänderung mit Kurve

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Objekt Richtungsänderung mit Kurve

    Guten Morgen zusammen,

    ich möchte für ein Privates Projekt, ein Objekt von Punkt(A) nach Punkt(B) mit einer variablen Geschwindigkeit bewegen lassen.
    Nun habe ich hier im Forum schon einiges gefunden und weiß das man dazu Vektoren benutzt.

    Die reine Bewegung von (A) nach (B) entlang einer graden Linie kann ich wie folgt realisieren.

    Quellcode

    1. Private Sub MoveObj(ByVal istPosition As Point, ByVal sollPosition As Point, ByVal Speed As Single)
    2. Dim Obj_X As Single = sollPosition.X - istPosition.X
    3. Dim Obj_Y As Single = sollPosition.Y - istPosition.Y
    4. Dim l = Math.Sqrt(Obj_X ^ 2 +Obj_Y ^ 2) 'Vektorenlänge
    5. Obj_X = Obj_X * Speed / l
    6. Obj_Y = Obj_Y * Speed / l
    7. PictureBox2.Left += Obj_X
    8. PictureBox2.Top += Obj_Y
    9. End Sub


    Nun zu meiner Frage:

    Wie kann ich eine Kurven zu einer neuen Position realisieren? ?(
    Also wenn ich in der Bewegung zu Punkt(B) eine Richtungsänderung habe, soll diese nicht abrupt sein sondern in einer Kurve zu der neuen Position.

    Ich hoffe ich konnte mich verständlich ausdrücken :P

    Vorab schon mal Danke :thumbsup:
    @crash Wenn Du die Gleichung der Kurve in der Form y = f(x) bzw. y = f(t) hast, musst Du x bzw. t nur in entsprechend kleinen Schritten hochzählen und Du hast Deine Koordinaten.
    Übrigens:
    Die Vektorenlänge machst Du besser so, die Laufzeit wird es Dir danken:

    VB.NET-Quellcode

    1. Dim l = Math.Sqrt(Obj_X * Obj_X + Obj_Y * Obj_Y)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich glaube ich habe da doch ein größere Verständnis Problem.
    Ich weiß nicht genau wie ich die Kurve rechnen soll.

    In der Zwischenzeit habe ich es versucht über den Winkel bzw. Bogenmaß zu realisieren, hat aber auch nicht so richtig geklappt.
    @crash Fangen wir mal mit nem Kreis an:
    x² + y² = r²
    musst Du in Parameterdarstellung überführen:
    x = r * sin(phi)
    y = r * cos(phi)
    mit phi = { 0 ... 2 Pi }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    crash schrieb:

    das kann ich ja dann übernehmen, oder ?
    Nein.
    Wenn Du eine Kurve fahren willst, muss PHI laufen, und zwar von 0 bis 2PI in hinreichend kleinen Schritten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok Sorry, aber wie gesagt ich blick da einfach noch nicht ganz durch.

    ich habe jetzt das hier:

    Quellcode

    1. Dim x As Single
    2. Dim y As Single
    3. Dim r As Single = Math.Sqrt(p_ist.X * p_ist.X + p_ist.Y * p_ist.Y)
    4. For i = 0 To 2 Step 0.1
    5. x = r * Math.Sin(i)
    6. y = r * Math.Cos(i)
    7. Label2.Text = x.ToString & vbNewLine & y.ToString
    8. Next


    Ich hoffe es geht zumindest in die richtige Richtung.

    crash schrieb:

    Ich hoffe es geht zumindest in die richtige Richtung.
    Noch nicht ganz.

    VB.NET-Quellcode

    1. Dim r = 30
    2. For i = 0 To 2 Step 0.1
    3. Dim x = 50 + r * Math.Sin(i)
    4. Dim y = 50 + r * Math.Cos(i)
    5. Dim txt = String.Format("x = {0:0.00}, y = {1:0.00}", x, y)
    6. Me.ListBox1.Items.Add(txt)
    7. Next
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich denke, hier liegt ein Denkfehler vor.
    Ich würde nochmal zurück zu post#1, und die gradlinige Bewegung betrachten - die könnte nämlich Ausgangspunkt der Lösung sein, wenn sie entsprechend designed wäre.

    Nämlich die Methode sollte nicht Startpunkt, Zielpunkt, Geschwindigkeit übergeben bekommen, sondern nur das verstrichene Zeitinterval und die Geschwindigkeit, und zwar die Geschwindigkeit in Form eines Vektors.
    Wenn das geschafft ist, und man ruft die Methode mehrmals auf, dann bewegt sich das Objekt in die durch den GeschwindigkeitsVektor angegebene Richtung.
    Eine Kurve zu fahren ist dann einfach: Einfach zwischen den Aufrufen in kleinen Schritten die Richtung des GeschwindigkeitsVektors ändern - seinen Betrag dabei aber beibehalten.
    Das wäre ziemlich aufwändig, dir das mal eben hinzucoden.
    Das Grund-Prinzip findste zB hier umgesetzt: Kein Pong - Erstaunliches mit ItemsControl.Itemspanel
    Allerdings geht es dabei nicht um Kurven, sondern um Richtungs- und Geschwindigkeits-Änderungen aufgrund von Kollisionen (elastischer Stoß).

    Aber dasselbe Modell, nämlich: Körper mit einer Masse, einer Position und einem Geschwindikeits-Vektor
    könnte man ebensogut verwenden, um Kreisbahnen zu durchlaufen oder sonstwas für Bahnen.
    Ah - tatsächlich laufen meine Pong-Bälle ja Kurven - nämlich wenn der User einen anwählt und mit Pfeiltasten in x- oder y- Richtung beschleunigt/abbremst.

    Ansonsten wirste aber nicht viel mit anfangen können, weil ist Wpf.
    Nur die Viewmodel-Klasse kannste angugge, und dich davon überzeugen, dasses wirklich ganz einfach ist, und auf Positions- und Geschwindigkeits-Vektoren beruht.