Nachbarn in einer Matrix finden

Wolfsbein

Erfahrenes Mitglied
Hallo

folgendes Problem: In einer 2x2 Matrix sollen die Nachbarkoordinaten zu einem Punkt gefunden werden. Das Problem dabei ist ja, dass es neun verschiedene Fälle gibt. Kennt jemand einen eleganten Algorithmus um das zu lösen? Danke.
 
So hier mal mein Java Code. Es ist nicht die ganze Klasse, aber zum Verständnis sollte es reichen.
Code:
/**
 * Returns a List of all neighbours. The List contains 1x2 arrays
 * with coordinates.
 * 
 * @param i height
 * @param j width
 * @return coordinate list
 */
public List<int[]> detectNeighbours(int i, int j) {
    
    List<int[]> list = new ArrayList<int[]>();
    
    /*
     * All possible neighbours
     *      123
     *      4X6
     *      789
     */
    
    // 1
    if (isInMatrix(i - 1, j - 1))
        
        list.add(new int[] {i - 1, j - 1});
    
    // 2
    if (isInMatrix(i - 1, j)) 
        
        list.add(new int[] {i - 1, j});
    
    // 3
    if (isInMatrix(i - 1, j + 1)) 
        
        list.add(new int[] {i - 1, j + 1});
    
    // 4
    if (isInMatrix(i, j - 1)) 
        
        list.add(new int[] {i, j - 1});
    
    // 6
    if (isInMatrix(i, j + 1)) 
        
        list.add(new int[] {i, j + 1});
    
    // 7
    if (isInMatrix(i + 1, j - 1)) 
        
        list.add(new int[] {i + 1, j - 1});
    
    // 8
    if (isInMatrix(i + 1, j))
        
        list.add(new int[] {i + 1, j});
    
    // 9
    if (isInMatrix(i + 1, j + 1))
        
        list.add(new int[] {i + 1, j + 1});
    
    return list;
}

/**
 * Are the coordinates within our matrix?
 * @param x
 * @param y
 * @return point is in matrix
 */
private boolean isInMatrix(int x, int y) {
    
    return !(x < 0 || x >= height || y < 0 || y >= width);
}
 
Um sich etwas Arbeit zu ersparen, schlage ich vor, zwei verschachtelte for-Schleifen zu benutzen:
Code:
for (x=i-1; x<=i+1; x++) {
    for (y=j-1; y<=j+1; y++) {
        if (isInMatrix(x, y))
            list.add(new int[] {x, y});
    }
}
 
Da fehlt dann noch die Überpüfung ob (i,j) (x,y) entspricht, sollen ja nur die Nachbarpunkte sein, hier einfach eine Zeile Code unterschlagen, das geht ja nicht :)
 
MHertwig hat gesagt.:
Da fehlt dann noch die Überpüfung ob (i,j) (x,y) entspricht, sollen ja nur die Nachbarpunkte sein, hier einfach eine Zeile Code unterschlagen, das geht ja nicht :)
Genau :D. Ich habe keine Schleife geschrieben, weil ich es etwas übersichtlicher finde und ich mir acht Vergleiche sparen kann. Ist vielleicht nicht so elegant :(.
 
Das mit der Schleife ist aber die kürzeste und beste Möglichkeit (zumindest habe ich auch keine bessere gefunden) nur halt noch die Abfrage ob durch den Wert selbst iteriert wird :)
 

Neue Beiträge

Zurück