Array rotieren bzw. Zeigerarithmetik?



  • Moin,

    ich habe ein Array mit Ferbwerten (RGB bzw. COLORREF bzw. DWORD) in dem ich einen Farberlauf "glockenförmig" gespeichert habe. Anfang und Ende des Arrays haben den gleichen Farbwert (damit es beim Sprung an den Anfang keinen visuell wahrnehmbaren Impuls gibt). In der Mitte des Arrays ist die zweite Farbe gespeichert. Betrachtet man die einzelnen RGB-Werte der Start- und Endfarbe ergibt sich eine sinusförmige Kurve zwischen Start- und Endwert die in der Mitte je nach Differenz des Start und Endwertes konvex oder konkav ist.

    Ich würde diese Glocke jetzt gern animieren, also in ihrer Position im Array verschieben. Array[0] soll zu Array[n] werden, und Array [1] wird Array[0].

    Wie gehe ich am besten vor? Meine Überlegung (bin bekennender C-Anfänger) ist eine Kopie des Arrays anzulegen und alle Elemente um -1 in die Kopie zu schreiben und das Element [0] ans Ende zu schreiben UND anschließend den Zeiger der das original Array referenziert auf die Kopie umzubiegen. Beim nächsten Durchlauf dann umgekehrt. Also so Verschiebung mit Swap (ein Art Doppelbuffer?).

    Ich bin mir ziemlich sicher, dass das ein gangbarer Weg wäre. Aber ich bin mir unsicher ob es nicht einen einfacheren Weg gibt.



  • Eine Kopie brauchst du nicht unbedingt. Du brauchst eigentlich nur eine temporäre Variable, die ein Array Member speichern kann. In diesen speicherst du dann den Wert von Array[n]. Anschliessend kopierst du um, von Array[0] nach Array[n], von Array[1] nach Array[0], usw. Wenn du bei Array[n-1] bist, hörst du auf, und kopierst den temporären Wert (original Array[n]) nach Array[n-1].
    Ein anderer Ansatz wäre, deine verarbeitenden Routinen auf Ringpuffer umzustellen. Dann brauchst du gar nichts mehr zu kopieren.



  • Umkopieren ist schlecht weil lahm. Ich knall dir hier einfach mal Code hin, wie ich das z.B. machen würde.

    #include <stdio.h>
    
    int get_val(size_t at){
    	const int stuff[] = {0,1,2,3,4,5,6,7,8,9}; // die "Farben"
    	size_t num_elements = sizeof(stuff)/sizeof(stuff[0]); // ermitteln wieviel Elemente das array hat
    	return stuff[ at%num_elements ]; // Zugriff auf Array mit Modulo
    }
    
    int main(void){
    	int i;
    	for(i=5; i<20; ++i){ // wir können auch einfach bei 5 anfangen
    		printf("%d\n", get_val(i));
    	}
    	return 0;
    }
    

    Einfach mal compilieren und rumspielen. Verstehst bestimmt, bist ja ein helles Köpfchen 😉

    edit: ähmm, ja. Das wäre die Ringpuffervariante 😉



  • TactX schrieb:

    Umkopieren ist schlecht weil lahm.

    Ja, das hatte ich mir gedacht, daher meine Frage!

    TactX schrieb:

    (schnipp)
    return stuff[ at%num_elements ]; // Zugriff auf Array mit Modulo
    (schnapp)
    

    Oha! That's so sexy man!

    Verstehst bestimmt, bist ja ein helles Köpfchen 😉

    Das allerdings ist Spekulation! 😉

    Einen schönen Sonntagabend noch und vielen Dank.


Anmelden zum Antworten