einfache Wegberechnung

Joe

Erfahrenes Mitglied
Hallo alle,
Ich bräuchte mal eure Hilfe zwecks einer Wegberechnung.

In Mathe bin ich leider nicht ganz so fit und stehe deswegen grad etwas auf dem Schlauch.
Angenommen ich habe eine Position X=100 und Y=100 und möchte nun die Entfernung zu Position X=150, Y=50 oder X=102 Y=110 ermitteln. Wieviel Felder müsste ich per Fluglinie gehen um dort hinzugelangen?
(Hindernisse soll es keine geben)

Wäre nett wenn ihr mir einen kleinen Denkanstoss zum Berechnen solcher Wege geben könntet. Die Entfernung ist deswegen wichtig weil ich daraus die Wegzeit herleiten möchte.

Vielen Dank fürs lesen.
 
Ok Thema hat sich erledigt :)
Der Satz des Pythagoras war die Lösung:
PHP:
		// Ausgangsposition
		$X1=$row['PosX'];
		$Y1=$row['PosY'];
		// $X und $Y sind die Zielkoordinaten
		$b = $X1-$X;
		$a = $Y1-$Y;
		if($b == 0){
			if($a == 0 OR $b == 0){
				if($a == 0){
					$entfernung = $b;
				}elseif($b == 0){
					$entfernung = $a;
				}
			}
        }elseif($b != 0){
            $entfernung = sqrt(pow($a,2) + pow($b,2));
        }
		$zeitende = $entfernung*200;
 
Grüß dich,

auch wenns schon erledigt ist:
Wenn du ein Koordinatensystem in der Ebene hast, dann bietet es sich an mit Vektoren zu rechnen.
Angenommen du willst von Punkt A(150, 50) zu Punkt B(40,30), dann ergibt sich daraus der Vektor:
AB(-110, -20).

Man rechnet demnach x-Wert des Zielpunktes minus den x-Wert des Anfangspunktes. Bei den y-Werten ist es genauso.

Um nun die Länge des Vektors zu bestimmen benötigst du seinen Betrag, der sich wie folgt ergibt:
|AB| = Wurzel( (x-Wert-AB)² + (y-Wert-AB)²);
Das entspricht dann auch der Länge, die du mit dem Satz des Pythagoras rausbekommen haben müsstest.
Soll aber nur eine Alternative sein....
 
Hallo Alex_T

Hab zwar verstanden was du sagen wolltest aber die Formel |AB| = Wurzel( (x-Wert-AB)² + (y-Wert-AB)²); leider nicht.

Könntest du das mal bitte mit konkreten Werten schreiben? Meine Schulzeit ist auch schon etwas länger her und besteht nur aus Realschulwissen :-(

Bei obiger Formel oder durch mein Timestamp bekomme ich anscheinend Probleme mit negativen Werten. Von daher kommt dein Beitrag völlig richtig :)
 
Hallöle nochmal,

also um das vllt. ein wenig näher zu erläutern mal ein kleines Beispiel:
Du hast meinet wegen die Koordinaten (4, 5) - der 1. Wert ist der x-Wert und der 2. der y-Wert.
Nun brauchst du für einen Vektor aber 2 Punkte mit den jeweiligen Koordinaten (der 1. Punkt steht eine Zeile zuvor). Der 2. Punkt sei nun beispielsweise (2, 1).

Um nun aus diesen 2 Punkten einen Vektor zu bilden, musst du dir als erstes überlegen von wo nach wo der Vektor verlaufen soll (kurz: Anfangspunkt und Endpunkt aussuchen).
Ich wähle hier beispielsweise den 1. Punkt (4, 5) als Anfangspunkt und den 2. Punkt (2, 1) als Endpunkt.

Nun muss der x-Wert des 2.Punktes minus der x-Wert des 1. Punktes gerechnet werden. Für die y-Werte das gleiche.
ALLGEMEIN: x-Wert des Endpunktes minus x-Wert des Anfangspunktes (für y-Werte identisch)

Entstandener Vektor: (2-4, 1-5) = (-2, -4)


Den Vektor kannst du dir demnach, auf dein Beispiel bezogen, wie einen Pfeil vorstellen, der von deinem Ausgangspunkt auf deinen Endpunkt zeigt (Die Länge dieses Pfeiles ist ja demnach genau das was du suchst - die Wegstrecke).

Nun ist die Länge dieses Vektors Definiert mit: Wurzel aus den Quadraten der einzelnen Vektorkomponenten.
Auf unseren obigen Vekotr bezogen

Betrag des entstandenen Vektors: Wurzel((-2)² + (-4)²) = 4.47......
Diese 4.47... müsstest du demnach auch rauskriegen, wenn du mit dem Satz des Pythagoras arbeitest.

Hoffe ich konnte das halbwegs verständlich rüber bringen.
Weiterhin hätte ich hier noch einen Link, der das Ganze recht anschaulich darstellt: Vektoren
 
  • Gefällt mir
Reaktionen: Joe
Astrein das sollte nun jeder Laie verstehen können :)
Zumal deine Funktion positive sowie negative Werte durchs quadrieren hinterher abdeckt.
Also danke dir!
 
Also die Zeitfunktionen von PHP und MySQL machen mich noch total kirre.

Folgendes Script sollte eigentlich eine Zeit erzeugen je nach Wegentfernung. Die Felder für Zeit sind in der Datenbank in Timestampformat angelegt. Timestamp hat aber als 1 Minute = 100 (Weiss der Geier wie die Einheit hier heisst). Warum eigentlich 100?

Das Problem ist also
1.ens Nicht korreckt berechnete Zeit und
2.ens Stimmt mal die Zeit oder mal wird eben NULL eingetragen und das sogar bei gleichen Werten (vermutlich wegen NOW()).

Wie bekomme ich jetzt auf ein sekundengenaues ZeitEnde in Timestampformat in die Datenbank geschrieben?
PHP:
		// Ausgangsposition	
		$X2=$row['MoveX'];
		$Y2=$row['MoveY'];
		$X = trim($_POST['X']);
		$Y = trim($_POST['Y']);
		// $X und $Y sind die Zielkoordinaten
		$b = $X2-$X;
		$a = $Y2-$Y;
		$b=abs($b);
		$a=abs($a);
		if($a == 0){
			$entfernung = $b;
		}
		if($b == 0){
			$entfernung = $a;
		}
		if(($a != 0) And ($b != 0)){
            $entfernung = sqrt(pow($a,2) + pow($b,2));
		}
		$zeitende = $entfernung*100;
		$zeitende =round($zeitende);
		if($zeitende < 100){
			$zeitende = 100;
		}
		//// Aktion in DB schreiben
		mysql_query("INSERT INTO
					Aktion
						(Username,
						Aktion,
						ZeitAnf,
						ZeitEnde,
						Wert1,
						Wert2)
					VALUES
						('$Username','Erkunden',CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(NOW()) + $zeitende,'$X','$Y')");
		if (mysql_errno()) {		
			echo mysql_errno() . ": " . mysql_error(). "\n";
		}
 
Grüße,

also TIMESTAMP gibt die vergangene Zeit seit dem Datum x zurück (frag mich bitt nicht welches :D). Diese Angabe hat die Einheit Sekunden. Mich würde allerdings noch interessieren, mit welcher Geschwindigkeit man sich in deinem Beispiel fortbewegt?
 
  • Gefällt mir
Reaktionen: Joe
Pro Feld bewegt man sich eine Minute in obrigen Bsp., votausgesetzt man bewegt sich wagerecht oder senkrecht.
Bei Diagonalen greift obrige Formel und ist daher unterschiedlich.

PHPmyAdmin hat für die Felder verschiedene Werte zb Int VarChar und eben auch Timestamp. Mein Feld ZeitEnde hat das Format Timestamp und sieht bei Null so aus: 0000-00-00 00:00:00 in Worten: yy-mo-dd hh:mi:ss .

Bei diesen Typ ist seltsamer Weisse 100=1Minute die 100 sind also keine Sekunden.
Der Unix-Timestamp hingegen ist ein Int 11 (glaube) nicht formatiert und läuft in Sekunden.

Ich nahm den Feldtyp Timestamp da man so in der Datenbank sofort erkennt wann weche Aktion war. Vergleichen klappt auch prima. Nur das rechnen spinnt.
 
Zuletzt bearbeitet:
@Alex_T
Hast recht.. es bringt einfach nix mit Timestamp als Feldtyp zu arbeiten. Hab dein Rat angenommen und den Feldtyp int(11) genommen. Mit time(); hole ich die aktuelle Zeit und rechne schlicht die Sekunden zum bewältigen des Wegs hinzu. Damit gibts dann auch keinerlei Probs bei MySQL.
Hat zwar etwas Arbeit beim anpassen der Ereigniss/Aktionsscripte gemacht aber anders scheints nicht zu gehen.

Hier noch mal das Script falls es mal einer ergoogelt :D
PHP:
<? $aktiv="erkunden"; include("inc.header.php"); include("templates/timer.tpl");  ?>
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1); 
$a = array();
$a['filename'] = 'erkunden.tpl';
$a['data'] = array();
//return $a; // nicht Vergessen, sonst enthält $ret nur den Wert int(1)

//// Datenbankabfrage zur Erkundung/Koordinaten Auswertung
$sql = "SELECT
	        Session,
			Username,
			PosX,
			PosY,
			MoveX,
			MoveY
		FROM
			User
		WHERE
			Session =('".session_id()."')";
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
$row = $result->fetch_assoc();

//// Benutzereingabe Erkunden Koordinaten auswerten
if ('POST' == $_SERVER['REQUEST_METHOD']) {
	if (!isset($_POST['X'], $_POST['Y'], $_POST['formaction'])) {
		return INVALID_FORM;
	}
	// Felder leer
	if (('' == $X = trim($_POST['X'])) OR
			('' == $Y = trim($_POST['Y']))) {
		return EMPTY_FORM;
	}
	// Falscher Bereich
	if ((200 < $X = trim($_POST['X'])) OR (1 > $X = trim($_POST['X'])) OR
			(200 < $Y = trim($_POST['Y'])) OR (1 > $Y = trim($_POST['Y']))) {
		return TOHIGH_FORM;
	}
	// Keine Bewegungsveränderung und noch nie bewegt
	if (($row['MoveX'] == 0) OR ($row['MoveY'] == 0)) {
		if (($row['PosX'] == $X = trim($_POST['X'])) AND ($row['PosY'] == $Y = trim($_POST['Y']))) {
			return NO_MOVE_FORM;
		}
	}
	// Keine Bewegungsveränderung weil schon dort
	if (($row['MoveX'] == $X = trim($_POST['X'])) AND ($row['MoveY'] == $Y = trim($_POST['Y']))) {
			return NO_MOVE_FORM;
	}
	else {
		// Ausgangsposition	
		$X2=$row['MoveX'];
		$Y2=$row['MoveY'];
		// $X und $Y sind die Zielkoordinaten
		$X = trim($_POST['X']);
		$Y = trim($_POST['Y']);

		$b = $X2-$X;
		$a = $Y2-$Y;
		// negative Zahlen in positive Wandeln falls a oder b == 0 ist.
		$b=abs($b);
		$a=abs($a);
		if($a == 0){
			$entfernung = $b;
		}
		if($b == 0){
			$entfernung = $a;
		}
		if(($a != 0) And ($b != 0)){
            $entfernung = sqrt(pow($a,2) + pow($b,2));
		}
		// $zeitende = $entfernung*60; Zeitende = Entfernung * 60 Sekunden
		$zeitende = $entfernung*60;
		$jetzt = time();
		$zeitende = $jetzt + $zeitende;

		// $zeitende soll später die Berechnungen bei abweichender Geschwindigkeit beinhalten

		//// Aktion in DB schreiben
		$link = mysql_connect("localhost", "user", "PW");
		mysql_select_db("Datenbank", $link);
		mysql_query("INSERT INTO
					Aktion
						(Username,
						Aktion,
						ZeitAnf,
						ZeitEnde,
						Wert1,
						Wert2)
					VALUES
						('$Username','Erkunden',CURRENT_TIMESTAMP, $zeitende,'$X','$Y')");
		if (mysql_errno()) {		
			echo mysql_errno() . ": " . mysql_error(). "\n";
		}
		return ERKUNDEN_FORM;
	}
}
return $a;
?>


THX Alex_T
 
Zurück