>

3d 메시 옵티 마이저에서 작업 중이며 코더 블록에 도달했습니다. 한 시간 안에 해결할 수 있지만 하루 종일 붙어 있습니다.

index   attribute 에 위치한 삼각형 정점 좌표를 잡고 있습니다. . -1, -1, -1이라고 표시되면이 삼각형이 제거되었으며 새 인덱스에서 제거된다는 의미입니다. 정점은 삼각형간에 공유 될 수 있지만 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
];

아무도 오늘 밤에이 질문에 대한 답변을 게시 할 것입니다. 그러나 질문이 여전히 여기에 있다면 실패했습니다.

결과는 다음과 같습니다.

// -1 are removed elements
const newIndex = [
  // removed
  3, 1, 0,
  1, 0, 2,
  1, 3, 0,
  // removed
];
const newAttribute = [
  1234, 1341, 1432, // still 0
  // removed
  3532, 3123, 3441, // 2 became 1
  // removed
  5112, 5311, 5122, // 4 became 2
  6112, 6311, 6122, // 5 became 3
];

편집 : 방금 단위 테스트로 샌드 박스를 설정했습니다 https : // codesandbox.io/s/reindex-array-by-array-m4llg

  • 답변 # 1

    좋아요, 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];
        }
    
    
    

  • 이전 bash 문자열을 배열로, 배열을 문자열로
  • 다음 ios - 제시된 뷰의 제목을 설정