2009-06-01 22 views
5

Quiero moverme a través de los píxeles de una imagen, no yendo línea por línea, columna por columna en la forma "normal". Pero comience en el píxel central y salga hacia afuera en un movimiento en espiral. Pero no estoy seguro de cómo hacer esto. ¿Alguna sugerencia sobre cómo se puede hacer esto?C# ¿Moviéndose a través de una imagen en un movimiento en espiral?

+0

¿Puede ser un poco más claro cómo espera que se comporte en una imagen no cuadrada? ... solo las imágenes cuadradas funcionarán perfectamente con una espiral, cualquier otra cosa se golpeará un conjunto de bordes antes que los demás ... – jerryjvl

Respuesta

5

Puede hacerlo utilizando funciones paramétricas, la función para radio es r (t) = R, y x (t) = Rcos (t) e y (t) = Rsin (t). ¿Te refieres a algo así como this?

+0

Eso se ve como lo que quiero. ¡Muchas gracias! –

0

Sería útil pensar en esto al revés.

Por ejemplo, comenzando por la esquina superior izquierda y moviéndose en sentido horario, se movería a lo largo de la fila superior, luego por el lado derecho, por la parte inferior y por el borde izquierdo hasta el píxel por debajo del punto inicial .

Luego, avance a lo largo de la segunda fila y continúe en espiral.

Según las dimensiones de la imagen, terminará con una sola columna de píxeles o una sola fila de píxeles y se moverá hacia arriba/abajo o hacia la izquierda/derecha.

Desde este punto de finalización puede seguir sus pasos hacia atrás y procesar todos los píxeles que necesite.

Para calcular matemáticamente la posición inicial, necesitaría saber el ancho/alto de la imagen y el píxel al que desea terminar y la dirección en la que desea viajar cuando llegue al último píxel .

0

Algo así debe hacerlo:

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

Si la imagen no es cuadrada, la espiral continuará fuera de las coordenadas de la imagen hasta que toda la imagen ha sido cubierta. La condición en la declaración if asegura que solo se procesen las coordenadas que son parte de la imagen.

Cuestiones relacionadas