Auf ein Array Spriralförmig zugreifen

Hallo,

ich habe ein 16x16 Array, ich will darauf Spiralförmig von außen nach innen im Uhrzeigersinn Zugreifen. Wie würdet ihr da vorgehen?

Beispielarray: (nicht von mir, hab ich im Netz gefunden)

unsigned char  Scene[16][16] = {
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
}

;

staivoup:
ich habe ein 16x16 Array, ich will darauf Spiralförmig von außen nach innen im Uhrzeigersinn Zugreifen. Wie würdet ihr da vorgehen?

Eventuell so:

byte  Scene[16][16] = {
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
    {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};

void out(byte b, char* str)
{
  Serial.print(b);
  Serial.print(str);
}

void printSpiralForm(byte arr[][16], int length)
{
  for( int i = 0 , j = length-1 ; i < j ; i++ , j-- )
  {
    for( int k = i ; k < j ; k++ ) out(arr[i][k], " ");
    for( int k = i ; k < j ; k++ ) out(arr[k][j], " ");
    for( int k = j ; k > i ; k-- ) out(arr[j][k], " ");
    for( int k = j ; k > i ; k-- ) out(arr[k][i], " " );
  }
  if ( length % 2 == 1 ) Serial.println(arr[length/2][length/2]);
}

void setup()
{
  Serial.begin(9600);
  /*
  for (int i=0;i<16;i++)
  for (int j=0;j<16;j++)
    Scene[i][j]=16*i+j;
  */  
  printSpiralForm(Scene,16);
}

void loop()
{}

Muß es unbedingt spiralförmig sein? Kannst du es nicht linear auslesen und die gelesenen daten als spiralförmig annehmen? Wie schreibst Du die Daten rein? Grüße Uwe

Was hast Du konkret vor? Hat das was mit LEDs oder Pixeln auf einem GLCD zu tun?

Hallo

jurs, dass ist sehr klasse. Ich muß mir das am Wochenende mal anschauen und Verstehen. Das mit den zwei Zählern in einer For-Loop ist mir komplett neu.

Es handelt sich tatsächlich um eine LED-Matrix aus Zick-Zack verdrahteten APA-102 LEDs. Die Matrix steuere ich mit einer XY-Koordinatenfunktion an um z.B. Bilder darzustellen. Nun will ich ein Bild Spiralförmig aufbauen. Am Wochenende habe ich tatsächlich die Lösung von Uwefed schon genutzt und mir ein "Zugriffsarray" gebaut mit [256][2] den XY-Koordinaten. Das ist eine meiner Meinung nach eine sehr brauchbare und nach einiger Zeit Nichtbeachtung immer noch verständliche Lösung.

Ich habe dann Nachgedacht wie ich das in einer Funktion mache ohne Hilfkonstrukte wie "Zugriffsarray". Ich habe dann einige for-Loops hintereinander geschaltet oder ganz wild und unverständlich verschachtelt mit if-Anweisungen und sowas. Das funktioniert zum Teil auch, ist jedoch nicht schön und macht den Code daher nicht verständlicher. Mir ist keine "knuffige" Funktion eingefallen. Daher die Frage nach Beispielen. Die von jurs sieht knackig aus.

Gruß