mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2025-04-18 01:06:27 +02:00
46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
import { Z_OFFSET } from '../constants.js';
|
|
|
|
export default function calculateLayersIntersections(lines, settings) {
|
|
const {
|
|
dimensions: { z: dimensionsZ },
|
|
layerHeight
|
|
} = settings;
|
|
|
|
const numLayers = Math.floor((dimensionsZ - Z_OFFSET) / layerHeight);
|
|
|
|
const layerPoints = Array.from(Array(numLayers)).map(() => ({}));
|
|
const layerFaceIndexes = Array.from(Array(numLayers)).map(() => []);
|
|
|
|
for (let lineIndex = 0; lineIndex < lines.length; lineIndex ++) {
|
|
const { line, faces } = lines[lineIndex];
|
|
|
|
const min = Math.ceil((Math.min(line.start.y, line.end.y) - Z_OFFSET) / layerHeight);
|
|
const max = Math.floor((Math.max(line.start.y, line.end.y) - Z_OFFSET) / layerHeight);
|
|
|
|
for (let layerIndex = min; layerIndex <= max; layerIndex ++) {
|
|
if (layerIndex >= 0 && layerIndex < numLayers) {
|
|
const y = layerIndex * layerHeight + Z_OFFSET;
|
|
|
|
let x, z;
|
|
if (line.start.y === line.end.y) {
|
|
x = line.start.x;
|
|
z = line.start.z;
|
|
} else {
|
|
const alpha = (y - line.start.y) / (line.end.y - line.start.y);
|
|
const alpha1 = 1 - alpha;
|
|
x = line.end.x * alpha + line.start.x * alpha1;
|
|
z = line.end.z * alpha + line.start.z * alpha1;
|
|
}
|
|
|
|
layerPoints[layerIndex][lineIndex] = { x: z, y: x };
|
|
for (const faceIndex of faces) {
|
|
const layerFaceIndex = layerFaceIndexes[layerIndex];
|
|
if (!layerFaceIndex.includes(faceIndex)) layerFaceIndex.push(faceIndex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return { layerPoints, layerFaceIndexes };
|
|
}
|