2017-02-13 24 views
-2

В 2D-матрице я хочу найти единственного непосредственно связанного соседа по его идентификатору, соответственно.Как найти непосредственно связанного соседа в 2D-матрице?

Что я имею в виду:
х0 = х
у0 = у1
x1 = х + 1
у1 = у
х2 = х
у2 = у + 1
х3 = х - 1
у3 = у

или в качестве графического:

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

Несколько лет назад, когда я начал программировать я имел такую ​​же проблему и решить ее с уродливым выключателем случая, который может быть весьма улучшилось:

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; 
    } 
} 

Клетка должна быть доступной по одной формуле с х, у и направление (N, E, S, W eg 0-3)

Я не хочу иметь всех соседей, как определение пространства вокруг него (x-1, y-1 до x + 1, y + 1). Это было бы просто, просто повторив квадрат. Я просто хочу одну ячейку.

Это звук прост, но дает мне головные боли в поиске короткого, быстрого и законного решения. Предпочтительным языком является C++

Я очень рад вашим решениям!

EDIT

я понял, проблема в настоящее время.

Взгляните на это: Graph

К сожалению, им пока не разрешается размещать изображения, но, как вы можете увидеть пересечение графика с константами, представляющих направление именно то, что нужно добавить к й координатам, вы можете увидеть выше

Это означает, что мы можем использовать простую гармоническую волну для получения у и от этого формулы являются:

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

Хотя dir от 0 до 3

Это мое решение в поиске чистого математического метода расчета связанных соседей. Конечно, это может быть кое-что одобрено?

Спасибо за ваши решения! Ждем ваших решений по этой проблеме!

Cheers!

+0

Добро пожаловать на ТАК! Пожалуйста, объясните, что у вас есть в настоящем решении и что вы считаете «правильным» решением. –

+0

Отключить тему: «Клетка должна быть доступна по одной формуле с x, y и направлением (N, E, S, W, например, 0-3)», рекомендуется использовать «enum» для замены числового 0..3 на приятные, легко читаемые имена. – user4581301

ответ

0

Рассматривали ли вы использование массива?Например,

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

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

или включения mode

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

Ваш код может выглядеть следующим образом:

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

, но я подозреваю, что вы можете избавиться от mode полностью.

0

Я думаю, вы можете решить эту проблему с двух «для петель»

Для примера:

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) 
     } 
    } 
}