Positionsangabe im Weltraum



  • Hi,

    ich hab heut morgen schon mit einen paar in #cpp darüber diskutiert, aber am Ende scheiterte es an unserer Müdigkeit. 😃

    Also, ich würde gerne in einem Weltraum, der mehrere Lichtjahre groß sein kann (am Anfang aber nicht), eine Position eindeutig bestimmen.

    Folgende Möglichkeiten:
    - float und double fallen schon mal raus, weil die zu ungenau werden, desto größer die Zahlen werden
    - ein long für den Sektor (10-1000km in alle 3 Dimensionen groß) und einen float oder einen double, um die Position in diesem Sektor eindeutig zu bestimmen
    - einen longlong (64-bit), um die genaue Position zu speichern, dann hätte ich aber das Problem, dass ich eine Art "kleinste Einheit", z.B. ein Millimeter haben muss, die einem Wert im longlong entspricht.

    Was würdet ihr wählen (oder was anderes)?

    ChrisM



  • ich würd die zweite Methode nehmen, kommt mir irgnedwie am einfachsten vor



  • Wenn du double benutzt, hast du auch eine kleinste Einheit.
    Du kommst um das Problem also nicht herum.

    Du könntest die Plank Länge als kleinste Einheit nehmen. Ist schliesslch auch in der Realität so.
    Das wären dann 10^-35 m. Das heisst du brauchst eine 173bit Variable um die Position innerhalb eines Lichtjahres genau festzulegen. Das teilst du am besten auf 6 long Variablen auf.



  • Hi,

    dass ich auch bei double eine kleinste Einheit hab, ist mir schon klar, nur ist diese wesentlicher kleiner als halt ein Millimeter.

    Wenn ich jetzt das mit den Sektoren und einem float mache, wie groß darf der Sektor dann sein, dass der float noch eine genaue Darstellung ermöglicht.

    ChrisM



  • Unter Umständen ist es einfacher, wenn Du dafür ne Festkommavariable nimmst. Da kannste Du die Ungenauigkeit viel besser abschätzen.

    MfG Jester



  • Geh mal grob von 7 stellen aus. Aber muss es denn tatsächlich genauer, als ein Millimeter sein. Würde es irgendjemand merken, wenn ein Schiff, einen zentel Millimeter weiter rechst steht?



  • Hi,

    nein, das merkt niemand, aber wenn der Server z.B. bei 200 FPS läuft und sich das Schiff langsam bewegt, passiert es bei einer zu geringen Koordinatenauflösung, dass es sich halt gar nicht mehr bewegt!

    Deswegen würde mich halt doch interessieren, wie ihr das jetzt realisieren würdet...

    ChrisM



  • Ein float hat nur 32 bit. Kann also gar nicht genauer sein als ein long.
    Nimm am besten ein long für den Sektor und ein longlong für die genaue Koordinate.



  • Hi,

    das weiß ich. Aber ich wär trotzdem glücklicher, wenn es mit float oder double ginge, denn für die Darstellung brauch ich die Daten als float/double und wenn ich es als longlong hab, muss ich ja immer umrechnen.

    Reicht ein float/double nicht aus, um auf einer Strecke von 0 bis 1000 (100 würden auch reichen), ein Punkt auf z.B. 4 Nachkommastellen genau anzugeben?

    ChrisM



  • Wie wäre es wenn Du verschiedene Gitterverfeinerungen benutzt, quasi erst die Qubenbestimmung auf einem Meter genau und anschließend den entsprechenden Zielqubus mit einer Genauigkeit von Mikrometer etc. ?

    Quasi
    Grob(1,3,10) mit
    Mittel(17,4,6)[von Grob(1,3,10)] und
    Fein(2,2,7)[von Mittel(17,4,6)[von Grob(1,3,10)]]



  • wie wärs mit 2 Winkel(2 mal long double), und die streke in Lichtjahren/Tagen/minuten/sec...(ein mal long int, der rest short)



  • Hi,

    irgendwie alles etwas kompliziert und vor allem groß. Das Ganze wird ja ein Onlinegame und da muss jeder Schuss und alles übertragen werden.

    Nochmal: Denkt ihr, ein long für den 100km^3-Meter großen Sektor und dann einen float/double für die Position in diesem Sektor reichen für eine genügend genaue (~1mm) Positionsbestimmung?

    ChrisM



  • Was genau hat dich denn jetzt an einem int64 für Alles gestört? Haben wir uns im IRC doch verrechnet? 😉



  • Hi,

    naja, mal rechnen...

    Ein __long64 für alles ->
    Gewünschte Auflösung sagen wir mal: 1mm

    2 ^ 64 = 18446744073709551616mm
    = ~18446744073709551m
    = ~61489146912 Lichtsek.
    = ~1949 Lichtjahre

    Das hat ich im Chat ja auch schon raus, aber kann das stimmen?

    ChrisM



  • Ich denk schon daß das stimmt. Warum denn nicht?



  • Hallo,

    ich würde das nicht mit nur einem wert pro dimension machen,
    1. Weil man aus einer mehrteiligen positionsangabe viel mehr herauslesen kann (nutzer/spieler) z.B. Quadrant Sektor Position im Sektor, dann weiss man auf den ersten Blick, in welchem Teil der Galaxie man sich aufhält.
    2. Hat es bestimmt auch einige Vorteile für das Programm, wenn zum Beispiel eine grafische Ausgabe erfolgen soll, musst du ja herausfinden welche Schiffe alle gezeichnet werden sollen, da wäre doch eine Datenstruktur in mehren Teilen sinnvoller, als wenn du alle schiffspositionen durchgehen und vergleichen musst.
    Kollisionsprüfung müsste so auch einfacher sein.

    Gibt noch ein paar mehr Gründe für eine mehrteilige Struktur, aber ich glaube es ist klar was ich meine.

    kibble



  • Ein anderer Vorteil einer Mehrteiligen Struktur ist auch, dass dur eine Datenreduktion herbeiführen kannst, indem du nur wenn nötig (beim Wechsel eines Quadranten) die Angaben der höheren Hierarchie (Quadrant) mitlieferst. Ansonsten kannst du darauf verzichten und lediglich die Position innerhalb des Quadranten versenden, was mit wesentlich weniger Daten auskommen sollte.

    -junix



  • Ich stelle mal die Notwendigkeit eines kontinuierlichen Weltraumes in Frage. Geschwindigkeiten, bei denen Interaktion zwischen Spielern oder Spielobjekten stattfindet, sind normalerweise weit unter einer Geschwindigkeit, die im Maßstab von 1000en von Lichtjahren eine Rolle spielt. Dh es gibt eine Unterscheidung zwischen globalen Koordinaten und Koordinaten, die lokal zu einer Interaktion sind.
    Dabei unterstelle ich, dass du das übliche Sci-Fi-Klischee bedienst, nachdem die Lichtgeschwindigkeit (nur) im Hyperraum überwunden werden kann. Mit "normalen" Geschwindigkeiten Lichtjahre überwinden zu wollen dauert schließlich auch Jahre 😉



  • tja jetzt hast du leider kein problem... wie schade... 😃

    ich kann ja mal eines aufwerfen... fürs rendering auf dem zbuffer bekommst du bei 2^24 unterteilungen zfighting wenn du grosse weiten und nahe objeckte darstellen möchtest 😃

    rapso->greets();



  • das wird man ja noch irgendwie lösen können


Log in to reply