Анимация в массив - PullRequest
       20

Анимация в массив

4 голосов
/ 23 января 2011

У меня есть Arduino, и я пытаюсь найти наиболее эффективный способ анимации пикселей в массиве. Массив представлен 3 массивами по 30 uint8_t с. (30 пикселей * уровни R + G + B 0-255).

Каков наилучший способ независимого перемещения пикселей вниз по массиву? Это ограниченная память (2 КБ ОЗУ), и массив занимает 720 байтов. Первоначально я пытался использовать массив для каждого пикселя, и не хватило памяти. Вторая реализация использовала операторы if, и она хорошо работает, но создавать новые шаблоны очень утомительно. Я ищу способ решить проблему, который может быть лучше, чем то, как я сейчас ее решаю.

Вот пример шаблона, который я хотел бы анимировать.

X moves forward 1 each cycle.
Y moves forward 3 places then back 2.
Z moves backwards 3 places each cycle.

|_|X|_|_|_|_|_|_|_|_|_|_|_|_|Y|_|_|_|_|_|_|_|_|_|_|_|_|_|_|Z|
|_|_|X|_|_|_|_|_|_|_|_|_|_|_|_|_|_|Y|_|_|_|_|_|_|_|_|Z|_|_|_|
|_|_|_|X|_|_|_|_|_|_|_|_|_|_|_|Y|_|_|_|_|_|_|_|Z|_|_|_|_|_|_|

А вот код, который я бы использовал.

void animateScene1() {
    for(int i = 0; i <= numPixels; i++) {
        setColor(i, X);
        if(i < 15) {
            if(i % 2 == 0)
                setColor((i+15)+3), Y);
            else
                setColor((i+15)-2), Y);
        }
        if(i < 10)
            setColor(numPixels-3*i, Z);
    }
}

Есть идеи, как лучше?

1 Ответ

2 голосов
/ 24 января 2011

Как насчет такой функции?

int pixelAt(int index, int min, int max, int a, int b, int b_2)
{
    int pixel = -1;

    if (min <= index && index <= max)
    {
        pixel = a * index + b;
        if (i % 2)
        {
            pixel += b_2;
        }
    }

    return pixel;
}

Тогда у вас будет:

for (int i = 0; i < numPixels; i++)
{
    // This assumes setColor(-1, x) does nothing
    setColor(pixelAt(i, 0, numPixels, 1, 0, 0), X);
    setColor(pixelAt(i, 0, 15, 1, 18, -5), Y);
    setColor(pixelAt(i, 0, 10, -3, numPixels, 0), Z);
}

Конечно, функция pixelAt станет намного сложнее, если вы добавите новые требования, такие как изменение коэффициента умножения для четных чисел, обработка коэффициентов, кратных 3, и т. Д. Однако вы можете использовать функции, подобные этой чтобы уменьшить количество функций, которые вы должны написать. Один для простых шаблонов, один для четных / нечетных шаблонов, один для кратных троек и так далее. Зависит от того, насколько различны шаблоны и сколько памяти у вас есть для кода.

...