Felder berechnen

Sasser

Erfahrenes Mitglied
Guten Abend!

Ich habe eine Karte gebaut, bei welcher erst einmal immer 10 Sektoren untereinander angeordnet sind. Jeder Sektor hat hat 15 * 15 Felder. Ich möchte nun die Anzahl der Kästchen berechnen von Koordinate 1 zu Koordinate 2.

Meine Koordinaten setzten sich folgendemaßen zusammen: Sektor:X:Y

Ein Bild zur Veranschaulichung ist als Anhang beigefügt!

Folgenden Code habe ich bereits zusammengeschustert, allerdings kann gibt es Probleme bei verschiedenen Sektoren, denn er durchläuft die Sektoren nur aufsteigend oder absteigend. Z.B. von Sektor 10 zu Sektor 20 errechnet er 10 Differenz, obwohl diese aber übereinander liegen und nur 1 herauskommen müsste...

PHP:
function distance($detail, $city) {
	$from = explode ( ":", $city );
	$to = explode ( ":", $detail );
	if ($from [0] == $to [0]) {
		if ($from [1] < $to [1]) {
			$fields = $fields + ($to [1] - $from [1]);
		} elseif ($from [1] > $to [1]) {
			$fields = $fields + ($from [1] - $to [1]);
		}
		if ($from [2] < $to [2]) {
			$fields = $fields + ($to [2] - $from [2]);
		} elseif ($from [2] > $to [2]) {
			$fields = $fields + ($from [2] - $to [2]);
		}
	} elseif ($from [0] > $to [0]) {
		if ($from [1] < $to [1]) {
			$fields = $fields + ($to [1] - $from [1]);
		} elseif ($from [1] > $to [1]) {
			$fields = $fields + ($from [1] - $to [1]);
		}
		$fields = $fields + (15 - $to [2]) + $from [2] + ((($from [0] - $to [0]) - 1) * 15);
	} elseif ($from [0] < $to [0]) {
		if ($from [1] < $to [1]) {
			$fields = $fields + ($to [1] - $from [1]);
		} elseif ($from [1] > $to [1]) {
			$fields = $fields + ($from [1] - $to [1]);
		}
		$fields = $fields + (15 - $from [2]) + $to [2] + ((($to [0] - $from [0]) - 1) * 15);
	}
	return show ( fieldduration ) * $fields;
}
 

Anhänge

  • bil.gif
    bil.gif
    7,7 KB · Aufrufe: 32
So, hier mal ein kleiner Versuch mit der Annahme, dass man sich nur waagerecht und senkrecht bewegen darf.

PHP:
<pre>
<?php

function get_distance($start, $destination)
{
	$return = array();
	$rows = 15;
	$cols = 15;
	
	$st = explode(':', $start);
	$de = explode(':', $destination);
	
	if($st[0] == $de[0])
	{
		$return['fields'] = calcInnerSector($st, $de);
	}
	else
	{
		if( ($de[0] - 10) >= $st[0] )
		{
			// second row
			$return['sectors'] = ( ($de[0] - 10) - $st[0]) + 1;
			$return['fields'] += $return['sectors'] * 15;
		}
		else
		{
			// same row
			$return['sectors'] = ($de[0] - $st[0]);
			$return['fields'] += $return['sectors'] * 15;
		}
		$return['fields'] += calcInnerSector($st, $de);
		
	}
	return $return;
}

function calcInnerSector($st, $de)
{
	if($st[1] == $de[1])
	{
		if($st[2] == $de[2])
		{
			return (int)0;
		}
		else
		{
			return (int)($de[2] - $st[2]);
		}
	}
	else
	{
		if($st[2] == $de[2])
		{
			return (int)($de[1] - $st[1]);
		}
		else
		{
			return (int)( ($de[1] - $st[1]) + ($de[2] - $st[2]) );
		}
	}
}

print_r(get_distance('01:01:01', '02:02:02'));

?>
</pre>

Er gibt immer die Anzahl von Sektorenwechsel an plus die Anzahl an gelaufenen Feldern insgesamt.
Falls diagonale Bewegungen auch erlaubt sind, könntest du dir ja noch selber was überlegen...
 
Ich danke dir für diese Große Mühe die du dir extra gemacht hast :)

Dein Code funktioniert schon mal wie meiner und ist schöner ;)

Allerdings funktioniert das mit den vertikalen Sektorendurchlauf noch nicht richtig... Es sieht so aus, als wenn er immernoch horizontal durchläuft...
 
PHP:
print_r(get_distance('10:01:01', '20:01:10'));

Ausgabe:
Code:
Array
(
    [sectors] => 1
    [fields] => 24
)

Kann gerade nicht nachvollziehen, was du meinst?
 
Also wenn man bisher von Sektor 1 in Sektor 11 möchte, dann ist es doch so dass man durch Sektor 2, 3, 4, 5, 6, 7, 8, 9, 10 muss oder?

Da aber Sektor 1 und 11 übereinander liegen, dürfte man ja eigentlich nur von Sektor 1 in Sektor 11 gehen!? Ebenso wenn man von Sektor 1 in 12 möchte, muss man eben von Sektor 1 nach 11 und dann nach 12. Verstehst du was ich meine?
 
PHP:
print_r(get_distance('01:01:01', '11:01:01'));
print_r(get_distance('01:01:01', '12:01:01'));

Code:
Array
(
    [sectors] => 1
    [fields] => 15
)
Array
(
    [sectors] => 2
    [fields] => 30
)

Passt doch?
 
Du hast vollkommen recht! :)

Ich arbeite bloß an dieser Funktion schon so lange, dass ich kaum noch dran geglaubt habe!?

Ich danke dir vielmals für deine tolle Hilfe ;)

Mfg. Sasser

Upsala, eins ist mir noch aufgefallen:

Wenn ich einen Sektor runter gehe, dann zeigt er mir negative Feldanzahlen an!?

Kannst du mir da nochmal kurz helfen?
 
Ja, das liegt daran, dass ich davon ausging, dass man nur von vorne nach hinten geht... Andersrum geht natürlich auch.

Nimm doch einfach den Betrag des Wertes, [phpf]abs[/phpf] ist die Funktion die du brauchst dabei...

Eventuell könnte es allerdings Probleme beim addieren geben... Schau dir die Prozeduren einfach nochmal an und überlege wo das Problem entstehen könnte.
 
Also wie du es schon befürchtet hast, kommt es bei der Funktion zu Fehlern. Er verhaut warscheinlich bereits die Berechnung...

Das Folgende ist mir auch noch aufgefallen: Wenn ich von der Koordinate: 6:12:3 zu 26:12:3 mir die Felder anzeigen lasse, dann kommen korioserweise anstatt 30 > 165 Felder heraus. Von 6:12:3 zu 16:12:3 kommt korrekt 15 heraus!?

Ich werde mal versuchen den Fehler zu finden :)
 
Diesmal machen wir das zusammen und langsam.
Weil es ist am ende ne komisch kurze aber lustige Formel.
Zunächst NUR die Sektoren:

14 zu 15 : einer seitlich
14 zu 24 : einer nach unten
13 zu 24 : seitlich und unten
24 zu 13 : links und unten

Nun Mathematisch:

Die Zehner : senkrechte Bewegung (in deinem Fall)
Die Einer : seitliche Bewegung

14 zu 15:
Zehner : 1 - 1 = 0 keine hoch oder runter
Einer : 5 - 4 = 1 seitlich

Rechne zur Übung die anderen

24 zu 13:
Es gilt immer: Größere minus Kleinere!
Zehner: 2 - 1 = 1 einer horizontal
Einer: 4 - 3 = einer seitlich

Überlege dir andere Fälle.
Wenn du willst erkläre ich dir auch wie es ist wenn man 8x8 hat oder ähnliches.

Sonst soweit klar?
 
Zurück