// Original DEM ellipsoid heights must be converted before use as ENU mesh Z. import assert from 'node:assert/strict' import { Cartesian3, Matrix4 } from 'cesium' export function terrainInLocalFrame(transform, samples, heights) { assert.equal(samples.length, heights.length, 'terrain point/height mismatch') const inverse = Matrix4.inverseTransformation(Matrix4.fromArray(transform), new Matrix4()) return samples.map((sample, index) => { assert.ok(Number.isFinite(heights[index]) && heights[index] > 1, 'invalid original DEM height') const local = Matrix4.multiplyByPoint(inverse, Cartesian3.fromDegrees(sample.lon, sample.lat, heights[index]), new Cartesian3()) return [local.x, local.y, local.z] }) } export function localSeatingLevels(transform, samples, heights) { const points = terrainInLocalFrame(transform, samples, heights) const minimum = Math.min(...points.map(p => p[2])), maximum = Math.max(...points.map(p => p[2])) return { minimum, maximum, relief: maximum - minimum, floorZ: maximum - .25, foundationBottom: minimum - 3, ellipsoidMinimum: Math.min(...heights), ellipsoidMaximum: Math.max(...heights), heightFrame: 'project-local-ENU-up' } }