Runde Welt aus vorhandenen X, Y, Z ISO-MAP?

NicoBerg

Grünschnabel
Hallo, ich habe folgendes Problem:

Ich habe eine Karte, die eigentlich (5*5)*(4*4)*(3*3) felder hat... sprich im grunde ein Würfel ist, wenn man es so nimmt...

jetzt möchte ich aber gerne wenn meine Karte 25*16*9 groß ist, das ich von 1*1*1 genauso lange zu 25*16*9 brauche, wie zu 1*1*2 denn diese Felder würden eigentlich neben einander liegen.

Noch habe ich die Karten Funktion nicht angepasst, die würde eigentlich dann so springen, das wenn man am rechten Rand ist, das man zurück zum linken Anfang kommt, dass dann aber in jede Richtung.

Mein Ziel ist es eigentlich, das egal wo ich auf der Karte bin immer den Kürzesten Weg über den Kartenrand (Runde Welt zumindest so vorgestellt) hinweg findet.

Kann mir dabei jemand Helfen? Ich weiß nicht mehr wo ich ansetzen soll, ist mein erstes Browsergame was ich zu Programmieren versuche.

Vielen Dank!

Hier einfach mal mein Code:

PHP:
define("WORLD_POS1",25); // MAX_X_POS1 * MAX_Y_POS1

define("WORLD_POS2",16); // MAX_X_POS2 * MAX_Y_POS2

define("WORLD_POS3",9); // MAX_X_POS3 * MAX_Y_POS3

define("MAX_X_POS1",5); // X = Y && Y = X kann sich eigentlich nie ändern
define("MAX_Y_POS1",5);

define("MAX_X_POS2",4); // X = Y && Y = X kann sich eigentlich nie ändern
define("MAX_Y_POS2",4);

define("MAX_X_POS3",3); // X = Y && Y = X kann sich eigentlich nie ändern
define("MAX_Y_POS3",3); 

// Inselgruppen Navigation
function jumpIgUp($oz,$gr){
	if ($gr > MAX_X_POS2)
		$retval = array($oz,$gr -  MAX_X_POS2);
	else
		$retval = array($oz - MAX_X_POS1, $gr + MAX_X_POS2 * MAX_X_POS2 - MAX_X_POS2 );
	if ($retval[0] <= 0) 
		$retval = array($oz,$gr);
	return $retval;
}

function jumpIgDown($oz,$gr){
	if ($gr <= (MAX_X_POS2*MAX_X_POS2-MAX_X_POS2))
		$retval = array($oz,$gr +  MAX_X_POS2);
	else
		$retval = array($oz + MAX_X_POS1, $gr - MAX_X_POS2 * MAX_X_POS2 + MAX_X_POS2 );
	if ($retval[0] > (MAX_X_POS1 * MAX_Y_POS1)) 
		$retval = array($oz,$gr);
	return $retval;
}

function jumpIgRight($oz,$gr){
	if (ceil($gr/MAX_Y_POS2) == $gr/MAX_Y_POS2){
		if (ceil($oz/MAX_Y_POS1) == $oz/MAX_Y_POS1)
			$retval = array($oz, $gr);
		else
			$retval = array($oz+1, $gr - MAX_Y_POS2 + 1);
	}
	else 
		$retval = array($oz, $gr+1);
	return $retval;
}

function jumpIgLeft($oz,$gr){
	if ((ceil($gr/MAX_Y_POS2)*MAX_Y_POS2-MAX_Y_POS2+1) == $gr){
		if ((ceil($oz/MAX_Y_POS1)*MAX_Y_POS1-MAX_Y_POS1+1) == $oz)
			$retval = array($oz, $gr);
		else
			$retval = array($oz-1, $gr + MAX_Y_POS2 - 1);
	}
	else 
		$retval = array($oz, $gr-1);

	return $retval;
}

// Wird benötigt, um einen X und Y Wert einer Insel zu erhalten (Diese wird in getDistance weiterverwendet)
function getPosWater($ozean, $gruppe, $position){
	$ozean--; $gruppe--; $position--;

	$ozx = floor($ozean / MAX_X_POS1);
	$ozy = $ozean - MAX_X_POS1 * $ozx;
	
	$grx = floor($gruppe / MAX_X_POS2);
	$gry = $gruppe - MAX_X_POS2 * $grx;
	
	$isx = floor($position / MAX_X_POS3);
	$isy = $position - MAX_X_POS3 * $isx;
	
	$posy = $ozy * MAX_Y_POS2 * MAX_Y_POS3 + $gry * MAX_Y_POS3 + $isy;
	$posx = $ozx * MAX_X_POS2 * MAX_X_POS3 + $grx * MAX_X_POS3 + $isx;
	
	return array($posx, $posy);
}

// Entfernungsberechnung
function getDistance($srcx, $srcy, $dstx, $dsty){
	if ($srcx > $dstx) 
		$difx = $srcx - $dstx;
	else
		$difx = $dstx - $srcx;
	
	if ($srcy > $dsty) 
		$dify = $srcy - $dsty;
	else
		$dify = $dsty - $srcy;
	$res = sqrt($dify * $dify + $difx * $difx);
	
	return round($res);
}
 
Zuletzt bearbeitet:
Mal langsam:
Du stellst dir eine Kugel (in kartes. Koordinaten) vor
und willst zwischen zwei Punkten an der Oberfläche
den kürzesten Weg (der Oberfläche entlang) finden?

Oder hab ich das ganz falsch verstanden?
 
Hi sheel,

ja ich möchte gerne aus meinen Koordinaten und meine fiktiven Welt eine runde Erde machen.
und zwischen den 2 punkten den kürzesten weg finden.

Mir ist klar das mein aktuelles System nicht so 100% dafür geeignet ist, doch ich wüsste auch keine alternative, die mir eine runde Welt für die Berechnung der kürzesten Wege bevorteilt. Außer vllt. direkt mit lat und lng zu arbeiten. doch es muss ja auch anders gehen oder?

EDIT:

wenn ich mir meine Welt an gucke, treffen sich als Nachbarn: 1:1:1 mit 25:16:9 mit 5:4:3 und mit 21:12:7.
 
Zuletzt bearbeitet:
Alternative: Statt dem kartesischen x-y-z-Koordinatensystem verwendest du das sphärische.
Also vom (Kugel-)Mittelpunkt aus eine Entfernung,
einen ebenen Drehwinkel (Longitude) und einen Höhenwinkel (Latitude).

Da bei dir ja nur Koordinaten auf der Kugeloberfläche erlaubt sind (nicht innen oder in er "Luft")
kannst du die Entfernung weglassen, die wäre überall gleich.
Übrig bleiben die beiden Winkel.

Die Oberflächenentfernung kannst du dann damit ausrechnen
http://en.wikipedia.org/wiki/Great-circle_distance
Wichtig sind die paar Zeilen unter der "Formulas"-Unterüberschrift.
Also zuerst beide Winkel beider Punkte laut der langen Formel in einen Einzigen verrechnen.
Um dann die Entfernung in Kilometer oder so zu bekommen,
noch mit dem Kugelradius in km multiplizieren.
 
Zurück