[gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
joggel

[gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von joggel »

Guten Morgen,

da ich zur Zeit einen scroll-down 2D-SpaceShooter programmiere, stehe ich gerade vor einem mathematischen Problem.

Die feindlichen Raumschiffe sollen sich von Oben nach Unten bewegen, jedoch nicht einfach nur "runter fallen" sondern einen Pfad passieren der von Links nach Rechts und wieder zurück verläuft.
Also quasi so in der Art:
Unbenannt.png
Ich möchte also die Position auf dem Pfad zu einem ganz bestimmten Zeitpunkt errechnen.
Sobald das Raumschiff den Bildschirm "betritt" beginnt die Messung der Zeit!
Achso, die Geschwindigkeit mit der sich das Raumschiff bewegt ist natürlich auch gegeben: v ^^

Ich habe die Vermutung, dass man das mit hilfe von Splines realisieren kann, denke aber fast, dass das zu umständlich ist.

Gruß
Zuletzt geändert von joggel am 25.02.2014, 10:14, insgesamt 1-mal geändert.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von Schrompf »

Ka Thema. Von oben nach unten geht's linear, also ist y = t * v_vertikal. Und für x generieren wir einen doppelten Sägezahn in der Form:

x = fmod( t * querfrequenz ); // Ergibt einen einfachen Sägezahn, der von links nach rechts linear steigt und dann zurückspringt
x = abs( 2.0f * fmod( t * querfrequenz ) - 1.0f); // Ergibt dann einen doppelten Sägezahn, der linear von links nach rechts und zurück verläuft.

Beide Werte jeweils skalieren, bis sie den von Dir gewünschten Bildschirmbereich abdecken.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von Artificial Mind »

Mit Splines bekommst du hauptsächlich eine Pfad, der 'smooth' ist.

Für den linearen Fall kannst du das einfach so machen:
t_start: Anfangszeit
v: Geschwindigkeit
t_curr: Aktuelle Zeit

Aktuelle Strecke
s = v * (t_curr - t_start)

Code: Alles auswählen

vector<Point> Points = ...;
int currP = 0;
while ( s > 0 ) {
  float dis = distance(Points[currP], Points[currP + 1]);
  if ( s < dis )
    return lerp(Points[currP], Points[currP + 1], s / dis);
  s -= dis;
  ++currP;
}
Das wird auch vermutlich schnell genug sein, ansonsten kann man da auch mit binärer Suche tricksen.
Natürlich ist das eher Pseudocode und es fehlen noch die Randfälle.

EDIT: Schrompf war schneller :D
joggel

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von joggel »

Das sieht alles sehr brauchbar und vernünftig aus.
Ich danke den Beteiligten :)

schönes Wochenende...
joggel

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von joggel »

Habe da noch ein paar Fragen...

@Schrompf:
Was meinst Du mit "querfrequenz"?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von Schrompf »

Eine Frequenz ist immer eine Anzahl Auftreten pro Sekunde. Die Querfrequenz hier gibt also an, wie oft pro Sekunde einmal komplett hin und wieder zurück bewegt wird. Du solltest da also sowas wie 1/20 oder sowas einsetzen, damit der Weg dann 20s braucht.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
joggel

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von joggel »

Achso, also wie oft (in der sekunde) die richtung umschlägt.
Mh... finde ich irgendwie nicht sehr schön.
Vorallem, es wird nicht unbedingt eine regelmäßige Bewegung. Der Anstieg von P1 zu P2 kann einen anderen haben, als bspw P3 zu P4.
Ich will also die Möglichkeit haben, dass ich ganz unregelmäßige Passpunkte übergebe und dass sich dieses Raumschiff dann mit konstanter Geschwindigkeit zwischen diesen bewegt.

Ich schaue mir mal die Variante von Artifacial Mind an...
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von Artificial Mind »

Meine Version funktioniert für beliebige Punktlisten. Ich denke auch, dass das kein Performanceproblem gibt. Außer vielleicht bei 100.000 Raumschiffen mit jeweils 1000 Waypoints.
joggel

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von joggel »

Prima!!
Da werde ich mich mal an diese Implementation machen, allerdings scheint diese lerp-Funktion eine DirectX-spezifische Funktion zu sein... aber das sollte ja nicht das Problem sein...
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von dot »

Hier bitte: lerp(a, b, t) = (1.0f - t) * a + t * b ;)
joggel

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von joggel »

dot hat geschrieben:Hier bitte: lerp(a, b, t) = (1.0f - t) * a + t * b ;)
:) ... danke-danke!!
Da muss ich ja fast gar nicht mehr selber nachdenken^^
joggel

Re: Punkt auf einem Pfad zu einem bestimmten Zeitpunkt

Beitrag von joggel »

Es Funktioniert!!!!
-ein Traum- :D
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpu

Beitrag von Artificial Mind »

Kurzer Nachtrag: lerp steht für linear interpolate(d) ;)
joggel

Re: [gelöst] Punkt auf einem Pfad zu einem bestimmten Zeitpu

Beitrag von joggel »

Artificial Mind hat geschrieben:Kurzer Nachtrag: lerp steht für linear interpolate(d) ;)
Jopp, haben meine Internetrecherchen auch ergeben ;)
Antworten