2017-02-13 1 views
-2

Dans une matrice 2D je veux trouver un seul voisin directement connecté par son ID respectivement la direction.Comment trouver un voisin directement connecté dans une matrice 2D?

Ce que je veux dire:
x0 = x
y0 = y1
x1 = x + 1
y1 = y
x2 = x
y2 = y + 1
x3 = x - 1
y3 = y

ou en tant que graphique:

 ╔═══════╗ 
     ║ N ║ 
     ║ x,y-1 ║ 
     ║  ║ 
╔═══════╬═══════╬═══════╗ 
║ W ║  ║ E ║ 
║ x-1,y ║ x,y ║ x+1,y ║ 
║  ║  ║  ║ 
╚═══════╬═══════╬═══════╝ 
     ║ S ║ 
     ║ x,y+1 ║ 
     ║  ║ 
     ╚═══════╝ 

Il y a quelques années que je commencé à programmer j'ai eu le même problème et résolu avec un commutateur sordide affaire qui pourrait être fortement améliorée:

if (mode == 'Y'){ 

    switch(direction){ 
     case 1: 
      return -1; 
     case 2: 
      return 0; 
     case 3: 
      return 1; 
     case 4: 
      return 0; 
     default: 
      break; 
    } 
} 

if (mode == 'X'){ 

    switch(direction){ 
     case 1: 
      return 0; 
     case 2: 
      return 1; 
     case 3: 
      return 0; 
     case 4: 
      return -1; 
     default: 
      break; 
    } 
} 

Une cellule doit être accessible par une formule simple avec x, y et la direction (N, E, S, W par exemple 0-3)

Je ne veux pas avoir tous les voisins, comme définir l'espace qui l'entoure (x-1, y-1 à x + 1, y + 1). Ce serait gentil un simple en juste itérant jeté le carré. Je veux juste une seule cellule.

C'est un son simple, mais qui me donne mal à la tête pour trouver une solution courte, rapide et légitime. La langue préférée est C++

Je suis enthousiasmé par vos solutions!

EDIT

Je compris le problème maintenant.

Jetez un oeil à ceci: Graph

Malheureusement im encore ne peuvent pas poster des images, mais comme vous pouvez voir l'intersection du graphique avec les constantes représentant la direction est exactement ce que doivent être ajoutés à coordonnée x comme vous pouvez voir ci-dessus

cela signifie que nous pouvons utiliser une onde sinusoïdale simple pour obtenir y et de cela, les formules sont:

x1 = x + cos((2*pi*(dir-1))/4) 
y1 = y + cos((2*pi*(dir-2))/4) 

Alors que dir est de 0 à 3

C'est ma solution pour trouver un moyen mathématique pur de calculer les voisins connectés. Bien sûr, cela pourrait être approuvé d'une manière ou d'une autre?

Merci pour vos solutions! Au plaisir de voir vos solutions pour ce problème!

À la votre!

+0

Bienvenue sur SO! S'il vous plaît, expliquez le problème que vous avez dans la solution actuelle et ce que vous considérez comme une solution "appropriée". –

+0

Hors sujet: "Une cellule doit être accessible par une formule unique avec x, y et la direction (N, E, S, W par exemple 0-3)" recommande d'utiliser un enum pour remplacer le 0..3 numérique avec gentil, facile à lire les noms. – user4581301

Répondre

0

Avez-vous envisagé d'utiliser une matrice?Par exemple,

int goY[] = {-1,0,1,0};  
int goX[] = {0,1,0,-1}; 

x += goX[direction]; 
y += goY[direction]; 

ou incorporant mode

int move[2][4] = 
{ 
    {-1,0,1,0},  
    {0,1,0,-1} 
}; 

Votre code pourrait ressembler à:

loc += move[mode - 'x'][direction]; 

mais je soupçonne que vous pouvez faire disparaître entièrement mode.

0

Je pense que vous pouvez résoudre avec deux "pour boucles"

Par exemple:

for (cx = -1; cx <= 1; cx++) { 
    for (cy = -1; cy <= 1; cy++) { 
     // All neighbors (N, NE, E, SE, S, SW, W, NW) 
     if (1 == abs(cx - cy)) { 
      // directneighbors (N, E, S, W) 
     } 
    } 
}