【问题标题】:Efficient JavaScript method to rotate a 8x8 bit matrix, represented by 8 HEX values旋转 8x8 位矩阵的高效 JavaScript 方法,由 8 个 HEX 值表示
【发布时间】:2019-01-27 17:54:12
【问题描述】:

我有一些字体表示为 8 个 HEX 值的数组,这些值又表示 8x8 LED 阵列中 LED 的状态。

每个 HEX 值等于位矩阵中的一行。

例如,[0x41, 0x7F, 0x7F, 0x49, 0x5D, 0x41, 0x63, 0x00] // 'E' 代表字符“E”,如下所示:

0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0

或者,更明显: █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █

在保持“数组中的 8 个 HEX 值”格式(作为输出)的同时顺时针/逆时针旋转数组的最佳选择(效率方面)是什么?

【问题讨论】:

  • “效率”是什么意思?你几乎不会比O(n²) 更糟(n 是矩阵的宽度/高度)
  • 嗯,也许“优雅”会更适合它。我对 JavaScript 的内置方法不太感兴趣,所以我希望有比一些嵌套 for 循环更好的选择。
  • 你当然可以使用 reduceArray.from 之类的东西,但最终它总是归结为嵌套循环——只是语法不同。
  • 这就是我所追求的,因为它会更容易通过并理解它。

标签: javascript arrays node.js matrix


【解决方案1】:

好的,我找到了解决方案

const letterE = [0x41, 0x7F, 0x7F, 0x49, 0x5D, 0x41, 0x63, 0x00];
console.log(letterE);

const convertToByteMatrix = hexArray => hexArray
  .map(r => r
    .toString(2)
    .padStart(hexArray.length, "0")
    .split("")
  );

const convertToHexArray = byteMatrix => byteMatrix
  .map(r => parseInt(r
      .join(""), 2)
    .toString(16)
  );

console.log(convertToByteMatrix(letterE));

// Adapted from https://stackoverflow.com/a/42535/2407212
const rotateClockWise = hexArray => {
  const byteMatrix = convertToByteMatrix(hexArray);
  const size = hexArray.length;
  const rotatedByteArray = Array(size).fill().map(() => Array(size).fill());

  for (let i = 0; i < size; i++) {
    for (let j = 0; j < size; j++) {
      rotatedByteArray[i][j] = byteMatrix[size - j - 1][i];
    }
  }

  console.log(rotatedByteArray);

  const rotatedHexArray = convertToHexArray(rotatedByteArray);
  return rotatedHexArray;
};

const rotatedLetterE = rotateClockWise(letterE);
console.log(rotatedLetterE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2014-01-13
    • 2011-08-31
    • 2011-04-28
    相关资源
    最近更新 更多