我正在研究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
设置了一个沙箱答案 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];
}