Матричная линейная индексация - PullRequest
1 голос
/ 19 августа 2011

Мне нужно пройти прямоугольную сетку непрерывным образом .Вот пример того, что я хочу, число означает последовательность:

   + x
   y 0  1  2
     5  4  3
     6  7  8

На каждом шаге я знаю индекс в матрице.Есть ли способ рассчитать координаты?Обратное отображение для [x + y * width] не помогает, потому что оно создает «шаги» или «скачки».Есть ли какое-нибудь решение?

Вот объяснение "шагов", упомянутых выше:

  + x
   y 0  1  2
     3  4  5 //at this moment the X coordinate changes by 3, thus create step
     6  7  8

Ответы [ 2 ]

1 голос
/ 19 августа 2011
y = index / width
if( y % 2 == 0 )
   x = index % width
else
   x = width - index % width - 1

Я думаю, что должен это сделать.Это единственная модификация стандартного способа вычисления с «шагами», как вы их называете.Вы только меняете способ расчета на основе строки.

1 голос
/ 19 августа 2011

так что вам нужно сначала увеличить компонент "х", а затем уменьшить вправо - так, чтобы вы получили своего рода змеиное поведение? Вам понадобится оператор if (или какая-то по модулю - магия). Позвольте мне попробовать магию:

y := floor(i/columnCount)
x = (y mod 2)*(i - y*columCount) + ((y+1) mod 2)*((columnCount -1) - (i - y*columnCount))
...