Koordinatenberechnungen

Aus DSWiki

Wechseln zu: Navigation, Suche

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 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);
}