2016-06-20 7 views
-1

Gegeben ein Raster von Breite zu Länge (etwa 5 x 4) und ein Array von X- und Y-Koordinaten für Punkte auf diesem Raster, drucken Sie den Abstand von jedem Punkt auf dem Raster zu den Koordinaten wie folgt:Schneller Algorithmus für die Entfernung zwischen 2 Punkten auf einem Gitter?

width = 5

LEN = 4

x Koord = (2,4)

y = Koordinaten (2,3)

2123 
1012 
2112 
2101 
3212 

A move "across" + 2 ist, Bewegung vertikal oder horizontal ist +1

Angenommen xCoords.length = yCoords.length

Ich werde meine Lösung veröffentlichen später, oder vielmehr der Versuch einer Lösung. Ich habe stecken versuchen, mit einer Funktion zu kommen Abstand zur Umsetzung von Gitterkoordinaten (i, j) für die Punkte auf Koordinaten ... Also im Grunde

for i .. width 
    for j .. length 
    getDistance(i,j, xCoords,yCoords) 

(0,0) (0,1) (0 , 2) (0,3)

(1,0) (1,1) (1,2) (1,3)

(2,0) (2,1) (2,2) (2,3)

etc ...

um die tatsächlichen Abstandswerte an diesen Koordinaten.

+5

Sie sind auf der Suche nach [dem Satz des Pythagoras] (https : //en.wikipedia.org/wiki/Pythagorean_theorem)? – Gendarme

+0

Nein, ich meine, ich weiß was es ist, ich bin nur nicht sicher, wie es hier reinpasst?Wie finde ich den Abstand von (i, j) zu der Koordinate bei xCoords/yCoords? Ich weiß nicht, wie ich diesen Schritt machen soll – sloven

+0

Der kürzeste Weg von der unteren linken Ecke zur oberen Ecke ist die Hypotenuse. Wenn Sie die Koordinaten für die beiden Ecken haben, können Sie die Hypotenuse und damit auch die kürzeste Strecke (Entfernung) berechnen. – Gendarme

Antwort

2

Ich gehe davon aus, dass Sie für die Entfernung zum nächstgelegenen coord unter denen in dem Vektor gegeben suchen, das heißt

for i 0 .. width 
    for j 0 .. length 
     best = distance(i, j, coords[0].x, coords[0].y) 
     for k 1 .. coordVector // Skip first element 
      best = min(best, distance(i, j, coords[k].x, coords[k].y) 
     result[i][j] = best 

Die dritte verschachtelte Schleife prüft der Abstand von dem in dem Vektor zu allen Koordinaten gegebenen Koordinate von (x i , y i), nimmt die kürzeste, und speichert ihn in der Variable best. Beachten Sie, dass best mit dem Abstand zum ersten Punkt im Vektor initialisiert wird, sodass die verschachtelte Schleife mit dem zweiten Punkt beginnt.

Alles, was Sie jetzt brauchen, ist ein Taschenrechner für distance. Nach der Problembeschreibung, suchen Sie Manhattan Distance weil ein diagonaler Schritt als 2 gewichtet wird, vertikal das gleiche wie ein Schritt ist es horizontal und einen Schritt bedeutet:

distance(x0, y0, x1, y1) 
    horizontal = abs(x1-x0) 
    vertical = abs(y0-y1) 
    return horizontal + vertical 
+0

Vielen Dank, das ist die Antwort, die ich gesucht habe! – sloven

+0

Eine Sache zu beachten, jedes Mal, wenn Sie Abstand für ein Null indexiertes Gitter aufrufen, müssen Sie + 1 für i, j tun, damit der Funktionsaufruf so aussieht: Abstand (i + 1, j + 1, coords [0]. x, coords [0] .y) – sloven

+0

@Nik Das stimmt, Koordinatenübersetzung ist definitiv ein Problem, das man bei der Konvertierung dieses Pseudocodes in ein Programm in Java angehen muss. – dasblinkenlight

0

Sie wollen Pythagoras Theorem verwenden. sqrt((i-xCords)*(i-xCords)+(j-yCords)*(j-yCords))

0
int getDistance(int x1, int y1, int x2, int y2) { 
    return Math.abs(x1 - x2) + Math.abs(y1 - y2); 
} 
+0

'Math.pow ((x1 - x2) * 2, 2)' Warum multiplizierst du mit 2? – Gendarme

+0

@Gandarme Die Frage, sagte "across" war tatsächlich Einheiten von 2. – 4castle

+0

Okay, Gotcha. – Gendarme

Verwandte Themen