2011-01-23 41 views
4

我有一个Arduino,我试图找到最有效的方法来为数组中的像素设置动画。阵列由3个数组表示,分别为30个uint8_t s。 (30像素* R + G + B级别0-255)。对数组进行动画制作

将像素独立向下移动阵列的最佳方法是什么?这是一个内存有限的环境(2 KB RAM),并且该阵列占用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); 
    } 
} 

任何更好的方法的想法?

+0

我不确定我是否理解。你想要通用代码来执行特定的动画? – 2011-01-23 20:20:27

+0

没问题。因此,如果我可以说X是一个幅度为1的矢量,而不是创建一个函数来编码每个特定的动画,Z是一个幅度为-3的矢量,并且能够简化附加图案的创建 – KyleWpppd 2011-01-23 20:23:23

回答

2

这样的功能如何?

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); 
} 

当然,如果添加了新的要求,如改变倍增因子偶数,治疗的3倍数pixelAt功能将变得更加复杂,不同的等等。但是,您可以使用与此类似的函数来减少您必须编写的函数的数量。一个用于简单图案,一个用于偶数/奇数图案,一个用于三角形的倍数,等等。取决于模式的差异,以及代码的空间。

相关问题