Koordinatenberechnungen
Aus DSWiki
Dieser Artikel verwendet mathematische Schreibweisen.
Inhaltsverzeichnis |
Koordinatensysteme
Aktuell gibt es bei DS zwei verschiedene Kartensysteme. Das eine System besteht aus einer x- und y-Achse, wobei (0|0) die Mitte der Karte darstellt. Auf Welt 3, Welt 4, Welt 5 und Welt 9 befindet sich ein hierarchisches System mit Kontinenten. Nähere Informationen gibt es in der Hilfe von "Die Stämme". Ab Welt 6 wird wieder das x|y-basierte Koordinatensystem verwendet, wobei der Mittelpunkt jetzt bei (500|500) liegt. Der Classic Server arbeitet trotz Server 2-Einstellungen auch mit einem Mittelpunkt bei (500|500).
Entfernungsberechnung
Die Entfernung wird nach dem Satz des Pythagoras berechnet. Um die Laufdauer der Einheiten in Minuten zu bekommen, muss man diese noch mit der Geschwindigkeit der jeweiligen Einheit multiplizieren.
Formel zur Entfernungs- und Zeitberechnung
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): x_1
= x-Wert der ersten Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): x_2
= x-Wert der zweiten Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): y_1
= y-Wert der ersten Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): y_2
= y-Wert der zweiten Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): speed
= Einheitengeschwindigkeit
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): distance
= Entfernung in Feldern
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time
= Zeit in Minuten
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): distance = \sqrt{\left(x_1 - x_2\right)^2 + \left(y_1 - y_2\right)^2 }
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time = distance \cdot speed
Anwendungsbeispiel
Die Entfernung von (-37|-26) zu (14|73) mit einer Schweren Kavallerie
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): distance = \sqrt{ \left(-37 - 14\right)^2 + \left(-26 - 73\right)^2 }
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): distance = 111{,}36
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time = distance \cdot 7{,}5
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time = 111{,}36 \cdot 7{,}5
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time = 835{,}2
Die Schwere Kavallerie braucht also 835,2 Minuten um von (-37|-20) zu (14|73) zu gelangen, also ca. 14 Stunden.
Umrechnen der Minuten in Stunden, Minuten und Sekunden
Formel
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time\_seconds
= Gesamtzeit in Sekunden
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): hours
= Teilzeit in Stunden
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): minutes
= Teilzeit in Minuten
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): seconds
= Teilzeit in Sekunden
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time\_seconds = time \cdot 60
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): hours = \left\lfloor \frac{time\_seconds}{3600} \right\rfloor
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): minutes = \left\lfloor \frac{time\_seconds}{60} \right\rfloor - \left(hours \cdot 60 \right)
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): seconds = time\_seconds \bmod 60
Anwendungsbeispiel
Greifen wir nochmal aus dem vorigen Anwendungsbeispiel die 835,2 Minuten auf. Diese rechnet man wie folgt in Stunden, Minuten und Sekunden um:
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): time\_seconds = 835{,}2 \cdot 60 = 50112
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): hours = \left\lfloor \frac{50112}{3600} \right\rfloor
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): hours = 13
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): minutes = \left\lfloor \frac{50112}{60} \right\rfloor - \left(hours \cdot 60 \right)
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): minutes = 835 - \left(13 \cdot 60 \right)
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): minutes = 55
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): seconds = 50112 \bmod 60
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): seconds = 12
Unsere Schwere Kavallerie braucht also genau 13 Stunden, 55 Minuten und 12 Sekunden um an ihr Ziel zu gelangen.
PHP-Code
Entfernungsberechnung und Zeit in Minuten (5 Parameter weglassen beim Aufruf, um die Entfernung zu ermitteln)
function unit_time($x1, $x2, $y1, $y2, $speed=1)
{
return hypot($x1 - $x2, $y1 - $y2) * $speed;
}
Umrechnung in Stunden, Minuten und Sekunden. Rückgabe als Array mit den Keys "hours", "minutes", "seconds".
function format_time($time)
{
$hours = floor(($time * 60) / 3600);
$minutes = floor($time) - ($hours * 60);
ACHTUNG: mit % kann es zu abweicheung von 1 sek geben
$seconds = ($time * 60) % 60;
besser ist die Berechnung mit
$seconds = round(fmod($time * 60, 60),0);
return array('hours' => $hours, 'minutes' => $minutes, 'seconds' => $seconds);
}
Anmerkungen zum Kontinental-Kartensystem
Um die Entfernungen dort zu ermitteln, muss man das Koordinatensystem erstmal in das xy-System umrechnen (siehe weiter unten) und dann die Berechnungen durchführen.
Umrechnung der beiden Kartensysteme
xy-System (Server 1, Server 2) zum Kontinent-System (Server 3, Server 4, Server 5)
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): con
= Kontinent
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): sec
= Sektor
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): sub
= Kartenfeld
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): y
= y-Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): x
= x-Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): con = \left\lfloor \frac{2 \cdot y}{100} \right\rfloor \cdot 10 + \left\lfloor \frac{2 \cdot x}{100} \right\rfloor
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): sec = \left( \left\lfloor \frac{2 \cdot y}{10} \right\rfloor \bmod 10 \right) \cdot 10 + \left( \left\lfloor \frac{2 \cdot x}{10} \right\rfloor \bmod 10 \right)
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): sub = \left( \left(2 \cdot y \right) \bmod 10 \right) \cdot 2{,}5 + \frac{\left(2 \cdot x \right) \bmod 10}{2}
Kontinent-System (Server 3, Server 4, Server 5) zum xy-System (Server 1, Server 2)
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): con
= Kontinent
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): sec
= Sektor
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): sub
= Kartenfeld
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): y
= y-Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): x
= x-Koordinate
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): x = \left(con \bmod 10 \right) \cdot 50 + \left(sec \bmod 10 \right) \cdot 5 + \left(sub \bmod 5 \right)
Fehler beim Parsen (Unbekannter Fehlernable to run external programs, passthru() is disabled.): y = \left\lfloor \frac{con}{10} \right\rfloor \cdot 50 + \left\lfloor \frac{sec}{10} \right\rfloor \cdot 5 + \left\lfloor \frac{sub}{5} \right\rfloor
Besonderheiten
Die Karte ist beim xy-System bei (0|0) zentriert, jedoch beim Kontinent-System bei (250|250). Wenn man also Koordinaten die von Server 1 oder Server 2 stammen in ihre Darstellung im Kontinent-System umrechnen möchte, so muss man bei x und y jeweils 250 hinzuaddieren.
Wenn man die Kontinent-Koordinaten von Server 3, Server 4 oder Server 5 in das xy-System umwandelt und als Karte darstellen möchte, so muss man die Karte an der x-Achse spiegeln, damit die Himmelsrichtungen stimmen. Dies erreicht man am leichtesten, indem man den y-Wert mit -1 multipliziert.
PHP-Code
function convert_coords_to_s3($x, $y)
{
if(abs($x) > 499 || abs($y) > 499) {
return false; // out of range
}
$x *= 2;
$y *= 2;
$con = floor($y / 100) * 10 + floor($x / 100);
$sec = (floor($y / 10) % 10) * 10 + (floor($x / 10) % 10);
$sub = ($y % 10) * 2.5 + ($x % 10) / 2;
return array('con' => $con, 'sec' => $sec, 'sub' => $sub);
}
function convert_coords_from_s3($con, $sec, $sub)
{
if($con < 0 || $con > 99 || $sec < 0 || $sec > 99 || $sub < 0 || $sub > 24) {
return false; // invalid s3-coords
}
$x = ($con % 10) * 50 + ($sec % 10) * 5 + ($sub % 5);
$y = floor($con / 10) * 50 + floor($sec / 10) * 5 + floor($sub / 5);
return array('x' => $x, 'y' => $y);
}