Wenn Sie eine Liste von Objekten haben
Wenn Sie die Objekte in einer Liste alle Positionen aller hatte, dies wäre viel einfacher sein, wie man es nicht alle leeren Felder suchen müssen und könnte 2D distance calculations durchführen, um den nächsten zu bestimmen. Schleife durch die Liste von Objekten und den Abstand wie folgt berechnen:
Define your two points. Point 1 at (x1, y1) and Point 2 at (x2, y2).
xd = x2-x1
yd = y2-y1
Distance = SquareRoot(xd*xd + yd*yd)
Dann einfach auf einen Blick mit der kürzesten Entfernung.
Wenn Sie nur ein 2D-Array haben
Wenn jedoch das Problem, wie ein 2D-Array davon ausgegangen, beschrieben, bei dem die Positionen der Objekte, ohne zunächst die Suche nach alle von ihnen können nicht Sie gehen zu müssen, dann aufgeführt werden, eine Spiralschleife machen.
Suchen nach 'Spiral Search Method' kommt mit ein paar interessanten Links. Here is some code that does a spiral loop um ein Array, jedoch funktioniert dies nicht von einem beliebigen Punkt und Spirale nach außen, aber sollte Ihnen einige gute Ideen geben, wie Sie erreichen, was Sie wollen.
Hier ist ein similar question über das Füllen von Werten in der Spiralreihenfolge in einem 2D-Array.
Wie auch immer, hier ist, wie ich das Problem angehen würde:
gegebenen Punkt P
, erstellen Sie ein Vektorpaar, das einen Bereich um P
angibt. So
wenn P = 4,4
Dann würde dein Vektor Paar seine 3,3|5,5
Schleifen jeden Wert in den Grenzen.
for x = 3 to 5
for y = 3 to 5
check(x,y)
next
next
Wenn ein Wert gefunden wird, beenden Sie. Wenn nicht, erhöhen Sie die Grenzen erneut um eins. In diesem Fall würden wir zu 2,2 gehen. 6,6
Wenn Sie die Werte überprüfen, stellen Sie sicher, dass wir keine negativen Indizes angegeben haben und dass die Größe des Arrays nicht überschritten wurde .
Auch wenn Sie die Schranken n-mal erweitern, müssen Sie nur die äußeren Randwerte schleifen, Sie müssen die inneren Werte nicht erneut prüfen.
Welche Methode ist schneller?
Es hängt alles von:
- Die Dichte Ihrer Array
- Verteilungstechnik
- Anzahl der Objekte
Dichte von Array
Wenn Sie ein 500x500 Array mit 2 Ob jekte in ihm, dann die Liste Looping wird immer eine Spirale
Verteilungstechnik
Wenn es Muster der Verteilung (dh die Objekte neigen dazu, clustern umeinander) dann eine Spirale durchführen kann schneller Outperform tun.
Anzahl der Objekte
Eine Spirale wird wahrscheinlich schneller durchführen, wenn es eine Million Objekte sind, wie die Liste Technik, die Sie alle Entfernungen, zu überprüfen und berechnen erfordert.
Sie sollten in der Lage sein, die schnellste Lösung zu berechnen, indem Sie die Wahrscheinlichkeit eines Platzes berechnen, verglichen mit der Tatsache, dass die Listenlösung jedes Objekt jedes Mal überprüfen muss.
Mit der List-Technik können Sie jedoch einige intelligente Sortierung durchführen, um die Leistung zu verbessern. Es lohnt sich, es genauer zu betrachten.
Ein unendliches Gitter? –
Nebenbei: Die Distanzmessung, die Sie beschreiben, wird allgemein als "Manhattan-Entfernung" oder mathematisch als L1-Entfernung bezeichnet. – Thomas