重新索引由另一个数组索引的数组,并且从两个数组中都删除了元素

时间:2019-06-30 21:23:58

标签: javascript 3d webgl

我正在研究3d网格优化器,并到达了编码器的区域。这是我应该在一个小时内解决的问题,但是整日都无法解决。

// Set the output output: { // Path for the file path: path.resolve(__dirname, 'dist'), // Name for the output file filename: "app.js", // publicPath:"/" }, 正在保存位于index中的三角形顶点的坐标。如果它表示-1,-1,-1,则表示此三角形已被删除,并将在新索引中删除。顶点可以在三角形之间共享,但是如果attribute中不再引用它们,则应将其从新属性数组中删除,并在新索引中更新其地址。

index

谁知道也许我今晚会发布答案,但是如果问题仍然存在,我就会失败。

结果如下所示

// -1 are removed elements
const index = [
  -1, -1, -1,
  5, 2, 0,
  2, 0, 4,
  2, 5, 0,
  -1, -1, -1,
];

const attribute = [
  1234, 1341, 1432, // vertex 0

  2123, 2531, 2121, // vertex 1

  3532, 3123, 3441, // vertex 2

  4112, 4311, 4122, // vertex 3

  5112, 5311, 5122, // vertex 4

  6112, 6311, 6122, // vertex 5
];

编辑:我只是使用单元测试https://codesandbox.io/s/reindex-array-by-array-m4llg

设置了一个沙箱

1 个答案:

答案 0 :(得分:0)

好吧,使用TDD,我设法获得了正确的输出。效率不是很高,但我怀疑这是许多人会尝试解决的问题。

    function reindex(index, attribute) {
      const uniqueVertices = [];
      const mapNewToOld = [];
      const mapOldToNew = [];
      // find unique indices
      for (let i = 0; i < index.length / 3; i++) {
        const offset = i * 3;
        if (index[offset] === -1) continue;
        for (let j = 0; j < 3; j++) {
          if (!uniqueVertices.includes(index[offset + j])) {
            mapNewToOld[uniqueVertices.length] = index[offset + j];
            // mapOldToNew[index[offset + j]] = uniqueVertices.length;
            uniqueVertices.push(index[offset + j]);
          }
        }
      }
      mapNewToOld.sort();

      const newIndex = [];
      let newIndexCount = 0;
      for (let i = 0; i < index.length / 3; i++) {
        const offset = i * 3;

        if (index[offset] === -1) continue;
        newIndex[newIndexCount * 3] = mapNewToOld.indexOf(index[offset]);
        newIndex[newIndexCount * 3 + 1] = mapNewToOld.indexOf(index[offset + 1]);
        newIndex[newIndexCount * 3 + 2] = mapNewToOld.indexOf(index[offset + 2]);
        newIndexCount++;
      }

      const newAttribute = [];
      for (let i = 0; i < uniqueVertices.length; i++) {
        const offset = i * 3;

        const address = mapNewToOld[i] * 3;
        newAttribute[offset] = attribute[address];
        newAttribute[offset + 1] = attribute[address + 1];
        newAttribute[offset + 2] = attribute[address + 2];
      }

      return [newIndex, newAttribute];
    }