如何将索引数组转换为Arduino适用的8×8十六进制3D位图?
3D立方体索引转Arduino 8×8十六进制Bitmap数组
需求
将表示3D立方体8层点位的索引数组,转换为适用于Arduino的8×8十六进制byte数组,数组中每个byte的8个bit对应立方体的8层状态。
输入数据
输入为包含8个子数组的索引列表,每个子数组对应立方体的一层(massive[0]为底层,massive[7]为顶层):
massive = [[63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55], [63, 56, 0, 7], [63, 56, 0, 7], [35, 36, 27, 56, 28, 0, 7, 63], [63, 56, 0, 7, 36, 35, 27, 28], [63, 7, 56, 0], [7, 0, 56, 63], [7, 6, 5, 4, 3, 2, 1, 0, 8, 16, 32, 24, 40, 48, 56, 57, 58, 59, 60, 61, 62, 63, 55, 39, 47, 31, 23, 15]]
期望输出格式
输出为符合Arduino语法的8×8十六进制数组,示例如下:
{ {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF}, {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81}, {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81}, {0x81, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81}, {0x81, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81}, {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81}, {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81}, {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF}, };
错误代码及问题
原代码因错误遍历索引范围导致IndexError,错误代码如下:
massive = [[63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55], [63, 56, 0, 7], [63, 56, 0, 7], [35, 36, 27, 56, 28, 0, 7, 63], [63, 56, 0, 7, 36, 35, 27, 28], [63, 7, 56, 0], [7, 0, 56, 63], [7, 6, 5, 4, 3, 2, 1, 0, 8, 16, 32, 24, 40, 48, 56, 57, 58, 59, 60, 61, 62, 63, 55, 39, 47, 31, 23, 15]] rows, cols = (8, 8) arr = [['' for i in range(cols)] for j in range(rows)] arr[0][0] = '' for row in arr: print(row) def convert(): for i in range(0, 64): for n in range(0,64): for each in massive: if i == massive[massive.index(each)][n]: arr[massive.index(each)][n] = '1' else: arr[massive.index(each)][n] = '0' convert() for row in arr: print(row)
错误输出:
['', '', '', '', '', '', '', ''] ['', '', '', '', '', '', '', ''] ['', '', '', '', '', '', '', ''] ['', '', '', '', '', '', '', ''] ['', '', '', '', '', '', '', ''] ['', '', '', '', '', '', '', ''] ['', '', '', '', '', '', '', ''] ['', '', '', '', '', '', '', ''] Traceback (most recent call last): File "main.py", line 28, in <module> convert() File "main.py", line 23, in convert if i == massive[massive.index(each)][n]: IndexError: list index out of range
正确实现代码
以下是简洁的正确转换代码,核心逻辑是将每个索引映射到8×8矩阵的位置,并通过位运算设置对应层的状态:
massive = [[63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55], [63, 56, 0, 7], [63, 56, 0, 7], [35, 36, 27, 56, 28, 0, 7, 63], [63, 56, 0, 7, 36, 35, 27, 28], [63, 7, 56, 0], [7, 0, 56, 63], [7, 6, 5, 4, 3, 2, 1, 0, 8, 16, 32, 24, 40, 48, 56, 57, 58, 59, 60, 61, 62, 63, 55, 39, 47, 31, 23, 15]] # 初始化8x8的数组,每个元素初始为0(对应8位全灭) bitmap = [[0 for _ in range(8)] for _ in range(8)] # 遍历每一层,设置对应点位的bit for layer_idx, points in enumerate(massive): for point_idx in points: # 计算点位对应的矩阵行和列:point_idx = 行号*8 + 列号 row = point_idx // 8 col = point_idx % 8 # 将对应层的bit设为1(layer_idx对应bit的位置,0为最低位,7为最高位) bitmap[row][col] |= (1 << layer_idx) # 输出符合Arduino格式的十六进制数组 print("{") for row in bitmap: hex_values = [f"0x{byte:02X}" for byte in row] print(f" {{{', '.join(hex_values)}}},") print("};")
代码说明
- 初始化矩阵:创建8×8的全0数组,每个元素代表一个byte,初始状态为所有层都灭。
- 映射点位:每个索引
point_idx对应矩阵的行 = point_idx // 8,列 = point_idx % 8。 - 位运算设置状态:用
1 << layer_idx生成对应层的bit掩码,通过|=操作将该bit设为1,表示该层的此点位点亮。 - 格式输出:将每个byte转换为两位十六进制格式,输出为Arduino支持的数组结构。
内容的提问来源于stack exchange,提问作者zаѓатhᵾѕтѓа
相关产品推荐
相关产品推荐

