Länge einer Edge ermitteln

Willkommen in der Transport Fever Community

Wir begrüßen euch in der Fan-Community zu den Spielen Transport Fever und Train Fever, den Wirtschaftssimulatoren von Urban Games. Die Community steht euch kostenlos zur Verfügung damit ihr euch über das Spiel austauschen und informieren könnt. Wir pflegen hier einen freundlichen und sachlichen Umgang untereinander und unser Team steht euch in allen Fragen gerne beiseite.

 

Die Registrierung und Nutzung ist selbstverständlich kostenlos.

 

Wir wünschen euch viel Spaß und hoffen auf rege Beteiligung.

Das Team der Transport-Fever Community


  • Hier mal was für die Mathe-Helden ;):


    Für ein Infotool möchte ich die Länge einer Edge über die Endpunkte und die Tangenten ermitteln. Mehrere Fälle:

    1. Die Edge ist gerade. Kein Problem. Pythagoras hilft.

    2. Die Edge ist ein Kreissegment. Auch kein Problem, da gibt's eine Formel für.

    3. Die Edge ist eine unregelmäßige Kurve, z.B. eine S-Kurve. :?::?::?::?:


    entity2tn bietet die Möglichkeit, die Länge aus dem Mittelwert der Lanes zu ermitteln. Nachteil: Es wird bei Straßen nur der Bereich zwischen zwei Kreuzungen gemessen.

    Ich könnte auch wieder über die Tangenten mit der Radius-Formel einen Näherungswert berechnen. Dieser stimmt aber bei unregelmäßigen Kurven nicht mit entity2tn überein.

    Lollo berechnet die Länge wohl aus der Länge der Tangenten. Aber das ist noch ungenauer.


    Das Beste wäre, wenn ich die Länge einer Edge über eine Funktion abgreifen könnte, die im Gegensatz zu entity2tn immer zwischen den Endpunkten misst. Keine Ahnung, ob eine solche Funktion existiert.

    Die andere Möglichkeit wäre ein Algorithmus, wie ihn UG zur Längen-Ermittlung benutzt. Ich denke, sie benutzen keine seitenlange Formel, sondern ein kurzes Näherungsverfahren.


    Here's something for the math heroes ;): (hello enzojz :):):!:)


    For an information tool, I would like to determine the length of an edge using the end points and the tangents. Several cases:

    1. The edge is straight. No problem. Pythagoras helps.

    2. The edge is a segment of a circle. No problem either, there is a formula for.

    3. The edge is an irregular curve, e.g. an S-curve. :?::?::?::?:

    entity2tn offers the possibility to determine the length from the mean value of the lanes. Disadvantage: Only the area between two intersections is measured on roads.

    I could also calculate an approximate value using the tangents with the radius formula. However, this does not match entity2tn at irregular curves.

    Lollo probably calculates the length from the length of the tangents. But that is even more imprecise.

    The best would be if I could get the length of an edge using a function that, unlike entity2tn, always measures between the end points. I don't know if such a function exists.

    The other possibility would be an algorithm such as that used by UG to determine length. I think they don't use a page-long formula, but a short approximation method.

    ... don't know much trigonometry ... don't know much about algebra ... don't know what a slide rule is for ...

  • Das Problem hat sich zur Hälfte gelöst. :) Inzwischen habe ich zufällig eine Formel gefunden. Dazu muss man wissen, das die von TPF benutzten "Bezierkurven" mit den verlängerten Tangenten und der umgedrehten Endtangente eigentlich Hermite-Splines sind. Nach wie vor weiß ich aber noch nicht, ob man irgendwo in der Tiefe der API-Funktionen womöglich auch einen Rückgabewert vom Spiel findet.


    The problem is half resolved. :) Meanwhile I found a formula by chance. You have to know that the "Bezier curves" used by TPF with the extended tangents and the reversed end tangent are actually Hermite splines. But I still don't know whether you will find a return value from the game somewhere in the depth of the API functions.

    ... don't know much trigonometry ... don't know much about algebra ... don't know what a slide rule is for ...

  • Von was möchtest Du denn die Länge messen? Die API gibt für den Pfad eines Fahrzeugs beispielsweise eine Liste aller Edges zurück. :

    Code
    api.engine.getComponent(vehicleID,66) -- TYPE: MOVE_PATH ... alle edges auf dem nächsten Abschnitt (Zwischen letzter und nächster Station)
    api.engine.getComponent(edgeId,52).edges[1].geometry.length -- TYPE: TRANSPORT_NETWORK ... Länge der einzelnen Edge


    Mit einem kleinen Script lässt sich beispielsweise die Länge einer Linie berechnen

  • Das sind die Längen der Fahrspuren! Eine Edge ist in mehrere Lanes aufgeteilt. Eine zweispurige Straße hat z.B. vier Lanes, davon die beiden äußeren für die Fußwege. Jede Lane wird separat berechnet, was ja auch Sinn macht, denn in Kurven nimmt die Länge der Lanes nach außen zu. Ist eine Haltestelle auf einer Lane, wird diese nochmals unterteilt. Nodes, die gleichzeitig Kreuzungen etc. sind, haben übrigens auch Lanes, und zwar eine ganze Menge. Das sind im Prinzip die Verbindungen, die bei Straßenbahnkreuzungen in Form eines Gleiswirrwarrs sichtbar werden. Die Ausgabe ist übrigens identisch mit entity2tn, was aber nur beim Bauen abgreifbar ist.


    Schön und gut, und ich greife ja auch darauf zurück. Ich schreibe momentan ein Infotool und benutze es, um die Steigung einer Straße zwischen zwei Kreuzungspunkten zu bestimmen. Wenn man den Durchschnitt der inneren und äußeren Lanes berechnet und die Sache mit den Haltestellen berücksichtigt, klappt das auch ganz gut.


    Aaaaber: Ich möchte auch die Gesamtlänge einer Edge vom Anfangs- bis zum Endnode ermitteln, die in o.g. Fall eben nicht der Nettolänge entsprecht. Die läuft nämlich von Kreuzungsmittelpunkt zu Kreuzungsmittelpunkt, wobei dieser auch nicht ohne Verrenkungen zu berechnen wäre, das wäre ja zu einfach! Die Gesamtlänge kann ich AFAIK nirgendwo mal eben abgreifen, falls doch, wäre ich für Tipps dankbar.


    Warum möchte ich überhaupt die Gesamtlänge berechnen? Ich möchte ja noch eine Straßenbau-Mod entwickeln, und da ist es günstig, wenn ich die Ergebnisse kontrollieren kann. Außerdem kann es immer wieder mal nützlich sein, die Länge zu ermitteln.


    Aber wie gesagt, ich habe jetzt zumindest einen Algorithmus, der genau das macht. Werde ich demnächst auch mal im Lexikon posten. Inzwischen suche ich nach weiteren Formeln, zum Beispiel, um die Steigung, Krümmung oder den y- oder z-Wert einer Hermite-Kurve über einem bestimmten Punkt auf der x-Achse zu bestimmen, allerdings nicht in Form einer Doktorarbeit, sondern als "Black Box", sprich Code-Fragment.

    ... don't know much trigonometry ... don't know much about algebra ... don't know what a slide rule is for ...

  • Sind diese Fragen/Formeln nicht die Sachen, an denen sich erfahrene Spieleprogrammierer vorbeitricksen? Die kosten viel Hirnschmalz und enden dann in elliptischen Integralen, die nur rekursiv lösbar sind. Ist mindestens mein Eindruck. Für die Kette bei meiner Anlegestelle bin ich ja mit dem Kopf durch die Wand, damit die Kettenglieder immer gleich lang sind.


    Ich würde vermuten, daß die 3D-Hermite-Kurve in Parameterform berechnet wird, also in 3D als (x(t), y(t), z(t)) und nicht (x, y(x), z(x)) - wobei jede der Funktionen eine Hermite-Kurve ist. Sonst hast Du Probleme, wenn die gekrümmte Straße zweimal an der gleichen x-Koordinate vorbekommt. Oder hast Du da andere Informationen?

    Auch die Animation der Fahrt mit konstanter Geschwindigkeit dürfte eher nicht über die Berechnung der Streckenlänge gekrümmter Wege laufen, sondern indem erst mal ein Schritt in der aktuellen Tangentenrichtung gemacht wird und dann eine Korrektur berechnet wird, die das Fahrzeug wieder näher an die tatsächliche Kurve zieht. Oder etwas, was dem Halbschrittverfahren bei DGLs näherkommt.


    Um die Doktorarbeit (bzw. eher um Teile einer Vorlesung Differentialgeometrie I) wirst Du bei Deiner Fragestellung kaum herumkommen.

    13! = 13*12!

  • Ich hab ehrlich gesagt keine Ahnung, wie Spieleprogrammierer sowas berechnen. Und Mathe hab ich seinerzeit abgewählt, bevor die Differentialgeometrie behandelt wurde. Zu der Zeit spielten Bezier- und Hermitekurven aber auch noch keine Rolle. Vielleicht muss ich mal sehen, ob eine frei herunterladbare Engine Einblick in den Code gewährt. Ansonsten bin ich mehr als nur einmal über Hermite-Interpolation gestolpert, aber hab nicht herausgefunden, was die genau macht. Der Wert t taucht dann und wann auch auf, du hast ihn ja auch angeführt. Was ist denn eigentlich t?

    ... don't know much trigonometry ... don't know much about algebra ... don't know what a slide rule is for ...

  • Na ja, Differentialgeometrie lernst Du an der Uni, wenn Du anfängst, Dich zu spezialisieren. Also nicht mal in den ersten Semestern. Die Anfangsgründe sind aber in der Spieleprogrammierung extrem hilfreich. Viel von diesen Anfangsgründen kapiert man ziemlich schnell, wenn man eine solide Basis der Analysis und Vektorrechnung hat, und irgend einen geeigneten Mikro-Text voller Formeln und hoffentlich den nötigen Bildern. :-)

    Was t anbelangt: Du weißt ja wahrscheinlich, daß eine Funktion jedem x-Wert genau einen y-Wert zuordnet. Für eine beliebige Kurve in der Ebene oder im Raum ist das natürlich nicht hilfreich, das scheitert schon an einem einfachen Kreis. Deshalb beschreibt man diese Kurven anders - man nennt das parametrisiert: Man nimmt einen Parameter t aus einem reellen Intervall und ordnet jedem Wert beide (oder alle drei) Koordinaten in der Ebene (oder im Raum) zu. Du kannst Dir das wie bei einer Autofahrt vorstellen (und es legt auch den Buchstaben t nahe), daß Du jedem Zeitpunkt beim Durchfahren der Kurve genau einen Punkt der Ebene (oder des Raumes) angibst. Das paßt wieder, weil Du Dich nicht gleichzeitig an zwei verschiedenen Stellen im Raum befinden kannst. Aber Du kannst im Kreis fahren.

    Natürlich kann man statt t auch einen anderen Buchstaben verwenden; s ist der zweitbeliebteste.

    13! = 13*12!

  • Nein, t ist kein Punkt in dem Raum, den Du gestalten willst, sondern (in einem möglichen Bild) der Zeitpunkt einer Autofahrt (z. B. 10 Uhr 23), an dem Du den Punkt (x(t), y(t), z(t)) im Raum bestimmst, auf dem Du Dich auf Deiner Fahrt durch den Raum befindest. Oder (in einem anderen Bild) kannst Du Dir vorstellen, den Weg durch den Raum mit einem flexiblen Maßband ausgelegt zu haben. t ist ein Punkt auf dem Maßband (z. B. bei 1,354 km) und (x(t), y(t), z(t)) sind die Koordinaten des 3D-Raumes, an denen sich der Punkt t des Maßstabes befindet.

    Du beschreibst also die Kurve im dreidimensionalen Raum, indem Du ein Intervall der reellen Zahlen (also z. B. die Zeit zwischen Abfahrt und Ankunft oder die Positionen auf dem Maßband zwischen Anfang und Ende) mittels der Funktionen t -> x(t), t -> y(t) und t -> z(t) in den dreidimensionalen Raum abbildest (t -> x(t) spricht sich als "t wird abgebildet auf x von t"). t ist aus diesem Intervall. Der Punkt (x(t), y(t), z(t)) liegt automatisch auf Deinem Spline (wenn x, und z die richtigen Splinefunktionen sind).

    13! = 13*12!

  • Also ist t sowas wie eine Längenrelation. t = 0 wäre der Anfang und t = 1 das Ende des Splines. t = 0.5 wäre dann die Mitte, also die Hälfte des zurückgelegten Weges, stimmts? Das wäre dann interessant, wenn ich z.B. auf halber Strecke den Spline teilen bzw. einen weiteren Punkt einfügen würde. Dafür hätte ich dann womöglich sogar eine Formel gefunden. Allerdings würde da noch die Ermittlung der Tangenten fehlen.

    ... don't know much trigonometry ... don't know much about algebra ... don't know what a slide rule is for ...

  • Das kommt der Sache deutlich näher, aber ist noch etwas zu speziell. Ich hatte ja schon die zwei Beispiele mit der Zeit und dem Maßband gebracht. Bei einer Autofahrt ist die zeitliche Mitte normalerweise nicht die streckenmäßige Mitte, z. B. wenn Du die erste Hälfte der Strecke Landstraßen fährst und die zweite Autobahn. Das sind unterschiedliche Parametrisierungen der gleichen Kurve. Es gibt viele Parametrisierungen und oft mehr als eine, die sinnvoll ist, wie die nach dem Maßband oder der Zeit. Andere sind vielleicht sinnvoll, weil mit ihnen besonders einfach zu rechnen ist. Solange Du nur eine Kurve beschreiben willst, kannst Du irgendeine Parametisierung nehmen.

    Die spezielle Parametrisierung, die Du beschreibst, nennt sich "Parametrisierung nach der Bogenlänge" und läßt sich für eine Reihe Kurven auch tatsächlich ausrechnen. Ich habe genau das für die oben erwähnten Kettenglieder gemacht.

    13! = 13*12!

  • Deine Hinweise haben mir auf jeden Fall weitergeholfen. Ich hatte da einige Formeln gefunden, aber mir war die Handhabung nicht klar. Sogar Minimalradien innerhalb einer Kurve lassen sich damit stückweise berechnen. In nächster Zeit werde ich dazu mal was im Lexikon veröffentlichen. Vielen hier dürfte die Thematik unbekannt sein, denn die Formeln aus dem Netz sind ohne Insiderwissen oft kaum verständlich. Für konkrete Ergänzungen bin ich nach wie vor dankbar.

    ... don't know much trigonometry ... don't know much about algebra ... don't know what a slide rule is for ...

BlueBrixx