jsketcher/web/app/brep/topo/shell.js

45 lines
1 KiB
JavaScript

import {TopoObject} from './topo-object'
export class Shell extends TopoObject {
constructor() {
super();
this.faces = [];
this.defineIterable('vertices', () => verticesGenerator(this));
this.defineIterable('edges', () => edges(this))
}
reindexVertices() {
for (let e of this.edges) {
e.halfEdge1.vertexA.edges.clear();
e.halfEdge1.vertexB.edges.clear();
}
for (let e of this.edges) {
e.halfEdge1.vertexA.edges.add(e.halfEdge1);
e.halfEdge2.vertexA.edges.add(e.halfEdge2);
}
}
}
export function* verticesGenerator(shell) {
const seen = new Set();
for (let face of shell.faces) {
for (let edge of face.edges) {
if (!seen.has(edge.vertexA)) {
seen.add(edge.vertexA);
yield edge.vertexA;
}
}
}
}
export function* edges(shell) {
const visited = new Set();
for (let face of shell.faces) {
for (let halfEdge of face.edges) {
if (!visited.has(halfEdge.edge)) {
visited.add(halfEdge.edge);
yield halfEdge.edge;
}
}
}
}