improve loop invalidation

This commit is contained in:
Val Erastov 2017-12-26 22:33:30 -07:00
parent 58c7e73a27
commit c2cae6b40f

View file

@ -114,24 +114,17 @@ export function BooleanAlgorithm( shellA, shellB, type ) {
faceData.detectedLoops = detectLoops(faceData.face.surface, faceData);
}
let detectedLoops = new Set();
for (let faceData of facesData) {
for (let loop of faceData.detectedLoops) {
loop.link();
detectedLoops.add(loop);
}
}
let [invalidLoops, invalidEdges] = invalidateLoops(detectedLoops);
if (invalidEdges.size !== 0) {
throw new CadError('BOOLEAN_INVALID_RESULT', {code: 'MALFORMED_EDGES', payload: Array.from(invalidEdges)});
}
removeInvalidLoops(facesData);
let faces = [];
for (let faceData of facesData) {
// faceData.detectedLoops = faceData.detectedLoops.filter(l => !invalidLoops.has(l));
loopsToFaces(faceData.face, faceData.detectedLoops, faces);
}
@ -152,6 +145,20 @@ export function BooleanAlgorithm( shellA, shellB, type ) {
return result;
}
function removeInvalidLoops(facesData) {
let detectedLoopsSet = new Set();
for (let faceData of facesData) {
for (let loop of faceData.detectedLoops) {
detectedLoopsSet.add(loop);
}
}
for (let faceData of facesData) {
faceData.detectedLoops = faceData.detectedLoops.filter(
loop => loop.halfEdges.find(e => !detectedLoopsSet.has(e.twin().loop)) === undefined);
}
}
function replaceMergedFaces(facesData, mergedFaces) {
filterInPlace(facesData, ({face}) =>
mergedFaces.find(({originFaces}) => originFaces.indexOf(face) > -1) === undefined
@ -617,22 +624,6 @@ function traverseFaces(face, callback) {
}
}
function invalidateLoops(resultLoops) {
// __DEBUG__.Clear();
const invalidLoops = new Set();
const invalidEdges = new Set();
for (let loop of resultLoops) {
// __DEBUG__.AddLoop(loop);
for (let e of loop.halfEdges) {
if (!resultLoops.has(e.twin().loop)) {
invalidLoops.add(loop);
invalidEdges.add(e);
}
}
}
return [invalidLoops, invalidEdges];
}
export function loopsToFaces(originFace, loops, out) {
const newFaces = evolveFace(originFace, loops);
for (let newFace of newFaces) {