C # Перемещение по изображению по спирали? - PullRequest
5 голосов
/ 01 июня 2009

Я хочу перемещаться по пикселям изображения, а не проходя строка за строкой, столбец за столбцом "обычным" способом. Но начните с центрального пикселя и двигайтесь по спирали. Но я не уверен, как это сделать. Любые предложения о том, как это можно сделать?

Ответы [ 3 ]

5 голосов
/ 01 июня 2009

Вы можете сделать это с помощью параметрических функций, функция для радиуса r (t) = R, а x (t) = Rcos (t) и y (t) = Rsin (t). Вы имеете в виду что-то вроде это ?

0 голосов
/ 01 июня 2009

Что-то вроде этого должно сделать это:

int x = width / 2;
int y = height / 2;
int left = width * height;
int dir = 0;
int cnt = 1;
int len = 2;
int[] move = { 1, 0, -1, 0, 1 };
while (left > 0) {
   if (x >= 0 && x < width && y >= 0 && y < height) {
      // here you do something with the pixel at x,y
      left--;
   }
   x += move[dir % 4];
   y += move[(dir % 4) + 1];
   if (--cnt == 0) {
      cnt = len++ / 2;
      dir++;
   }
}

Если изображение не квадратное, спираль будет продолжаться за пределами координат изображения, пока все изображение не будет покрыто. Условие в операторе if обеспечивает обработку только тех координат, которые являются частью изображения.

0 голосов
/ 01 июня 2009

Было бы полезно подумать об этом в обратном порядке.

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

Затем двигайтесь по второму ряду и продолжайте движение по спирали.

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

С этой конечной точки вы можете затем выполнить свои шаги назад и обработать все пиксели, как вам нужно.

Чтобы определить исходную позицию математически, вам нужно знать ширину / высоту изображения, а также, на каком пикселе вы хотите закончить и в каком направлении вы хотите двигаться, когда доберетесь до последнего пикселя.

...