2009-06-01 13 views
5

Voglio spostarmi tra i pixel di un'immagine, non andando riga per riga, colonna per colonna nel modo "normale". Ma inizia dal pixel centrale e vai verso l'esterno con un movimento a spirale. Ma non sono sicuro di come farlo. Qualche suggerimento su come questo può essere fatto?C# Si muove attraverso un'immagine a spirale?

+0

Puoi essere un po 'più chiaro di come ti aspetti che si comporti su un'immagine non quadrata? ... solo le immagini quadrate funzioneranno perfettamente con una spirale, qualsiasi altra cosa colpirai una serie di spigoli prima degli altri ... – jerryjvl

risposta

5

È possibile farlo utilizzando le funzioni parametriche, la funzione per il raggio è r (t) = R, e x (t) = Rcos (t) ey (t) = Rsin (t). Vuoi dire qualcosa come this?

+0

Sembra proprio quello che voglio. Grazie mille! –

0

Sarebbe utile ripensarci al contrario.

Ad esempio, partendo dall'angolo in alto a sinistra e procedendo in senso orario, si passerebbe lungo la riga superiore, quindi lungo il lato destro, lungo il lato inferiore e lungo il margine sinistro fino al pixel sotto il punto iniziale .

Quindi spostarsi lungo la seconda fila e continuare a spirale.

A seconda delle dimensioni dell'immagine ci si ritroverà con una singola colonna di pixel o una singola riga di pixel e si muoverà su/giù o sinistra/destra.

Da questo punto di finitura è quindi possibile seguire i passaggi indietro e elaborare tutti i pixel che è necessario.

Per calcolare matematicamente la posizione di partenza, è necessario conoscere la larghezza/altezza dell'immagine e il pixel su cui si desidera terminare e la direzione in cui si desidera viaggiare quando si arriva all'ultimo pixel .

0

Qualcosa del genere dovrebbe farlo:

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

Se l'immagine non è quadrata, la spirale continuerà al di fuori delle coordinate dell'immagine fino a quando l'intera immagine è stata coperta. La condizione nell'istruzione if si assicura che solo le coordinate che fanno parte dell'immagine vengano elaborate.

Problemi correlati