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?
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.
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:
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)]; }
}
}
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?