UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

76 lines (72 loc) 2.19 kB
import {Number2} from '../../../../../types/GlobalTypes'; import {setToArray} from '../../../../SetUtils'; import {TetGeometry} from '../TetGeometry'; export function buildTetIds(tetGeometry: TetGeometry, newOrderByPoint: Map<number, number>) { const tetIds: number[] = new Array<number>(tetGeometry.tetsCount() * 4); let pointIndex = 0; tetGeometry.tetrahedrons.forEach((tet) => { for (let i = 0; i < 4; i++) { const id = tet.pointIds[i]; const index = newOrderByPoint.get(id); if (index == null) { throw 'id not found'; } tetIds[pointIndex] = index; pointIndex++; } }); return tetIds; } const EDGE_INDICES: Number2[] = [ [0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3], ]; const _startIdsSet: Set<number> = new Set(); const _startIds: number[] = []; const _endIds: number[] = []; export function buildTetEdgeIds(tetGeometry: TetGeometry, newOrderByPoint: Map<number, number>) { const edgeEndsByStart: Map<number, Set<number>> = new Map(); let edgesCount = 0; _startIdsSet.clear(); tetGeometry.tetrahedrons.forEach((tet) => { for (const edgeIndices of EDGE_INDICES) { const id0 = tet.pointIds[edgeIndices[0]]; const id1 = tet.pointIds[edgeIndices[1]]; const index0 = newOrderByPoint.get(id0); const index1 = newOrderByPoint.get(id1); if (index0 == null || index1 == null) { throw 'id not found'; } const minIndex = Math.min(index0, index1); const maxIndex = Math.max(index0, index1); let edgeEnds = edgeEndsByStart.get(minIndex); if (!edgeEnds) { edgeEnds = new Set(); edgeEndsByStart.set(minIndex, edgeEnds); _startIdsSet.add(minIndex); } if (!edgeEnds.has(maxIndex)) { edgeEnds.add(maxIndex); edgesCount++; } } }); setToArray(_startIdsSet, _startIds); const startIdsSorted = _startIds.sort((a, b) => a - b); const edgeIds: number[] = new Array<number>(edgesCount * 2); let i = 0; for (const startId of startIdsSorted) { const endIds = edgeEndsByStart.get(startId)!; const endIdsSorted = setToArray(endIds, _endIds).sort((a, b) => a - b); for (const endId of endIdsSorted) { edgeIds[i] = startId; edgeIds[i + 1] = endId; i += 2; } } return edgeIds; }