Suche Formel/Funktion zum Array Sortieren

Hi, hatte heute Nacht eine Idee, aber bekomme das gerade nicht abstrahiert.

Gegeben ist eine 2dimensionale Matrix bekannter Größe (WIDTH*HEIGHT).

Diese soll “spiralförmig” umsortiert werden.

 _______<
| _____
||___  |
|______|

Also oberste Zeile einen Pixel nach links, linke Spalte einen nach unten, unterste Zeile einen nach rechts, rechte Spalte bis zur 2.Zeile einen nach oben, usw…

Was “über den Rand fällt” soll weg sein, also nur verschieben, nicht im Kreis kopieren.

Problem nachvollziehbar? Wie könnte man das allgemein in einer Formel/Schleife ausdrücken?

Gruß

Helmuth

edit: Ist es das, was ich suche? http://www.programcreek.com/2013/01/leetcode-spiral-matrix-java/

edit2: Mir ist nicht klar, was result.add(); im Beispielcode eigentlich macht. Es müsste ja darauf hinaus laufen, in der richtigen Reihenfolge jeweils einen Pixel um +/- 1 x/y zu kopieren.

Der Java Code läuft nicht über ein Array, sondern eine ArrayList. Das ist die Java Version eines Vektors

add() fügt eine Element ans Ende der Liste ein:
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#add(E)

Das könnte man in C auch mit einem Array der gleichen Größe machen

Es ist aber nicht genau du willst. Der Code gibt ein Array spiral-förmig aus.

Helmuth:
Also oberste Zeile einen Pixel nach links, linke Spalte einen nach unten, unterste Zeile einen nach rechts, rechte Spalte bis zur 2.Zeile einen nach oben, usw...

Wenn man die einzelnen Elemente mal eindeutet bezeichnet, dann also ungefähr so:

Ausgangslage:

HGFEDCBA
IZYXWVUT
J12345 S
KLMNOPQR

Erste Verschiebung:

GFEDCBA
HYXWVUTS
IZ1234 R
JKLMNOPQ

Zweite Verschiebung:

FEDCBA
GXWVUTSR
HYZ123 Q
IJKLMNOP

Dritte Verschiebung:

EDCBA
FWVUTSRQ
GXYZ12 P
HIJKLMNO

So?

Genau so. Ich habe es jetzt mal zusammengefummelt. Funktioniert, aber superumständlich, oder?! Geht auch nur innnerhalb von Quadraten ungerader Kantenlänge…

void Spiral2(int x,int y) {
 
 for(int d = 0; d < 5; d++) {  //Durchmesser

    //waagerecht unten)
    for(int i = x-d; i <= x+d; i++) {
       leds[XY(i,y-d)] = leds[XY(i+1,y-d)]; }

    //rechts
    for(int i = y-d; i <= y+d; i++) {
       leds[XY(x+d,i)] = leds[XY(x+d,i+1)]; } 

    //waagerecht oben)
    for(int i = x+d; i >= x-d; i--) {
       leds[XY(i,y+d)] = leds[XY(i-1,y+d)]; } 

     //links  
     for(int i = y+d; i >= y-d; i--) {
       leds[XY(x-d,i)] = leds[XY(x-d,i-1)]; }    
  }
}

So sieht das momentan aus, einmal "nackig" und einmal mit noch zusätzlich Weichzeichner + Seitenwind...

und nochmal ein bisschen subtiler:

Ausgangslage leicht verändert: eine quadratische Spirale (mit großen Einschränkungen) ist ganz nett zur Bildmanipulation, aber eigentlich ist eine Spirale rund.

Ich habe das hier gefunden, um eine zu beschreiben: Spiralen

Problem: Damit erwische ich niemals alle Pixel, nur die direkt auf der Spiralbahn.

Wie könnte man es anstellen, den ganzen Framebuffer auf diese Art zu manipulieren?

Gerade pausenlos neugierig: Helmuth