{"version":3,"file":"CSGSubtract.worker.cjs","sources":["../src/Nest/Common/Util.ts","../src/csg/core/constants.ts","../src/csg/core/FuzzyFactory.ts","../src/Geometry/CSGSubtract/CSGSubtract.ts","../src/Geometry/CSGSubtract/CSGSubtract.worker.ts"],"sourcesContent":["export function equaln(v1: number, v2: number, fuzz = 1e-5)\r\n{\r\n return Math.abs(v1 - v2) <= fuzz;\r\n}\r\n\r\nexport function FixIndex(index: number, arr: Array | number)\r\n{\r\n let count = (arr instanceof Array) ? arr.length : arr;\r\n if (index < 0)\r\n return count + index;\r\n else if (index >= count)\r\n return index - count;\r\n else\r\n return index;\r\n}\r\n\r\n/**\r\n * @param compart true => t2 , false => t1\r\n * @returns 索引\r\n */\r\nexport function Max(arr: T[], compart: (t1: T, t2: T) => boolean): number\r\n{\r\n let best: T = arr[0];\r\n let bestIndex = 0;\r\n for (let i = 1; i < arr.length; i++)\r\n {\r\n let t1 = arr[i];\r\n if (compart(best, t1))\r\n {\r\n best = t1;\r\n bestIndex = i;\r\n }\r\n }\r\n return bestIndex;\r\n}\r\n","export const _CSGDEBUG = false;\r\n\r\n/** Epsilon used during determination of near zero distances.\r\n * @default\r\n */\r\nexport const EPS = 5e-2;\r\n\r\n// Tag factory: we can request a unique tag through CSG.getTag()\r\nexport let staticTag = 1;\r\nexport const getTag = () => staticTag++;\r\n","\r\n// //////////////////////////////\r\n// ## class fuzzyFactory\r\n// This class acts as a factory for objects. We can search for an object with approximately\r\n// the desired properties (say a rectangle with width 2 and height 1)\r\n// The lookupOrCreate() method looks for an existing object (for example it may find an existing rectangle\r\n// with width 2.0001 and height 0.999. If no object is found, the user supplied callback is\r\n// called, which should generate a new object. The new object is inserted into the database\r\n// so it can be found by future lookupOrCreate() calls.\r\n// Constructor:\r\n// numdimensions: the number of parameters for each object\r\n// for example for a 2D rectangle this would be 2\r\n\r\nimport { EPS } from \"./constants\";\r\n\r\n// tolerance: The maximum difference for each parameter allowed to be considered a match\r\nexport class FuzzyFactory\r\n{\r\n lookuptable: {};\r\n multiplier: number;\r\n constructor(numdimensions: number = 3, tolerance: number = EPS)\r\n {\r\n this.lookuptable = {};\r\n this.multiplier = 1.0 / tolerance;\r\n }\r\n\r\n // let obj = f.lookupOrCreate([el1, el2, el3], function(elements) {/* create the new object */});\r\n // Performs a fuzzy lookup of the object with the specified elements.\r\n // If found, returns the existing object\r\n // If not found, calls the supplied callback function which should create a new object with\r\n // the specified properties. This object is inserted in the lookup database.\r\n lookupOrCreate(els: number[], object: T): T\r\n {\r\n let hash = \"\";\r\n let multiplier = this.multiplier;\r\n for (let el of els)\r\n {\r\n let valueQuantized = Math.round(el * multiplier);\r\n hash += valueQuantized + \"/\";\r\n }\r\n if (hash in this.lookuptable) return this.lookuptable[hash];\r\n else\r\n {\r\n let hashparts = els.map(el =>\r\n {\r\n let q0 = Math.floor(el * multiplier);\r\n let q1 = q0 + 1;\r\n return [\"\" + q0 + \"/\", \"\" + q1 + \"/\"];\r\n });\r\n let numelements = els.length;\r\n let numhashes = 1 << numelements;\r\n for (let hashmask = 0; hashmask < numhashes; ++hashmask)\r\n {\r\n let hashmaskShifted = hashmask;\r\n hash = \"\";\r\n hashparts.forEach(hashpart =>\r\n {\r\n hash += hashpart[hashmaskShifted & 1];\r\n hashmaskShifted >>= 1;\r\n });\r\n this.lookuptable[hash] = object;\r\n }\r\n return object;\r\n }\r\n }\r\n}\r\n","import { measureArea } from '@jscad/modeling/src/geometries/poly3';\r\nimport { subtract, union } from '@jscad/modeling/src/operations/booleans';\r\nimport { Max } from '../../Nest/Common/Util';\r\nimport { FuzzyFactory } from '../../csg/core/FuzzyFactory';\r\n\r\n//并集path2dCsgs 差集 删除小面积结果\r\nexport function CSGSubtract(geom: geom3.Geom3[], path2dCsgs: geom3.Geom3[])\r\n{\r\n let gemUnion = path2dCsgs[0];\r\n for (let i = 1; i < path2dCsgs.length; i++)\r\n gemUnion = union(gemUnion, path2dCsgs[i]);\r\n let newGeom = subtract(geom, gemUnion);\r\n\r\n //删除小面积(只留一个)\r\n {\r\n let fuzz = new FuzzyFactory;\r\n let vmap = new Map;\r\n for (let poly of newGeom.polygons)\r\n {\r\n for (let v of poly.vertices)\r\n {\r\n let key = fuzz.lookupOrCreate(v, v);\r\n let arr = vmap.get(key);\r\n if (!arr)\r\n {\r\n arr = [];\r\n vmap.set(key, arr);\r\n }\r\n arr.push(poly);\r\n\r\n v[\"__key__\"] = key;\r\n }\r\n }\r\n\r\n let polys = newGeom.polygons.concat();\r\n let polyGroups = [];\r\n\r\n let calcs = new Set;\r\n while (polys.length)\r\n {\r\n let poly1 = polys.pop();\r\n calcs.add(poly1);\r\n let polyGroup = [poly1];\r\n polyGroups.push(polyGroup);\r\n\r\n for (let i = 0; i < polyGroup.length; i++)\r\n {\r\n let poly = polyGroup[i];\r\n\r\n for (let v of poly.vertices)\r\n {\r\n let key = v[\"__key__\"];\r\n let arr = vmap.get(key);\r\n\r\n for (let vpoly of arr)\r\n {\r\n if (calcs.has(vpoly)) continue;\r\n\r\n calcs.add(vpoly);\r\n\r\n polyGroup.push(vpoly);\r\n }\r\n }\r\n }\r\n // arrayRemoveIf(polys, poly => !calcs.has(poly)); //加上这个无法提高性能\r\n }\r\n\r\n let areas = polyGroups.map(polys =>\r\n {\r\n let area = 0;\r\n for (let poly of polys)\r\n area += measureArea(poly);\r\n return area;\r\n });\r\n\r\n let maxIndex = Max(areas, (t1, t2) => t2 > t1);\r\n\r\n newGeom.polygons = polyGroups[maxIndex];\r\n }\r\n\r\n return newGeom;\r\n}\r\n","import { CSGSubtract } from './CSGSubtract';\r\n\r\nconst ctx: Worker = self as any;\r\n\r\nctx.addEventListener(\"message\", e =>\r\n{\r\n const [path2dCsgs, geom]: geom3.Geom3[][] = e.data;\r\n try\r\n {\r\n const newGeom = CSGSubtract(geom, path2dCsgs);\r\n postMessage({\r\n status: 0,\r\n geom: newGeom\r\n });\r\n }\r\n catch (error)\r\n {\r\n postMessage({\r\n status: 1,\r\n error\r\n });\r\n }\r\n});\r\n\r\nexport default {} as typeof Worker & (new () => Worker);\r\n"],"names":["union","subtract","measureArea"],"mappings":"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"}