Felder berechnen

Aber das habe ich doch bereits erweitert:

PHP:
function distance($detail,$city) {
	$detail = explode ( ":", $detail );
    $city = explode ( ":", $city );
    $distance = array ();
    if ($detail [0] == $city [0]) {
        $distance ['fields'] = sectordistance ( $detail, $city );
    } else {
		$distance ['sectors'] = floor ( ( abs ( $detail [0] - $city [0] ) ) / 10 ) + substr ( ( abs ( $detail [0] - $city [0] ) ) / 10, -1 );
		$distance ['fields'] = ( $distance ['sectors'] * 15 ) + sectordistance ( $detail, $city );
    }
    return show ( fieldduration ) * $distance ['fields'];
}

function sectordistance($detail,$city) {
    if ($detail [1] == $city [1]) {
        if ($detail [2] == $city [2]) {
            return 0;
        } else {
            return abs ( $detail [2] - $city [2] );
        }
    } else {
        if ($detail [2] == $city [2]) {
            return abs ( $detail [1] - $city [1] );
        } else {
            return abs ( $detail [1] - $city [1] ) + abs ( $detail [2] - $city [2] );
        }
    }
}

Ist das nun komplett falsch?

Problem ist doch nur, dass irgendwas nicht so richtig hin haut!?

Der Fehler muss hier drin stecken, aber ich finde ihn nicht:

PHP:
$distance ['sectors'] = floor ( ( abs ( $detail [0] - $city [0] ) ) / 10 ) + substr ( ( abs ( $detail [0] - $city [0] ) ) / 10, -1 );
		$distance ['fields'] = ( $distance ['sectors'] * 15 ) + sectordistance ( $detail, $city );
 
Zuletzt bearbeitet:
Steh ich auf dem Schlauch?

Zunächst mal brauchen wir einheitliche Notationen. Ganz am Anfang waren die Sektoren die "großen Felder" und in deinem Algorithmus scheinen es die "kleinen" zu seien.

Bisher konnte ich aber keinen Fehler feststellen, kommt bestimmt noch.

Hat diese Funktion irgendwelche Fehler oder Ausnahmen?
PHP:
function EntfernungsVektor($start, $end)
{
	$a = explode(":", ($start<$end)? $start: $end);
	$b = explode(":", ($start<$end)? $end: $start);
	$sector = abs($a[0] - $b[0]);
	
	/**
	 * Entfernung ausgeben
	 */
	return array(
		($sector%10) * 15 + $b[1] - $a[1],
		(int) ($sector/10) * 15 + $b[2] - $a[2]
	);
}

function Strecke($start, $end)
{
	$a = EntfernungsVektor($start, $end);
	return sqrt(
		pow(abs($a[0]), 2) +
		pow(abs($a[1]), 2)
	);
}

var_dump(EntfernungsVektor("20:01:01", "10:13:13"));
var_dump(Strecke("20:01:01", "10:13:13"));

Wenn ja dann Platzt der Schlauch auf dem ich steh :p
 
Zuletzt bearbeitet:
Super, ich danke für deine Hilfe ;)

Leider muss der Schlauch wohl oder übel platzen, denn wenn ich z.B. von 4:3:1 nach 3:3:15 gehe, dann kommt korioserweise 20.518284528683 anstatt 1 heraus!?

LG
 
Ok. Da predige ich von dem Wechseln der Variablen (Achsenwechsel) und zeige ihn nicht xD

Zudem kam noch was hinzu, da deine Koordinaten scheinbar nicht immer in der Form 00:00:00 übergeben werden. Das hat sie um 8 Zeilen länger gemacht aber frisst jetzt jede Eingabe:
PHP:
function EntfernungsVektor($start, $end)
{
	// Eingabe aufschlüsseln
	$a = explode(":", $start);
	$b = explode(":", $end);
	
	// Sortieren
	if ($a[0]>$b[0])
	{
		$tmp = $a;
		$a = $b;
		$b = $tmp;
	}
	
	// Sektorentfernung
	$sector = (string) abs($a[0] - $b[0]);
	
	// Achsenwechsel wenn auf gleicher Achse
	if ($sector[0] == 0 || $sector[1] == 0)
	{
		$tmp = $b[1];
		$b[1] = $b[2];
		$b[2] = $tmp;
		
		$tmp = $a[1];
		$a[1] = $a[2];
		$a[2] = $tmp;
	}
	
	// Entfernung ausgeben
	return array(
		$sector[0] * 15 + $b[1] - $a[1],
		$sector[1] * 15 + $b[2] - $a[2]
	);
}

Wie du siehst ist am Ende die Formel zum berechnen der Entfernung, vorbereitet durch die Sektorenentfernung (mittig). Der Trick ist nur die Achsen zu wechseln, wenn die horizontale Entfernung oder die senkrechte Entfernung genau 0 ist.
 
Ja super, das war das Problem ;)

Sag mal läuft der jetzt auch schräg von Feld zu Feld?

Also wenn ich von 4:3:1 zu 4:4:2 gehe, war es am Anfang so, dass man 2 Felder durchlaufen muss und jetzt nur noch 1? Weil ich bekomme dabei 1.4142135623731 ausgegeben, anstatt 1 bzw. 2!?
 
Zuletzt bearbeitet:
Ja super, das war das Problem ;)

Sag mal läuft der jetzt auch schräg von Feld zu Feld?

Also wenn ich von 4:3:1 zu 4:4:2 gehe, war es am Anfang so, dass man 2 Felder durchlaufen muss und jetzt nur noch 1? Weil ich bekomme dabei 1.4142135623731 ausgegeben, anstatt 1 bzw. 2!?

EDIT: Warum ist dein letzter Beitrag plötzlich verschwunden?

Keine Ahnung. Konnt den auch kurz nicht editieren o,O

Der läuft auch schräg. Da ist die Entfernung Wurzel(2) genau richtig.
Nur den Vektor durch den Pythagoras gejagt ;)
 
Ok ich werde jetzt die Sachen mal richtig detailgetreu durchtesten und mich dann nochmal melden, falls ein Fehler zu finden ist ;)

Ich danke dir vielmals für die tolle Hilfe und die Zeit die du investiert hast, obwohl du das gar nicht müsstest :-)
 
So, ich habe nochmal die Funktion genau geprüft und dabei ich mir noch etwas aufgefallen:

Wenn ich z.B. von Sektor 6 in 16 folgendermaßen gehe: 6:12:3 zu 16:1:3 kommt anstatt 4 Felder, 18.601075237738 heraus!? Aber ich habe doch recht, dass man da nur 4 Felder nach unten muss!?
 
Das wird alles zu viel.
Also für ein ordentliches kartesisches rechtwinkliges Koordinatensystem im ersten Quadranten mit gegebener Teilung in Sektoren und deren Felder funktioniert die Funktion Strecke ohne Fehler (für EntfernungsVektor ebenfalls ohne Beachtung der Reihenfolge der Achsen für die Vektorausgabe fehlerfrei):
PHP:
function EntfernungsVektor($start, $end)
{
	$a = explode(":", $start);
	$b = explode(":", $end);
    
    $a[0] = str_pad($a[0], 2, "0", STR_PAD_LEFT);
    $b[0] = str_pad($b[0], 2, "0", STR_PAD_LEFT);
    
    if ($a[0] < $b[0])
    {
    	$tmp = $a;
    	$a = $b;
    	$b = $tmp;
    }
    
    $sector[0] = $a[0][0] - $b[0][0];
    $sector[1] = $a[0][1] - $b[0][1];
    
    //var_dump($sector);
    
    return array(
        abs($sector[1]*15 - $b[1] + $a[1]),
        abs($sector[0]*15 - $b[2] + $a[2])
    );
}

var_dump(EntfernungsVektor("11:15:15", "2:1:1"));
var_dump(EntfernungsVektor("14:1:1", "3:15:15"));
var_dump(EntfernungsVektor("4:1:1", "3:1:15"));
var_dump(EntfernungsVektor("4:3:1", "4:4:2"));
var_dump(EntfernungsVektor("6:12:3", "16:1:3"));
Code:
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(29)
}
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(1)
}
array(2) {
  [0]=>
  int(15)
  [1]=>
  int(14)
}
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(1)
}
array(2) {
  [0]=>
  int(11)
  [1]=>
  int(15)
}

Zwei Möglichkeiten: Entweder umstellen auf die genannte Form oder negieren aller Ausdrücke, so dass die y-Achse genau umgekehrt interpretiert wird.
Thats it.
 
Also ich muss dir eher sagen, dass ich bei deiner Variante irgendwie überhaupt nicht durchblicke...

Da fand ich die vorherige Variante etwas einfacher zu verstehen :p
 
Zurück