将2D行col位置(笛卡尔坐标)转换为1D数组索引

时间:2015-10-10 23:02:06

标签: c++ arrays matrix arduino

所以我使用带有Arduino(8位AVR)的FastLED库,我将LED排列成常规的2D网格(蛇形图案)。为了生成位图文本和图像,我需要一种方法将2D笛卡尔坐标转换为物理LED(阵列索引)地址(第一个LED为0,第二个LED为1 ......)。我创建了一个函数display_addr_get,它可以实现我想要的功能,但因为我经常使用它,我想知道它是否是最佳的,即我可以使它更快/更简单吗?我知道目前没有错误检查以查看行/列索引是否在一个字节的范围内,所以如果有使用饱和数学的解决方案(如qadd8()将总和限制为255)这将是理想的。

我的SRAM几乎已满,所以我无法在那里实现查找表(用于将2D坐标映射到数组地址),而且我不确定存储查找表会有多大的速度牺牲在PROGMEM中并不断从那里读取数据。

下面的代码演示了我想通过从左上角到右下角为每个合法的行和col值打印数组索引值来实现的目标。

#include <stdio.h>

#define MATRIX_WIDTH 10
#define MATRIX_HEIGHT 8

typedef unsigned char uint8_t;

uint8_t display_addr_get(uint8_t row, uint8_t col);
uint8_t display_addr_get2(uint8_t row, uint8_t col);


int main()
{
    printf("Starting Test:\n");

    uint8_t col = 0;
    uint8_t row = 0;
    for (row = MATRIX_HEIGHT; row > 0; row--) {
        for (col = 1; col <= MATRIX_WIDTH; col++) {
            printf("|Index: %-3d|", display_addr_get(row, col));
        }
        printf("\n");
    }

    return 0;
}

// My custom function
uint8_t display_addr_get(uint8_t row, uint8_t col) {
  uint8_t AddrLED = 0; // var size limits the strip length to 256 LEDs

  if (row & 1) { // y (row) index is odd
    AddrLED = -col + MATRIX_WIDTH * (MATRIX_HEIGHT - row + 1);
  }
  else { // y (row) index is even
    AddrLED = col - 1 + MATRIX_WIDTH * (MATRIX_HEIGHT - row);
  }
  return AddrLED;
}

// Snippet from the FastLED lib (uses a different origin reference point)
uint8_t display_addr_get2(uint8_t y, uint8_t x) {
    uint8_t i = 0;
    if( y & 0x01) {
      // Odd rows run backwards
      uint8_t reverseX = (MATRIX_WIDTH - 1) - x;
      i = (y * MATRIX_WIDTH) + reverseX;
    } else {
      // Even rows run forwards
      i = (y * MATRIX_WIDTH) + x;
    }
    return i;
}

程序输出(注意蛇形图案意味着索引在奇数行上反转,这是由于LED的物理连接所以无法更改):

Starting Test:                                                                                                                                         

|Index: 0  ||Index: 1  ||Index: 2  ||Index: 3  ||Index: 4  ||Index: 5  ||Index: 6  ||Index: 7  ||Index: 8  ||Index: 9  |                               

|Index: 19 ||Index: 18 ||Index: 17 ||Index: 16 ||Index: 15 ||Index: 14 ||Index: 13 ||Index: 12 ||Index: 11 ||Index: 10 |                               

|Index: 20 ||Index: 21 ||Index: 22 ||Index: 23 ||Index: 24 ||Index: 25 ||Index: 26 ||Index: 27 ||Index: 28 ||Index: 29 |                               

|Index: 39 ||Index: 38 ||Index: 37 ||Index: 36 ||Index: 35 ||Index: 34 ||Index: 33 ||Index: 32 ||Index: 31 ||Index: 30 |                               

|Index: 40 ||Index: 41 ||Index: 42 ||Index: 43 ||Index: 44 ||Index: 45 ||Index: 46 ||Index: 47 ||Index: 48 ||Index: 49 |                               

|Index: 59 ||Index: 58 ||Index: 57 ||Index: 56 ||Index: 55 ||Index: 54 ||Index: 53 ||Index: 52 ||Index: 51 ||Index: 50 |                               

|Index: 60 ||Index: 61 ||Index: 62 ||Index: 63 ||Index: 64 ||Index: 65 ||Index: 66 ||Index: 67 ||Index: 68 ||Index: 69 |                               

|Index: 79 ||Index: 78 ||Index: 77 ||Index: 76 ||Index: 75 ||Index: 74 ||Index: 73 ||Index: 72 ||Index: 71 ||Index: 70 |  

0 个答案:

没有答案