![]() |
Abstandsberechung in einem offenen Netz
Hi,
nehmen wir an ich habe ein 2D-Netz in folgender Form, 8 * 8 Knoten:
Code:
Die Knoten sind horizontal und vertikal miteinander verbunden.
o o o o o o o o
o o o o o o o o o o o o o o o o o x o o o o y o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o Dieses Netz soll offen sein, d.h. die Knoten links außen sind mit den Knoten rechts außen verbunden, ebenso die Knoten oben mit den Knoten unten. In einem offenen Netz wäre der Abstand von X und Y -> 5 In einem geschlossenen Netz wäre er 3. Wenn ich das Netz nun als 2D-Array programmiere und den Abstand via Pythagoras berechne, dann ist das in einem geschlossenen Netz ja ziemlich einfach. Aber wie mache ich das in einem offenen Netz? Ich komme einfach nicht drauf. Danke, lg Flips |
Re: Abstandsberechung in einem offenen Netz
Hmmm ...
ich würd es wohl so machen, dass ich das manuell prüfe. Ich bezweifele dass es da eine Möglichkeit gibt die wesentlich schneller ist ...
Delphi-Quellcode:
So in etwa :stupid:
function Distance(A, B: TPoint) : Single;
var dx, dy: Cardinal; const Meshsize = 8; begin dx = Abs(A.X - B.X); dy = Abs(A.Y - B.Y); dx = ifthen(dx > (Meshsize / 2), Meshsize - dx, dx); dy = ifthen(dy > (Meshsize / 2), Meshsize - dy, dy); Result := Phythagoras(dx, dy); end; |
Re: Abstandsberechung in einem offenen Netz
Delphi-Quellcode:
x und y = mit 0 bassiertem Index (also 0..7)
inner := ABS(X - Y) + 1;
outer := (8 - Y + X) mod 8 - 1; abstand := Min(inner, outer) ds wäre jetzt der Abstand in einer Richtung (hoff ich mal) und wenn du so jeweils den Abstand in X- und Y-Richtung so ausrechnest und dieser verrechnest, dann sollte sich der absolute Abstand bestimmen lassen |
Re: Abstandsberechung in einem offenen Netz
Wie wäre es mit Horizonterweiterung?
Code:
. . . . . . . .|. . . . . . . .|. . . . . . . .
. . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . Y .|. . . . . . Y .|. . . . . . y . . . . . . . . .|. . . . . . . .|. . . . . . . . ---------------+-------+-------+--------------- . . . . . . . .|o o o o|o o o o|. . . . . . . . . . . . . . . .|o o o o|o o o o|. . . . . . . . . . . . . . . .|o o o o|o o o o|. . . . . . . . . . . . . . . .|o X o o|o o o o|. . . . . . . . . . . . . . . .|o o o o|o o o o|. . . . . . . . . . . . . . . .|o o o o|o o o o|. . . . . . . . . . . . . . Y .|o o o o|o o Y o|. . . . . . y . . . . . . . . .|o o o o|o o o o|. . . . . . . . ---------------+-------+-------+--------------- . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . . .|. . . . . . . .|. . . . . . . . . . . . . . y .|. . . . . . y .|. . . . . . y . . . . . . . . .|. . . . . . . .|. . . . . . . .
Code:
Zur Betrachtung benötigst du nur die Quadranten, die der Lage von X im Quadrant E am nächsten sind.
+-------+-------+-------+
| | | | | A | B | C | | | | | +-------+---+---+-------+ | | 1 | 2 | | | D +---E---+ F | | | 3 | 4 | | +-------+---+---+-------+ | | | | | G | H | I | | | | | +-------+-------+-------+ X in 1 => A,B,D,E X in 2 => B,C,E,F usw. Berechne nun alle möglichen Strecken zwischen XY und nimm das Minimum. cu Oliver |
Re: Abstandsberechung in einem offenen Netz
Wie wärs mit rekursiven Backtracking, bis die kürzeste Strecke gefunden ist. :mrgreen:
|
Re: Abstandsberechung in einem offenen Netz
@Sir Rufo: im Prinzip wird sowas bei meiner Rechnung schon teilweise gemacht (nach rects um einen Quadranten erweitert.)
Code:
ansonsten ist ja Länge des Quadranten = innerL + outerL
0123456789
X Y (Y - X) = innerL (6 - 2) = 4 [3-4-5-6 > 4] 10 - (Y - X) = outerL 10 - (6 - 2) = 6 [7-8-9-0-1-2 > 6] [add] @Cyf: 'ne manuell vorberechnte Tabelle, mit allen lösungen wäre das schnellste ... muß man sich dann nur noch schnell die richtige Lösung raussuchen (über 'nen 2-dimensionales Array recht leicht) |
Re: Abstandsberechung in einem offenen Netz
@Cyf: Das nennst du dann Bogotrace und deiner Signatur gerecht :mrgreen:
|
Re: Abstandsberechung in einem offenen Netz
Zitat:
Code:
Wie gross ist hier der "Abstand" von x nach y?
o o o o o o o o
o o o o o o o o o o o x o o o o o o o o o o y o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o Ein Kästchen nach Süden und drei nach Osten macht 4. Die Reihenfolge der Züge ist egal, es sind immer mindestens 4 Züge notwendig. Oder wenn eine diagonale Bewegung erlaubt ist: Diagonal nach Süd-Ost plus zwei nach Osten macht 3. |
Re: Abstandsberechung in einem offenen Netz
Hey wow, hab das Thema kurz außer acht gelassen und schon soviele Vorschläge^^ Danke euch :-D
Hab jetzt die Variante von jfheins genommen, geht wunderbar :-) Und nochwas zu sx2008 Beitrag: Ähm doch doch, die Entfernung soll nicht in Einheiten bezüglich des Netzes berechnet werden, sondern als wäre das Netz in ein Koordinatensystem eingebettet. Sodass zwischen zwei Punkten horizontal und vertikal der dimensionslose Abstand "1" ist, und somit diagonal der Abstand Wurzel 2. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz