Zahlenbereich auf einen anderen Zahlenbereich abbilden (für eine "Karte")

A new update is now available, introducing seasons and more!
Latest hotfix: 0.8.0.1 (2024-12-20)
  • Hallo miteinander,


    da es noch keine Karte/Map gibt und ich nicht davon ausgehe, daß es in geologisch absehbarer Zeit eine geben wird, bin ich dabei so etwas Ähnliches in Eigenentwicklung zu programmieren. Im Grunde nur erst mal einen Lageplan wo welcher Wegpunkt liegt auf einer quadratischen "Karte".


    Als Wegpunkt-Basis lese ich die SQLite-Datenbank von dem SimpleHome Script aus. Ermittle daraus die mindest und maximal Werte für X und Y (in der Datenbank Z!!!, Y ist in der DB die Höhe welche aber für meinen Zwecke keine Rolle spielt).


    Die Grafik hätte ich gern quadratisch mit 1000 x 1000 Pixeln.
    Somit haben wir folgende Informationen vorliegen (für die X-Achse (die Y-Achse ist ja äquivalent zur X-Achse)


    XWegpunktMin = 1271.881592 (Zahlenwerte sind als Beispiel aus meiner DB)

    XWegpunktMax = 4896.146484

    (Zahlenwerte sind als Beispiel aus meiner DB)

    XBildMin = 0
    XBildMax = 999



    Mit welcher Formel berechne ich nun den neuen X-Wert um diesen auf der "Karte" zu positionieren? Ich hab schon einiges ergooglet aber nichts für mich brauchbares/umsetzbares gefunden :-(


    Programmiert wird der ganze Spaß in PHP als Webanwendung.


    Ich danke Euch schon mal im vorraus

  • Ich bin zwar kein Programmierer, aber ich denke, dass du ein Maßstab definieren muss, um auf dein gewünschtes Ergebniss kommen zu können.


    Den Maßstab würde ich so definieren:

    X max minus X min = 4896 - 1272 = 3624 Blöcke

    3624 Blöcke durch 1000 Pixel = 1 : 3,624


    also müsste man sinngemäß in der Programmierung sagen:

    Block 1,000 bis 3,624 = Pixel 1,

    Block 3,625 bis 7,248 = Pixel 2 usw.

    Ich hoffe ich konnte dir da ein bisschen weiter helfen.


    Mfg

    SMoka

  • @SMkoa: Deine Idee ist nicht verkehrt, aber führt nicht wirklich zum gewünschten Ziel. Bei X = 3700 käme man ja bei ~ 1020 raus - aber das ist ja schon wieder außerhalb des gesamten Bereichs. X = 3700 sollte ja dann ca 1 bis 2 sein, damit es am linken Rand ist.


    Deirdre: ja mit F3 könnte ich die Koos auch auslesen, aber händisch. So stehen sie weiterverarbeitbar in der Datenbank ;-)

  • @SMkoa: Deine Idee ist nicht verkehrt, aber führt nicht wirklich zum gewünschten Ziel. Bei X = 3700 käme man ja bei ~ 1020 raus - aber das ist ja schon wieder außerhalb des gesamten Bereichs. X = 3700 sollte ja dann ca 1 bis 2 sein, damit es am linken Rand ist.


    Deirdre: ja mit F3 könnte ich die Koos auch auslesen, aber händisch. So stehen sie weiterverarbeitbar in der Datenbank ;-)

    Ich hätte gerne einen Teleporter, der direkt im Spiel integriert ist. Plugins sind toll, keine Frage, aber ich habe so viele verschiedene bebaute Plätze in meiner Welt, dass ich mir die Koordinaten nicht mehr aufschreibe, zuviel einfach. Der Teleporter damals in der Java-Version, er war allerdings nur für Multiserver, aber man hatte seine eigenen Teleportzahlen im Kopf und musste nicht jedesmal einen Namen dazu schreiben. Mit einer Karte könnte ich nichts anfangen, lieber behalte ich 20 verschiedene Zahlen im Kopf. ;)

  • Ich bin mir nicht sicher, ob ich die Problematik richtig verstanden habe :saint: Heißt das, du möchtest eine Weltkoordinate des Spiels auf den entsprechenden Map-Tile umrechnen (d.h. in dem Fall immer in den Bereich von 0-999 bringen)? In dem Fall ist der Modulus bzw. Modulo hilfreich: In den meisten Sprachen (einschl. PHP) ist das der % Operator. Bei einer Tile-Größe von 1000x1000 würde das zB so aussehen: 1271 % 1000 ergäbe 271, 4896 % 1000 ergäbe 896 usw (also immer einen Wert zw. 0 und 999).


    Wenn du auch den "Offset" des Map-Tiles möchtest (1271 wäre ja zB im 2. Tile, während 4896 im 5. Tile wäre etc) kannst du einfach eine Ganzzahldivision durchführen (in PHP könntest du dafür intdiv() verwenden). Beispiel: intdiv(1271, 1000) ergäbe 1 (also der 2. Map-Tile, wenn man bei 0 anfängt zu zählen), intdiv(4896, 1000) ergäbe 4 (also Map-Tile 5) usw ;)


    Oder habe ich das falsch verstanden und stattdessen möchtest du in deinem Beispiel, dass 1271.881592 = 0 entspricht und 4896.146484 = 999? Oder bin ich vll komplett auf dem Holzweg? :drunk:

  • Oh achso :saint: D.h. dein neuer Minimalwert (im obigen Beispiel) soll dann 1271.881592 sein (das ist also die neue "0") und der Maximalwert 4896.146484 (die neue "999")? Bzw anders gesagt, du möchtest 1271 bis 4896 in den Bereich 0 bis 999 bringen?


    Gehen wir davon aus wir speichern unseren erlaubten Wertebereich (0-999) als Konstanten (MIN und MAX). Unsere Koordinate 1271.881592 speichern wir als $min und 4896.146484 als $max. Wir würden nun erstmal die Differenz zwischen $min und $max berechnen ($max - $min). Anschließend ziehen wir $min noch von unserem Eingabewert (nennen wir ihn $value, also die Koordinate, die du in den Bereich 0-999 bringen willst) ab und teilen das dann durch unsere neu berechnete Differenz: ($value - $min) / ($max - $min). Das ergibt einen Wert zw. 0 und 1. Fügen wir nun noch MIN und MAX hinzu, erhalten wir den Wert zwischen 0 und 999 (MIN + (MAX - MIN) * $value). In eine Funktion gepackt könnte das in PHP so aussehen:


    Code
    define("MIN", 0);
    define("MAX", 999);
    function getCoordinate(float $value, float $min, float $max) {
    //Wert in Bereich 0-1 umrechnen
    $value = ($value - $min) / ($max - $min);
    //Wert in Bereich zwischen MIN und MAX umrechnen
    return MIN + (MAX - MIN) * $value;
    }


    Beispielausgaben:

  • Jippiiiiie 8)  red51: es funktioniert :love:


    nun endlich mal nen Lageplan wo sich was befindet :)

    Grundfunktion funktioniert und nun die ganze Sache noch etwas hübsch machen und vielleicht auch anhand von Wegpunkt-Prefixen und Nummer auch noch Linien zeichnen. Dann könnte man zumindest Linien definieren...

  • red51


    Mit "Nullpunkt" links oben so wie generiert hab ich folgendes Ergebnis:


    Nun mal das Bild gespiegelt, da stimmt die Laufrichtung dann, am "Leuchtturm1" am Ufer nach rechts gehen habe ich das Wasser auf der linken Seite und gehe in die Bucht rein:


    Nun passen nur noch nicht die Himmelsrichtungen (wie allgemein üblich hätte ich Norden gerne oben, ich glaube dazu müßte ich das gesamte um 90° Links drehen.

    Da ich bisher nur im positiven Zahlenbereich mich bewegt und gebaut habe weiß ich nicht ob es auch einen "negativen" Bereich gibt.

    Wie ist das Gitternetz für die Karte aufgebaut? Ich hab soweit meine Kartengenerierung bereit. Der "Nullpunkt" liegt derzeit links oben in der Ecke. Das passt aber nicht - aber erst mal kein Problem. Ich muß das Bild nur auf der X-Achse spiegeln. Aber die Nord-Süd-Ausrichtung stimmt nicht und muß das Bild glaube noch um 90° nach links drehen.

    Ist es ein "Kreuz-Koordinaten-System" mit dem Nullpunkt in der Mitte?

  • Ja, es gibt durchaus einen negativen Bereich ;) Das Spiel bzw. Unity verwendet ein linkshändiges Koordinatensystem: Die X-Achse zeigt also nach rechts bzw. Osten, die Z-Achse zeigt nach vorne bzw. Norden und die Y-Achse zeigt nach oben (also die Höhe). Auf ein Bild übertragen wäre der Nullpunkt also unten links. Die X-Koordinaten sind also dann nach rechts anzuwenden (bzw. nach links wenn der Wert negativ ist) und die Z-Koordinaten nach oben (bzw. unten wenn negativ).

  • Toll, über den Leuchtturm oder Leichenturm, bin ich etwas verwundert. ^^ Was meinst du mit 790 Waypoints?

    Ein Leuchtturm für die Schifffahrt am Ufer ;) na mit dem SimpleHome Plugin hab ich insgesamt bisher 790 Waypoints (Sprungziele) angelegt. Die sind namentlich differenziert. Alles was für Linien/Polygone benötigt wird mit fängt mit L- an.

    L-IU-<inselname>-<fortlaufende Nummer> - für die Insel(n)

    L-WEG-<wegname>-<fortlaufende Nummer> für Wege

    L-STR-<strassenname-<fortlaufende Nummer>- für Straßen, sind breiter als Wege

    L-SEE-<see-/teichname>-<fortlaufende Nummer> für Teiche /Seen

    mal schauen was perspektivisch noch dazu kommt

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!