@jscad/modeling 2.6.0 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/jscad-modeling.min.js +97 -94
  3. package/package.json +2 -2
  4. package/src/colors/colorize.js +35 -1
  5. package/src/colors/colorize.test.js +19 -4
  6. package/src/colors/hslToRgb.js +1 -1
  7. package/src/colors/hueToColorComponent.js +1 -0
  8. package/src/curves/bezier/create.js +3 -8
  9. package/src/curves/bezier/tangentAt.js +2 -2
  10. package/src/curves/index.js +1 -1
  11. package/src/geometries/geom2/clone.js +2 -12
  12. package/src/geometries/geom2/toOutlines.js +6 -11
  13. package/src/geometries/geom2/transform.js +0 -2
  14. package/src/geometries/geom3/clone.js +2 -14
  15. package/src/geometries/geom3/clone.test.js +0 -2
  16. package/src/geometries/geom3/create.js +1 -3
  17. package/src/geometries/geom3/create.test.js +0 -2
  18. package/src/geometries/geom3/fromCompactBinary.js +4 -6
  19. package/src/geometries/geom3/fromToCompactBinary.test.js +0 -6
  20. package/src/geometries/geom3/invert.js +2 -2
  21. package/src/geometries/geom3/invert.test.js +0 -2
  22. package/src/geometries/geom3/toCompactBinary.js +8 -10
  23. package/src/geometries/geom3/toPoints.js +1 -0
  24. package/src/geometries/geom3/transform.js +0 -2
  25. package/src/geometries/geom3/transform.test.js +0 -1
  26. package/src/geometries/geom3/type.d.ts +0 -1
  27. package/src/geometries/path2/clone.js +2 -13
  28. package/src/geometries/path2/transform.js +0 -2
  29. package/src/geometries/poly3/isConvex.js +1 -1
  30. package/src/geometries/poly3/measureArea.js +12 -13
  31. package/src/geometries/poly3/measureArea.test.js +15 -0
  32. package/src/geometries/poly3/plane.js +1 -2
  33. package/src/maths/line3/create.js +2 -1
  34. package/src/maths/mat4/fromRotation.js +1 -1
  35. package/src/maths/mat4/isIdentity.test.js +0 -2
  36. package/src/maths/mat4/isOnlyTransformScale.js +5 -4
  37. package/src/maths/mat4/rotate.js +1 -1
  38. package/src/maths/plane/fromPoints.js +32 -10
  39. package/src/maths/plane/fromPoints.test.js +4 -0
  40. package/src/maths/vec2/length.test.js +10 -0
  41. package/src/maths/vec3/angle.js +2 -2
  42. package/src/maths/vec3/angle.test.js +17 -0
  43. package/src/maths/vec3/length.test.js +10 -0
  44. package/src/measurements/measureBoundingBox.js +37 -121
  45. package/src/measurements/measureBoundingBox.test.js +8 -0
  46. package/src/measurements/measureCenterOfMass.js +0 -1
  47. package/src/measurements/measureEpsilon.js +3 -9
  48. package/src/operations/booleans/reTesselateCoplanarPolygons.js +1 -1
  49. package/src/operations/booleans/retessellate.js +1 -3
  50. package/src/operations/booleans/trees/PolygonTreeNode.js +0 -1
  51. package/src/operations/expansions/expand.js +2 -0
  52. package/src/operations/expansions/expand.test.js +1 -1
  53. package/src/operations/expansions/offset.js +1 -0
  54. package/src/operations/extrusions/extrudeLinear.js +1 -1
  55. package/src/operations/extrusions/extrudeRectangular.js +2 -1
  56. package/src/operations/extrusions/extrudeRotate.test.js +18 -10
  57. package/src/operations/hulls/quickhull/QuickHull.js +2 -2
  58. package/src/operations/modifiers/edges.js +1 -3
  59. package/src/operations/modifiers/generalize.js +3 -7
  60. package/src/operations/modifiers/snapPolygons.js +2 -2
  61. package/src/operations/modifiers/snapPolygons.test.js +13 -5
  62. package/src/operations/transforms/mirror.js +1 -1
  63. package/src/primitives/ellipse.js +1 -1
  64. package/src/primitives/geodesicSphere.js +2 -2
  65. package/src/primitives/index.d.ts +1 -0
  66. package/src/primitives/index.js +2 -1
  67. package/src/primitives/roundedCylinder.js +1 -1
  68. package/src/primitives/triangle.d.ts +10 -0
  69. package/src/primitives/triangle.js +164 -0
  70. package/src/primitives/triangle.test.js +95 -0
  71. package/src/utils/insertSorted.js +1 -0
  72. package/test/helpers/comparePolygons.js +1 -3
  73. package/test/helpers/nearlyEqual.js +2 -6
@@ -2,9 +2,9 @@
2
2
  const cssColors=require("./cssColors"),colorNameToRgb=o=>cssColors[o.toLowerCase()];module.exports=colorNameToRgb;
3
3
 
4
4
  },{"./cssColors":3}],2:[function(require,module,exports){
5
- const flatten=require("../utils/flatten"),colorize=(r,...o)=>{if(!Array.isArray(r))throw new Error("color must be an array");if(r.length<3)throw new Error("color must contain R, G and B values");if(3===r.length&&(r=[r[0],r[1],r[2],1]),0===(o=flatten(o)).length)throw new Error("wrong number of arguments");const t=o.map(o=>(o.color=r,o));return 1===t.length?t[0]:t};module.exports=colorize;
5
+ const flatten=require("../utils/flatten"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),poly3=require("../geometries/poly3"),colorGeom2=(o,r)=>{const e=geom2.clone(r);return e.color=o,e},colorGeom3=(o,r)=>{const e=geom3.clone(r);return e.color=o,e},colorPath2=(o,r)=>{const e=path2.clone(r);return e.color=o,e},colorPoly3=(o,r)=>{const e=poly3.clone(r);return e.color=o,e},colorize=(o,...r)=>{if(!Array.isArray(o))throw new Error("color must be an array");if(o.length<3)throw new Error("color must contain R, G and B values");if(3===o.length&&(o=[o[0],o[1],o[2],1]),0===(r=flatten(r)).length)throw new Error("wrong number of arguments");const e=r.map(r=>geom2.isA(r)?colorGeom2(o,r):geom3.isA(r)?colorGeom3(o,r):path2.isA(r)?colorPath2(o,r):poly3.isA(r)?colorPoly3(o,r):(r.color=o,r));return 1===e.length?e[0]:e};module.exports=colorize;
6
6
 
7
- },{"../utils/flatten":378}],3:[function(require,module,exports){
7
+ },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../utils/flatten":379}],3:[function(require,module,exports){
8
8
  const cssColors={black:[0,0,0],silver:[192/255,192/255,192/255],gray:[128/255,128/255,128/255],white:[1,1,1],maroon:[128/255,0,0],red:[1,0,0],purple:[128/255,0,128/255],fuchsia:[1,0,1],green:[0,128/255,0],lime:[0,1,0],olive:[128/255,128/255,0],yellow:[1,1,0],navy:[0,0,128/255],blue:[0,0,1],teal:[0,128/255,128/255],aqua:[0,1,1],aliceblue:[240/255,248/255,1],antiquewhite:[250/255,235/255,215/255],aquamarine:[127/255,1,212/255],azure:[240/255,1,1],beige:[245/255,245/255,220/255],bisque:[1,228/255,196/255],blanchedalmond:[1,235/255,205/255],blueviolet:[138/255,43/255,226/255],brown:[165/255,42/255,42/255],burlywood:[222/255,184/255,135/255],cadetblue:[95/255,158/255,160/255],chartreuse:[127/255,1,0],chocolate:[210/255,105/255,30/255],coral:[1,127/255,80/255],cornflowerblue:[100/255,149/255,237/255],cornsilk:[1,248/255,220/255],crimson:[220/255,20/255,60/255],cyan:[0,1,1],darkblue:[0,0,139/255],darkcyan:[0,139/255,139/255],darkgoldenrod:[184/255,134/255,11/255],darkgray:[169/255,169/255,169/255],darkgreen:[0,100/255,0],darkgrey:[169/255,169/255,169/255],darkkhaki:[189/255,183/255,107/255],darkmagenta:[139/255,0,139/255],darkolivegreen:[85/255,107/255,47/255],darkorange:[1,140/255,0],darkorchid:[.6,50/255,.8],darkred:[139/255,0,0],darksalmon:[233/255,150/255,122/255],darkseagreen:[143/255,188/255,143/255],darkslateblue:[72/255,61/255,139/255],darkslategray:[47/255,79/255,79/255],darkslategrey:[47/255,79/255,79/255],darkturquoise:[0,206/255,209/255],darkviolet:[148/255,0,211/255],deeppink:[1,20/255,147/255],deepskyblue:[0,191/255,1],dimgray:[105/255,105/255,105/255],dimgrey:[105/255,105/255,105/255],dodgerblue:[30/255,144/255,1],firebrick:[178/255,34/255,34/255],floralwhite:[1,250/255,240/255],forestgreen:[34/255,139/255,34/255],gainsboro:[220/255,220/255,220/255],ghostwhite:[248/255,248/255,1],gold:[1,215/255,0],goldenrod:[218/255,165/255,32/255],greenyellow:[173/255,1,47/255],grey:[128/255,128/255,128/255],honeydew:[240/255,1,240/255],hotpink:[1,105/255,180/255],indianred:[205/255,92/255,92/255],indigo:[75/255,0,130/255],ivory:[1,1,240/255],khaki:[240/255,230/255,140/255],lavender:[230/255,230/255,250/255],lavenderblush:[1,240/255,245/255],lawngreen:[124/255,252/255,0],lemonchiffon:[1,250/255,205/255],lightblue:[173/255,216/255,230/255],lightcoral:[240/255,128/255,128/255],lightcyan:[224/255,1,1],lightgoldenrodyellow:[250/255,250/255,210/255],lightgray:[211/255,211/255,211/255],lightgreen:[144/255,238/255,144/255],lightgrey:[211/255,211/255,211/255],lightpink:[1,182/255,193/255],lightsalmon:[1,160/255,122/255],lightseagreen:[32/255,178/255,170/255],lightskyblue:[135/255,206/255,250/255],lightslategray:[119/255,136/255,.6],lightslategrey:[119/255,136/255,.6],lightsteelblue:[176/255,196/255,222/255],lightyellow:[1,1,224/255],limegreen:[50/255,205/255,50/255],linen:[250/255,240/255,230/255],magenta:[1,0,1],mediumaquamarine:[.4,205/255,170/255],mediumblue:[0,0,205/255],mediumorchid:[186/255,85/255,211/255],mediumpurple:[147/255,112/255,219/255],mediumseagreen:[60/255,179/255,113/255],mediumslateblue:[123/255,104/255,238/255],mediumspringgreen:[0,250/255,154/255],mediumturquoise:[72/255,209/255,.8],mediumvioletred:[199/255,21/255,133/255],midnightblue:[25/255,25/255,112/255],mintcream:[245/255,1,250/255],mistyrose:[1,228/255,225/255],moccasin:[1,228/255,181/255],navajowhite:[1,222/255,173/255],oldlace:[253/255,245/255,230/255],olivedrab:[107/255,142/255,35/255],orange:[1,165/255,0],orangered:[1,69/255,0],orchid:[218/255,112/255,214/255],palegoldenrod:[238/255,232/255,170/255],palegreen:[152/255,251/255,152/255],paleturquoise:[175/255,238/255,238/255],palevioletred:[219/255,112/255,147/255],papayawhip:[1,239/255,213/255],peachpuff:[1,218/255,185/255],peru:[205/255,133/255,63/255],pink:[1,192/255,203/255],plum:[221/255,160/255,221/255],powderblue:[176/255,224/255,230/255],rosybrown:[188/255,143/255,143/255],royalblue:[65/255,105/255,225/255],saddlebrown:[139/255,69/255,19/255],salmon:[250/255,128/255,114/255],sandybrown:[244/255,164/255,96/255],seagreen:[46/255,139/255,87/255],seashell:[1,245/255,238/255],sienna:[160/255,82/255,45/255],skyblue:[135/255,206/255,235/255],slateblue:[106/255,90/255,205/255],slategray:[112/255,128/255,144/255],slategrey:[112/255,128/255,144/255],snow:[1,250/255,250/255],springgreen:[0,1,127/255],steelblue:[70/255,130/255,180/255],tan:[210/255,180/255,140/255],thistle:[216/255,191/255,216/255],tomato:[1,99/255,71/255],turquoise:[64/255,224/255,208/255],violet:[238/255,130/255,238/255],wheat:[245/255,222/255,179/255],whitesmoke:[245/255,245/255,245/255],yellowgreen:[154/255,205/255,50/255]};module.exports=cssColors;
9
9
 
10
10
  },{}],4:[function(require,module,exports){
@@ -13,10 +13,10 @@ const hexToRgb=t=>{if((t=t.replace("#","")).length<6)throw new Error("the given
13
13
  },{}],5:[function(require,module,exports){
14
14
  const flatten=require("../utils/flatten"),hueToColorComponent=require("./hueToColorComponent"),hslToRgb=(...o)=>{if((o=flatten(o)).length<3)throw new Error("values must contain H, S and L values");const e=o[0],n=o[1],t=o[2];let r=t,l=t,u=t;if(0!==n){const o=t<.5?t*(1+n):t+n-t*n,h=2*t-o;r=hueToColorComponent(h,o,e+1/3),l=hueToColorComponent(h,o,e),u=hueToColorComponent(h,o,e-1/3)}if(o.length>3){return[r,l,u,o[3]]}return[r,l,u]};module.exports=hslToRgb;
15
15
 
16
- },{"../utils/flatten":378,"./hueToColorComponent":7}],6:[function(require,module,exports){
16
+ },{"../utils/flatten":379,"./hueToColorComponent":7}],6:[function(require,module,exports){
17
17
  const flatten=require("../utils/flatten"),hsvToRgb=(...e)=>{if((e=flatten(e)).length<3)throw new Error("values must contain H, S and V values");const t=e[0],a=e[1],r=e[2];let s=0,n=0,o=0;const c=Math.floor(6*t),l=6*t-c,u=r*(1-a),b=r*(1-l*a),h=r*(1-(1-l)*a);switch(c%6){case 0:s=r,n=h,o=u;break;case 1:s=b,n=r,o=u;break;case 2:s=u,n=r,o=h;break;case 3:s=u,n=b,o=r;break;case 4:s=h,n=u,o=r;break;case 5:s=r,n=u,o=b}if(e.length>3){return[s,n,o,e[3]]}return[s,n,o]};module.exports=hsvToRgb;
18
18
 
19
- },{"../utils/flatten":378}],7:[function(require,module,exports){
19
+ },{"../utils/flatten":379}],7:[function(require,module,exports){
20
20
  const hueToColorComponent=(o,e,n)=>(n<0&&(n+=1),n>1&&(n-=1),n<1/6?o+6*(e-o)*n:n<.5?e:n<2/3?o+(e-o)*(2/3-n)*6:o);module.exports=hueToColorComponent;
21
21
 
22
22
  },{}],8:[function(require,module,exports){
@@ -25,13 +25,13 @@ module.exports={colorize:require("./colorize"),colorNameToRgb:require("./colorNa
25
25
  },{"./colorNameToRgb":1,"./colorize":2,"./cssColors":3,"./hexToRgb":4,"./hslToRgb":5,"./hsvToRgb":6,"./hueToColorComponent":7,"./rgbToHex":9,"./rgbToHsl":10,"./rgbToHsv":11}],9:[function(require,module,exports){
26
26
  const flatten=require("../utils/flatten"),rgbToHex=(...t)=>{if((t=flatten(t)).length<3)throw new Error("values must contain R, G and B values");const e=255*t[0],r=255*t[1],n=255*t[2];let o=`#${Number(16777216+65536*e+256*r+n).toString(16).substring(1,7)}`;return t.length>3&&(o+=Number(255*t[3]).toString(16)),o};module.exports=rgbToHex;
27
27
 
28
- },{"../utils/flatten":378}],10:[function(require,module,exports){
28
+ },{"../utils/flatten":379}],10:[function(require,module,exports){
29
29
  const flatten=require("../utils/flatten"),rgbToHsl=(...t)=>{if((t=flatten(t)).length<3)throw new Error("values must contain R, G and B values");const e=t[0],n=t[1],s=t[2],a=Math.max(e,n,s),r=Math.min(e,n,s);let l,o;const c=(a+r)/2;if(a===r)l=o=0;else{const t=a-r;switch(o=c>.5?t/(2-a-r):t/(a+r),a){case e:l=(n-s)/t+(n<s?6:0);break;case n:l=(s-e)/t+2;break;case s:l=(e-n)/t+4}l/=6}if(t.length>3){return[l,o,c,t[3]]}return[l,o,c]};module.exports=rgbToHsl;
30
30
 
31
- },{"../utils/flatten":378}],11:[function(require,module,exports){
31
+ },{"../utils/flatten":379}],11:[function(require,module,exports){
32
32
  const flatten=require("../utils/flatten"),rgbToHsv=(...e)=>{if((e=flatten(e)).length<3)throw new Error("values must contain R, G and B values");const t=e[0],a=e[1],n=e[2],r=Math.max(t,a,n),s=Math.min(t,a,n);let l;const o=r,c=r-s,i=0===r?0:c/r;if(r===s)l=0;else{switch(r){case t:l=(a-n)/c+(a<n?6:0);break;case a:l=(n-t)/c+2;break;case n:l=(t-a)/c+4}l/=6}if(e.length>3){return[l,i,o,e[3]]}return[l,i,o]};module.exports=rgbToHsv;
33
33
 
34
- },{"../utils/flatten":378}],12:[function(require,module,exports){
34
+ },{"../utils/flatten":379}],12:[function(require,module,exports){
35
35
  const create=e=>{if(!Array.isArray(e))throw new Error("Bezier points must be a valid array/");if(e.length<2)throw new Error("Bezier points must contain at least 2 values.");const r=getPointType(e);return{points:e,pointType:r,dimensions:"float_single"===r?0:e[0].length,permutations:getPermutations(e.length-1),tangentPermutations:getPermutations(e.length-2)}},getPointType=function(e){let r=null;return e.forEach(e=>{let t="";if(Number.isFinite(e))t="float_single";else{if(!Array.isArray(e))throw new Error("Bezier points must all be numbers or arrays of number.");e.forEach(e=>{if(!Number.isFinite(e))throw new Error("Bezier point values must all be numbers.")}),t="float_"+e.length}if(null==r)r=t;else if(r!==t)throw new Error("Bezier points must be either all numbers or all arrays of numbers of the same size.")}),r},getPermutations=function(e){const r=[];for(let t=0;t<=e;t++)r.push(factorial(e)/(factorial(t)*factorial(e-t)));return r},factorial=function(e){let r=1;for(let t=2;t<=e;t++)r*=t;return r};module.exports=create;
36
36
 
37
37
  },{}],13:[function(require,module,exports){
@@ -50,9 +50,9 @@ module.exports={bezier:require("./bezier")};
50
50
  const mat4=require("../../maths/mat4"),vec2=require("../../maths/vec2"),applyTransforms=r=>mat4.isIdentity(r.transforms)?r:(r.sides=r.sides.map(s=>{return[vec2.transform(vec2.create(),s[0],r.transforms),vec2.transform(vec2.create(),s[1],r.transforms)]}),r.transforms=mat4.create(),r);module.exports=applyTransforms;
51
51
 
52
52
  },{"../../maths/mat4":137,"../../maths/vec2":183}],18:[function(require,module,exports){
53
- const mat4=require("../../maths/mat4"),vec2=require("../../maths/vec2"),create=require("./create"),clone=e=>{const r=create();return r.sides=e.sides.map(e=>[vec2.clone(e[0]),vec2.clone(e[1])]),r.transforms=mat4.clone(e.transforms),r};module.exports=clone;
53
+ const clone=e=>Object.assign({},e);module.exports=clone;
54
54
 
55
- },{"../../maths/mat4":137,"../../maths/vec2":183,"./create":19}],19:[function(require,module,exports){
55
+ },{}],19:[function(require,module,exports){
56
56
  const mat4=require("../../maths/mat4"),create=e=>(void 0===e&&(e=[]),{sides:e,transforms:mat4.create()});module.exports=create;
57
57
 
58
58
  },{"../../maths/mat4":137}],20:[function(require,module,exports){
@@ -74,7 +74,7 @@ const create=require("./create"),toSides=require("./toSides"),reverse=e=>{const
74
74
  const toCompactBinary=o=>{const t=o.sides,r=o.transforms;let n=[-1,-1,-1,-1];o.color&&(n=o.color);const e=new Float32Array(21+4*t.length);e[0]=0,e[1]=r[0],e[2]=r[1],e[3]=r[2],e[4]=r[3],e[5]=r[4],e[6]=r[5],e[7]=r[6],e[8]=r[7],e[9]=r[8],e[10]=r[9],e[11]=r[10],e[12]=r[11],e[13]=r[12],e[14]=r[13],e[15]=r[14],e[16]=r[15],e[17]=n[0],e[18]=n[1],e[19]=n[2],e[20]=n[3];for(let o=0;o<t.length;o++){const r=4*o+21,n=t[o][0],s=t[o][1];e[r+0]=n[0],e[r+1]=n[1],e[r+2]=s[0],e[r+3]=s[1]}return e};module.exports=toCompactBinary;
75
75
 
76
76
  },{}],26:[function(require,module,exports){
77
- const vec2=require("../../maths/vec2"),toSides=require("./toSides"),toEdges=e=>{const t=[],s=e=>{const s=t.findIndex(t=>vec2.equals(t,e));return s<0?(t.push(e),e):t[s]},o=[];return e.forEach(e=>{o.push([s(e[0]),s(e[1])])}),o},toOutlines=e=>{const t=new Map;toEdges(toSides(e)).forEach(e=>{t.has(e[0])||t.set(e[0],[]),t.get(e[0]).push(e)});const s=[];for(;;){let e;for(const[s,o]of t){if(e=o.shift())break;t.delete(s)}if(void 0===e)break;const o=[],r=e[0],n=vec2.create();for(;;){o.push(e[0]);const s=e[1];if(s===r)break;const c=t.get(s);if(!c)throw new Error("the given geometry is not closed. verify proper construction");let i=-1;if(1===c.length)i=0;else{let t;const s=vec2.angleDegrees(vec2.subtract(n,e[1],e[0]));for(let e=0;e<c.length;e++){const o=c[e];let r=vec2.angleDegrees(vec2.subtract(n,o[1],o[0]))-s;r<-180&&(r+=360),r>=180&&(r-=360),(i<0||r>t)&&(i=e,t=r)}}const l=c[i];c.splice(i,1),0===c.length&&t.delete(s),e=l}o.length>0&&o.push(o.shift()),s.push(o)}return t.clear(),s};module.exports=toOutlines;
77
+ const vec2=require("../../maths/vec2"),toSides=require("./toSides"),toEdges=e=>{const t={},s=e=>{const s=e.toString();return t[s]||(t[s]=e),t[s]};return e.map(e=>e.map(s))},toOutlines=e=>{const t=new Map;toEdges(toSides(e)).forEach(e=>{t.has(e[0])||t.set(e[0],[]),t.get(e[0]).push(e)});const s=[];for(;;){let e;for(const[s,o]of t){if(e=o.shift())break;t.delete(s)}if(void 0===e)break;const o=[],r=e[0],n=vec2.create();for(;;){o.push(e[0]);const s=e[1];if(s===r)break;const c=t.get(s);if(!c)throw new Error("the given geometry is not closed. verify proper construction");let i=-1;if(1===c.length)i=0;else{let t;const s=vec2.angleDegrees(vec2.subtract(n,e[1],e[0]));for(let e=0;e<c.length;e++){const o=c[e];let r=vec2.angleDegrees(vec2.subtract(n,o[1],o[0]))-s;r<-180&&(r+=360),r>=180&&(r-=360),(i<0||r>t)&&(i=e,t=r)}}const l=c[i];c.splice(i,1),0===c.length&&t.delete(s),e=l}o.length>0&&o.push(o.shift()),s.push(o)}return t.clear(),s};module.exports=toOutlines;
78
78
 
79
79
  },{"../../maths/vec2":183,"./toSides":28}],27:[function(require,module,exports){
80
80
  const toSides=require("./toSides"),toPoints=t=>{const o=toSides(t).map(t=>t[0]);return o.length>0&&o.push(o.shift()),o};module.exports=toPoints;
@@ -86,19 +86,19 @@ const applyTransforms=require("./applyTransforms"),toSides=s=>applyTransforms(s)
86
86
  const vec2=require("../../maths/vec2"),toSides=require("./toSides"),toString=e=>{const t=toSides(e);let o="geom2 ("+t.length+" sides):\n[\n";return t.forEach(e=>{o+=" ["+vec2.toString(e[0])+", "+vec2.toString(e[1])+"]\n"}),o+="]\n"};module.exports=toString;
87
87
 
88
88
  },{"../../maths/vec2":183,"./toSides":28}],30:[function(require,module,exports){
89
- const mat4=require("../../maths/mat4"),create=require("./create"),transform=(r,t)=>{const e=mat4.multiply(mat4.create(),r,t.transforms);return Object.assign({},t,{transforms:e})};module.exports=transform;
89
+ const mat4=require("../../maths/mat4"),transform=(t,r)=>{const s=mat4.multiply(mat4.create(),t,r.transforms);return Object.assign({},r,{transforms:s})};module.exports=transform;
90
90
 
91
- },{"../../maths/mat4":137,"./create":19}],31:[function(require,module,exports){
91
+ },{"../../maths/mat4":137}],31:[function(require,module,exports){
92
92
  const mat4=require("../../maths/mat4"),poly3=require("../poly3"),applyTransforms=r=>mat4.isIdentity(r.transforms)?r:(r.polygons=r.polygons.map(s=>poly3.transform(r.transforms,s)),r.transforms=mat4.create(),r);module.exports=applyTransforms;
93
93
 
94
94
  },{"../../maths/mat4":137,"../poly3":73}],32:[function(require,module,exports){
95
- const mat4=require("../../maths/mat4"),poly3=require("../poly3"),create=require("./create"),clone=e=>{const o=create();return o.polygons=e.polygons.map(e=>poly3.clone(e)),o.isRetesselated=e.isRetesselated,o.transforms=mat4.clone(e.transforms),o};module.exports=clone;
95
+ const clone=e=>Object.assign({},e);module.exports=clone;
96
96
 
97
- },{"../../maths/mat4":137,"../poly3":73,"./create":33}],33:[function(require,module,exports){
98
- const mat4=require("../../maths/mat4"),create=e=>(void 0===e&&(e=[]),{polygons:e,isRetesselated:!1,transforms:mat4.create()});module.exports=create;
97
+ },{}],33:[function(require,module,exports){
98
+ const mat4=require("../../maths/mat4"),create=e=>(void 0===e&&(e=[]),{polygons:e,transforms:mat4.create()});module.exports=create;
99
99
 
100
100
  },{"../../maths/mat4":137}],34:[function(require,module,exports){
101
- const vec3=require("../../maths/vec3"),mat4=require("../../maths/mat4"),poly3=require("../poly3"),create=require("./create"),fromCompactBinary=e=>{if(1!==e[0])throw new Error("invalid compact binary data");const r=create();r.transforms=mat4.clone(e.slice(1,17)),r.isRetesselated=!!e[17];const t=e[22];let o=23,a=e.length-3*t;for(;a<e.length;){const t=e[o];o++;const c=[];for(let r=0;r<t;r++)c.push(vec3.fromValues(e[a],e[a+1],e[a+2])),a+=3;r.polygons.push(poly3.create(c))}return e[18]>=0&&(r.color=[e[18],e[19],e[20],e[21]]),r};module.exports=fromCompactBinary;
101
+ const vec3=require("../../maths/vec3"),mat4=require("../../maths/mat4"),poly3=require("../poly3"),create=require("./create"),fromCompactBinary=e=>{if(1!==e[0])throw new Error("invalid compact binary data");const r=create();r.transforms=mat4.clone(e.slice(1,17));const o=e[21];let t=22,a=e.length-3*o;for(;a<e.length;){const o=e[t];t++;const c=[];for(let r=0;r<o;r++)c.push(vec3.fromValues(e[a],e[a+1],e[a+2])),a+=3;r.polygons.push(poly3.create(c))}return e[17]>=0&&(r.color=[e[17],e[18],e[19],e[20]]),r};module.exports=fromCompactBinary;
102
102
 
103
103
  },{"../../maths/mat4":137,"../../maths/vec3":214,"../poly3":73,"./create":33}],35:[function(require,module,exports){
104
104
  const poly3=require("../poly3"),create=require("./create"),fromPoints=r=>{if(!Array.isArray(r))throw new Error("the given points must be an array");const e=r.map((r,e)=>{return poly3.fromPoints(r)});return create(e)};module.exports=fromPoints;
@@ -113,7 +113,7 @@ const poly3=require("../poly3"),create=require("./create"),toPolygons=require(".
113
113
  const isA=o=>!!(o&&"object"==typeof o&&"polygons"in o&&"transforms"in o&&Array.isArray(o.polygons)&&"length"in o.transforms);module.exports=isA;
114
114
 
115
115
  },{}],39:[function(require,module,exports){
116
- const poly3=require("../poly3"),toCompactBinary=o=>{const t=o.polygons,e=o.transforms,r=t.length,l=t.reduce((o,t)=>o+t.vertices.length,0);let n=[-1,-1,-1,-1];o.color&&(n=o.color);const s=new Float32Array(23+r+3*l);s[0]=1,s[1]=e[0],s[2]=e[1],s[3]=e[2],s[4]=e[3],s[5]=e[4],s[6]=e[5],s[7]=e[6],s[8]=e[7],s[9]=e[8],s[10]=e[9],s[11]=e[10],s[12]=e[11],s[13]=e[12],s[14]=e[13],s[15]=e[14],s[16]=e[15],s[17]=o.isRetesselated?1:0,s[18]=n[0],s[19]=n[1],s[20]=n[2],s[21]=n[3],s[22]=l;let c=23,a=c+r;return t.forEach(o=>{const t=poly3.toPoints(o);s[c]=t.length,c++;for(let o=0;o<t.length;o++){const e=t[o];s[a+0]=e[0],s[a+1]=e[1],s[a+2]=e[2],a+=3}}),s};module.exports=toCompactBinary;
116
+ const poly3=require("../poly3"),toCompactBinary=o=>{const t=o.polygons,e=o.transforms,r=t.length,n=t.reduce((o,t)=>o+t.vertices.length,0);let l=[-1,-1,-1,-1];o.color&&(l=o.color);const c=new Float32Array(22+r+3*n);c[0]=1,c[1]=e[0],c[2]=e[1],c[3]=e[2],c[4]=e[3],c[5]=e[4],c[6]=e[5],c[7]=e[6],c[8]=e[7],c[9]=e[8],c[10]=e[9],c[11]=e[10],c[12]=e[11],c[13]=e[12],c[14]=e[13],c[15]=e[14],c[16]=e[15],c[17]=l[0],c[18]=l[1],c[19]=l[2],c[20]=l[3],c[21]=n;let s=22,a=s+r;return t.forEach(o=>{const t=poly3.toPoints(o);c[s]=t.length,s++;for(let o=0;o<t.length;o++){const e=t[o];c[a+0]=e[0],c[a+1]=e[1],c[a+2]=e[2],a+=3}}),c};module.exports=toCompactBinary;
117
117
 
118
118
  },{"../poly3":73}],40:[function(require,module,exports){
119
119
  const poly3=require("../poly3"),toPolygons=require("./toPolygons"),toPoints=o=>{return toPolygons(o).map(o=>poly3.toPoints(o))};module.exports=toPoints;
@@ -125,9 +125,9 @@ const applyTransforms=require("./applyTransforms"),toPolygons=o=>applyTransforms
125
125
  const poly3=require("../poly3"),toPolygons=require("./toPolygons"),toString=o=>{const t=toPolygons(o);let n="geom3 ("+t.length+" polygons):\n";return t.forEach(o=>{n+=" "+poly3.toString(o)+"\n"}),n};module.exports=toString;
126
126
 
127
127
  },{"../poly3":73,"./toPolygons":41}],43:[function(require,module,exports){
128
- const mat4=require("../../maths/mat4"),create=require("./create"),transform=(r,t)=>{const e=mat4.multiply(mat4.create(),r,t.transforms);return Object.assign({},t,{transforms:e})};module.exports=transform;
128
+ const mat4=require("../../maths/mat4"),transform=(t,r)=>{const s=mat4.multiply(mat4.create(),t,r.transforms);return Object.assign({},r,{transforms:s})};module.exports=transform;
129
129
 
130
- },{"../../maths/mat4":137,"./create":33}],44:[function(require,module,exports){
130
+ },{"../../maths/mat4":137}],44:[function(require,module,exports){
131
131
  module.exports={geom2:require("./geom2"),geom3:require("./geom3"),path2:require("./path2"),poly2:require("./poly2"),poly3:require("./poly3")};
132
132
 
133
133
  },{"./geom2":22,"./geom3":36,"./path2":57,"./poly2":67,"./poly3":73}],45:[function(require,module,exports){
@@ -143,9 +143,9 @@ const fromPoints=require("./fromPoints"),toPoints=require("./toPoints"),appendPo
143
143
  const mat4=require("../../maths/mat4"),vec2=require("../../maths/vec2"),applyTransforms=r=>mat4.isIdentity(r.transforms)?r:(r.points=r.points.map(s=>vec2.transform(vec2.create(),s,r.transforms)),r.transforms=mat4.create(),r);module.exports=applyTransforms;
144
144
 
145
145
  },{"../../maths/mat4":137,"../../maths/vec2":183}],49:[function(require,module,exports){
146
- const mat4=require("../../maths/mat4"),vec2=require("../../maths/vec2"),create=require("./create"),clone=e=>{const r=create();return r.points=e.points.map(e=>vec2.clone(e)),r.isClosed=e.isClosed,r.transforms=mat4.clone(e.transforms),r};module.exports=clone;
146
+ const clone=e=>Object.assign({},e);module.exports=clone;
147
147
 
148
- },{"../../maths/mat4":137,"../../maths/vec2":183,"./create":52}],50:[function(require,module,exports){
148
+ },{}],50:[function(require,module,exports){
149
149
  const{EPS:EPS}=require("../../maths/constants"),vec2=require("../../maths/vec2"),clone=require("./clone"),close=e=>{if(e.isClosed)return e;const t=clone(e);if(t.isClosed=!0,t.points.length>1){const e=t.points,n=e[0];let o=e[e.length-1];for(;vec2.distance(n,o)<EPS*EPS&&(e.pop(),1!==e.length);)o=e[e.length-1]}return t};module.exports=close;
150
150
 
151
151
  },{"../../maths/constants":87,"../../maths/vec2":183,"./clone":49}],51:[function(require,module,exports){
@@ -185,9 +185,9 @@ const applyTransforms=require("./applyTransforms"),toPoints=o=>applyTransforms(o
185
185
  const vec2=require("../../maths/vec2"),toPoints=require("./toPoints"),toString=t=>{const o=toPoints(t);let n="path ("+o.length+" points, "+t.isClosed+"):\n[\n";return o.forEach(t=>{n+=" "+vec2.toString(t)+",\n"}),n+="]\n"};module.exports=toString;
186
186
 
187
187
  },{"../../maths/vec2":183,"./toPoints":61}],63:[function(require,module,exports){
188
- const mat4=require("../../maths/mat4"),create=require("./create"),transform=(r,t)=>{const e=mat4.multiply(mat4.create(),r,t.transforms);return Object.assign({},t,{transforms:e})};module.exports=transform;
188
+ const mat4=require("../../maths/mat4"),transform=(t,r)=>{const s=mat4.multiply(mat4.create(),t,r.transforms);return Object.assign({},r,{transforms:s})};module.exports=transform;
189
189
 
190
- },{"../../maths/mat4":137,"./create":52}],64:[function(require,module,exports){
190
+ },{"../../maths/mat4":137}],64:[function(require,module,exports){
191
191
  const measureArea=require("./measureArea"),flip=require("./flip"),arePointsInside=(e,t)=>{if(0===e.length)return 0;const n=t.vertices;return n.length<3?0:(measureArea(t)<0&&(t=flip(t)),e.reduce((e,t)=>e+isPointInside(t,n),0)===e.length?1:0)},isPointInsideOld=(e,t)=>{let n=0;const r=t.length,s=e[0],i=e[1];for(let o=0;o<t.length;o++){const l=t[o],u=t[(o+1)%r];s!==l[0]&&i!==l[1]&&s!==u[0]&&i!==u[1]&&(l[1]<=i?u[1]>i&&isLeft(l,u,e)>0&&n++:u[1]<=i&&isLeft(l,u,e)<0&&n--)}return 0===n?1:0},isPointInside=(e,t)=>{const n=t.length,r=e[0],s=e[1];let i=t[n-1],o=t[0],l=i[1]>s,u=0,f=0;for(let e=n+1;--e;){const e=o[1]>s;if(l!==e){const e=i[0]>r,t=o[0]>r;e&&t?u=!u:o[0]-(o[1]-s)*(i[0]-o[0])/(i[1]-o[1])>=r&&(u=!u)}l=e,i=o,o=t[++f]}return u},isLeft=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(n[0]-e[0])*(t[1]-e[1]);module.exports=arePointsInside;
192
192
 
193
193
  },{"./flip":66,"./measureArea":68}],65:[function(require,module,exports){
@@ -224,12 +224,12 @@ const create=require("./create"),invert=e=>{const r=e.vertices.slice().reverse()
224
224
  const isA=e=>!!(e&&"object"==typeof e&&"vertices"in e&&Array.isArray(e.vertices));module.exports=isA;
225
225
 
226
226
  },{}],76:[function(require,module,exports){
227
- const plane=require("../../maths/plane"),vec3=require("../../maths/vec3"),isConvex=e=>areVerticesConvex(e.vertices),areVerticesConvex=e=>{const t=e.length;if(t>2){const r=plane.fromPoints(plane.create(),e[0],e[1],e[2]);let c=e[t-2],n=e[t-1];for(let o=0;o<t;o++){const t=e[o];if(!isConvexPoint(c,n,t,r))return!1;c=n,n=t}}return!0},isConvexPoint=(e,t,r,c)=>{const n=vec3.cross(vec3.create(),vec3.subtract(vec3.create(),t,e),vec3.subtract(vec3.create(),r,t));return vec3.dot(n,c)>=0};module.exports=isConvex;
227
+ const plane=require("../../maths/plane"),vec3=require("../../maths/vec3"),isConvex=e=>areVerticesConvex(e.vertices),areVerticesConvex=e=>{const t=e.length;if(t>2){const r=plane.fromPoints(plane.create(),...e);let c=e[t-2],n=e[t-1];for(let o=0;o<t;o++){const t=e[o];if(!isConvexPoint(c,n,t,r))return!1;c=n,n=t}}return!0},isConvexPoint=(e,t,r,c)=>{const n=vec3.cross(vec3.create(),vec3.subtract(vec3.create(),t,e),vec3.subtract(vec3.create(),r,t));return vec3.dot(n,c)>=0};module.exports=isConvex;
228
228
 
229
229
  },{"../../maths/plane":156,"../../maths/vec3":214}],77:[function(require,module,exports){
230
- const vec3=require("../../maths/vec3"),measureArea=e=>{const t=e.vertices.length;if(t<3)return 0;const r=e.vertices,a=r[0],c=r[1],s=r[2],o=vec3.subtract(vec3.create(),c,a),u=vec3.subtract(vec3.create(),s,a),v=vec3.cross(o,o,u),b=Math.abs(v[0]),h=Math.abs(v[1]),n=Math.abs(v[2]),f=Math.sqrt(b*b+h*h+n*n);let i=3;b>h&&b>n?i=1:h>n&&(i=2);let l=0,m=0,M=1,d=2;switch(i){case 1:for(M=1;M<t;M++)m=M-1,d=(M+1)%t,l+=r[M][1]*(r[d][2]-r[m][2]);l+=r[0][1]*(r[1][2]-r[t-1][2]),l*=f/(2*v[0]);break;case 2:for(M=1;M<t;M++)m=M-1,d=(M+1)%t,l+=r[M][2]*(r[d][0]-r[m][0]);l+=r[0][2]*(r[1][0]-r[t-1][0]),l*=f/(2*v[1]);break;case 3:default:for(M=1;M<t;M++)m=M-1,d=(M+1)%t,l+=r[M][0]*(r[d][1]-r[m][1]);l+=r[0][0]*(r[1][1]-r[t-1][1]),l*=f/(2*v[2])}return l};module.exports=measureArea;
230
+ const plane=require("./plane"),measureArea=e=>{const r=e.vertices.length;if(r<3)return 0;const a=e.vertices,t=plane(e),s=Math.abs(t[0]),n=Math.abs(t[1]),c=Math.abs(t[2]);if(s+n+c===0)return 0;let l=3;s>n&&s>c?l=1:n>c&&(l=2);let o=0,u=0,f=1,i=2;switch(l){case 1:for(f=1;f<r;f++)u=f-1,i=(f+1)%r,o+=a[f][1]*(a[i][2]-a[u][2]);o+=a[0][1]*(a[1][2]-a[r-1][2]),o/=2*t[0];break;case 2:for(f=1;f<r;f++)u=f-1,i=(f+1)%r,o+=a[f][2]*(a[i][0]-a[u][0]);o+=a[0][2]*(a[1][0]-a[r-1][0]),o/=2*t[1];break;case 3:default:for(f=1;f<r;f++)u=f-1,i=(f+1)%r,o+=a[f][0]*(a[i][1]-a[u][1]);o+=a[0][0]*(a[1][1]-a[r-1][1]),o/=2*t[2]}return o};module.exports=measureArea;
231
231
 
232
- },{"../../maths/vec3":214}],78:[function(require,module,exports){
232
+ },{"./plane":81}],78:[function(require,module,exports){
233
233
  const vec3=require("../../maths/vec3"),measureBoundingBox=e=>{const c=e.vertices,n=c.length,o=0===n?vec3.create():vec3.clone(c[0]),r=vec3.clone(o);for(let e=1;e<n;e++)vec3.min(o,o,c[e]),vec3.max(r,r,c[e]);return[o,r]};module.exports=measureBoundingBox;
234
234
 
235
235
  },{"../../maths/vec3":214}],79:[function(require,module,exports){
@@ -239,7 +239,7 @@ const vec3=require("../../maths/vec3"),measureBoundingBox=require("./measureBoun
239
239
  const vec3=require("../../maths/vec3"),measureSignedVolume=e=>{let r=0;const t=e.vertices,c=vec3.create();for(let e=0;e<t.length-2;e++)vec3.cross(c,t[e+1],t[e+2]),r+=vec3.dot(t[0],c);return r/=6};module.exports=measureSignedVolume;
240
240
 
241
241
  },{"../../maths/vec3":214}],81:[function(require,module,exports){
242
- const mplane=require("../../maths/plane/"),plane=e=>{if(!e.plane){const n=e.vertices;e.plane=mplane.fromPoints(mplane.create(),n[0],n[1],n[2])}return e.plane};module.exports=plane;
242
+ const mplane=require("../../maths/plane/"),plane=e=>(e.plane||(e.plane=mplane.fromPoints(mplane.create(),...e.vertices)),e.plane);module.exports=plane;
243
243
 
244
244
  },{"../../maths/plane/":156}],82:[function(require,module,exports){
245
245
  const toPoints=o=>o.vertices;module.exports=toPoints;
@@ -253,7 +253,7 @@ const mat4=require("../../maths/mat4"),vec3=require("../../maths/vec3"),create=r
253
253
  },{"../../maths/mat4":137,"../../maths/vec3":214,"./create":70}],85:[function(require,module,exports){
254
254
  module.exports={colors:require("./colors"),curves:require("./curves"),geometries:require("./geometries"),maths:require("./maths"),measurements:require("./measurements"),primitives:require("./primitives"),text:require("./text"),utils:require("./utils"),booleans:require("./operations/booleans"),expansions:require("./operations/expansions"),extrusions:require("./operations/extrusions"),hulls:require("./operations/hulls"),modifiers:require("./operations/modifiers"),transforms:require("./operations/transforms")};
255
255
 
256
- },{"./colors":8,"./curves":16,"./geometries":44,"./maths":88,"./measurements":244,"./operations/booleans":258,"./operations/expansions":289,"./operations/extrusions":302,"./operations/hulls":323,"./operations/modifiers":334,"./operations/transforms":343,"./primitives":359,"./text":372,"./utils":380}],86:[function(require,module,exports){
256
+ },{"./colors":8,"./curves":16,"./geometries":44,"./maths":88,"./measurements":244,"./operations/booleans":258,"./operations/expansions":289,"./operations/extrusions":302,"./operations/hulls":323,"./operations/modifiers":334,"./operations/transforms":343,"./primitives":359,"./text":373,"./utils":381}],86:[function(require,module,exports){
257
257
  const mat4=require("./mat4"),vec2=require("./vec2"),vec3=require("./vec3"),OrthoNormalBasis=function(e,t){arguments.length<2&&(t=vec3.orthogonal(vec3.create(),e)),this.v=vec3.normalize(vec3.create(),vec3.cross(vec3.create(),e,t)),this.u=vec3.cross(vec3.create(),this.v,e),this.plane=e,this.planeorigin=vec3.scale(vec3.create(),e,e[3])};OrthoNormalBasis.GetCartesian=function(e,t){const i=e+"/"+t;let s,n;if("X/Y"===i)s=[0,0,1],n=[1,0,0];else if("Y/-X"===i)s=[0,0,1],n=[0,1,0];else if("-X/-Y"===i)s=[0,0,1],n=[-1,0,0];else if("-Y/X"===i)s=[0,0,1],n=[0,-1,0];else if("-X/Y"===i)s=[0,0,-1],n=[-1,0,0];else if("-Y/-X"===i)s=[0,0,-1],n=[0,-1,0];else if("X/-Y"===i)s=[0,0,-1],n=[1,0,0];else if("Y/X"===i)s=[0,0,-1],n=[0,1,0];else if("X/Z"===i)s=[0,-1,0],n=[1,0,0];else if("Z/-X"===i)s=[0,-1,0],n=[0,0,1];else if("-X/-Z"===i)s=[0,-1,0],n=[-1,0,0];else if("-Z/X"===i)s=[0,-1,0],n=[0,0,-1];else if("-X/Z"===i)s=[0,1,0],n=[-1,0,0];else if("-Z/-X"===i)s=[0,1,0],n=[0,0,-1];else if("X/-Z"===i)s=[0,1,0],n=[1,0,0];else if("Z/X"===i)s=[0,1,0],n=[0,0,1];else if("Y/Z"===i)s=[1,0,0],n=[0,1,0];else if("Z/-Y"===i)s=[1,0,0],n=[0,0,1];else if("-Y/-Z"===i)s=[1,0,0],n=[0,-1,0];else if("-Z/Y"===i)s=[1,0,0],n=[0,0,-1];else if("-Y/Z"===i)s=[-1,0,0],n=[0,-1,0];else if("-Z/-Y"===i)s=[-1,0,0],n=[0,0,-1];else if("Y/-Z"===i)s=[-1,0,0],n=[0,1,0];else{if("Z/Y"!==i)throw new Error("OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.");s=[-1,0,0],n=[0,0,1]}return new OrthoNormalBasis(new Plane(new Vector3D(s),0),new Vector3D(n))},OrthoNormalBasis.Z0Plane=function(){const e=new Plane(new Vector3D([0,0,1]),0);return new OrthoNormalBasis(e,new Vector3D([1,0,0]))},OrthoNormalBasis.prototype={getProjectionMatrix:function(){return mat4.fromValues(this.u[0],this.v[0],this.plane[0],0,this.u[1],this.v[1],this.plane[1],0,this.u[2],this.v[2],this.plane[2],0,0,0,-this.plane[3],1)},getInverseProjectionMatrix:function(){const e=vec3.scale(vec3.create(),this.plane,this.plane[3]);return mat4.fromValues(this.u[0],this.u[1],this.u[2],0,this.v[0],this.v[1],this.v[2],0,this.plane[0],this.plane[1],this.plane[2],0,e[0],e[1],e[2],1)},to2D:function(e){return vec2.fromValues(vec3.dot(e,this.u),vec3.dot(e,this.v))},to3D:function(e){const t=vec3.scale(vec3.create(),this.u,e[0]),i=vec3.scale(vec3.create(),this.v,e[1]),s=vec3.add(t,t,this.planeorigin);return vec3.add(i,i,s)},line3Dto2D:function(e){const t=e.point,i=e.direction.plus(t),s=this.to2D(t),n=this.to2D(i);return Line2D.fromPoints(s,n)},line2Dto3D:function(e){const t=e.origin(),i=e.direction().plus(t),s=this.to3D(t),n=this.to3D(i);return Line3D.fromPoints(s,n)},transform:function(e){const t=this.plane.transform(e),i=this.u.transform(e),s=new Vector3D(0,0,0).transform(e),n=i.minus(s);return new OrthoNormalBasis(t,n)}},module.exports=OrthoNormalBasis;
258
258
 
259
259
  },{"./mat4":137,"./vec2":183,"./vec3":214}],87:[function(require,module,exports){
@@ -377,7 +377,7 @@ const create=()=>[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];module.exports=create;
377
377
  const equals=(e,s)=>e[0]===s[0]&&e[1]===s[1]&&e[2]===s[2]&&e[3]===s[3]&&e[4]===s[4]&&e[5]===s[5]&&e[6]===s[6]&&e[7]===s[7]&&e[8]===s[8]&&e[9]===s[9]&&e[10]===s[10]&&e[11]===s[11]&&e[12]===s[12]&&e[13]===s[13]&&e[14]===s[14]&&e[15]===s[15];module.exports=equals;
378
378
 
379
379
  },{}],127:[function(require,module,exports){
380
- const identity=require("./identity"),{EPSILON:EPSILON}=require("./constants"),fromRotation=(t,e,i)=>{let[n,o,r]=i,s=Math.sqrt(n*n+o*o+r*r);if(Math.abs(s)<EPSILON)return identity(t);n*=s=1/s,o*=s,r*=s;const a=Math.sin(e),u=Math.cos(e),c=1-u;return t[0]=n*n*c+u,t[1]=o*n*c+r*a,t[2]=r*n*c-o*a,t[3]=0,t[4]=n*o*c-r*a,t[5]=o*o*c+u,t[6]=r*o*c+n*a,t[7]=0,t[8]=n*r*c+o*a,t[9]=o*r*c-n*a,t[10]=r*r*c+u,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t};module.exports=fromRotation;
380
+ const identity=require("./identity"),{EPSILON:EPSILON}=require("./constants"),fromRotation=(t,o,e)=>{let[i,n,r]=e,a=Math.hypot(i,n,r);if(Math.abs(a)<EPSILON)return identity(t);i*=a=1/a,n*=a,r*=a;const s=Math.sin(o),h=Math.cos(o),u=1-h;return t[0]=i*i*u+h,t[1]=n*i*u+r*s,t[2]=r*i*u-n*s,t[3]=0,t[4]=i*n*u-r*s,t[5]=n*n*u+h,t[6]=r*n*u+i*s,t[7]=0,t[8]=i*r*u+n*s,t[9]=n*r*u-i*s,t[10]=r*r*u+h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t};module.exports=fromRotation;
381
381
 
382
382
  },{"./constants":123,"./identity":136}],128:[function(require,module,exports){
383
383
  const fromScaling=(o,c)=>(o[0]=c[0],o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=c[1],o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[10]=c[2],o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o);module.exports=fromScaling;
@@ -428,7 +428,7 @@ const mirrorByPlane=(r,o)=>{const[e,n,t,l]=o;return r[0]=1-2*e*e,r[1]=-2*n*e,r[2
428
428
  const multiply=(t,l,e)=>{const o=l[0],u=l[1],m=l[2],n=l[3],p=l[4],r=l[5],s=l[6],c=l[7],i=l[8],y=l[9],d=l[10],x=l[11],a=l[12],b=l[13],f=l[14],g=l[15];let h=e[0],j=e[1],k=e[2],q=e[3];return t[0]=h*o+j*p+k*i+q*a,t[1]=h*u+j*r+k*y+q*b,t[2]=h*m+j*s+k*d+q*f,t[3]=h*n+j*c+k*x+q*g,h=e[4],j=e[5],k=e[6],q=e[7],t[4]=h*o+j*p+k*i+q*a,t[5]=h*u+j*r+k*y+q*b,t[6]=h*m+j*s+k*d+q*f,t[7]=h*n+j*c+k*x+q*g,h=e[8],j=e[9],k=e[10],q=e[11],t[8]=h*o+j*p+k*i+q*a,t[9]=h*u+j*r+k*y+q*b,t[10]=h*m+j*s+k*d+q*f,t[11]=h*n+j*c+k*x+q*g,h=e[12],j=e[13],k=e[14],q=e[15],t[12]=h*o+j*p+k*i+q*a,t[13]=h*u+j*r+k*y+q*b,t[14]=h*m+j*s+k*d+q*f,t[15]=h*n+j*c+k*x+q*g,t};module.exports=multiply;
429
429
 
430
430
  },{}],144:[function(require,module,exports){
431
- const copy=require("./copy"),rotate=(t,e,o,r)=>{let[a,s,c]=r,n=Math.sqrt(a*a+s*s+c*c);if(Math.abs(n)<1e-6)return copy(t,e);a*=n=1/n,s*=n,c*=n;const h=Math.sin(o),p=Math.cos(o),u=1-p,M=e[0],i=e[1],y=e[2],l=e[3],q=e[4],b=e[5],d=e[6],f=e[7],m=e[8],x=e[9],g=e[10],j=e[11],k=a*a*u+p,v=s*a*u+c*h,w=c*a*u-s*h,z=a*s*u-c*h,A=s*s*u+p,B=c*s*u+a*h,C=a*c*u+s*h,D=s*c*u-a*h,E=c*c*u+p;return t[0]=M*k+q*v+m*w,t[1]=i*k+b*v+x*w,t[2]=y*k+d*v+g*w,t[3]=l*k+f*v+j*w,t[4]=M*z+q*A+m*B,t[5]=i*z+b*A+x*B,t[6]=y*z+d*A+g*B,t[7]=l*z+f*A+j*B,t[8]=M*C+q*D+m*E,t[9]=i*C+b*D+x*E,t[10]=y*C+d*D+g*E,t[11]=l*C+f*D+j*E,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t};module.exports=rotate;
431
+ const copy=require("./copy"),rotate=(t,o,e,r)=>{let[a,c,s]=r,h=Math.hypot(a,c,s);if(Math.abs(h)<1e-6)return copy(t,o);a*=h=1/h,c*=h,s*=h;const n=Math.sin(e),p=Math.cos(e),u=1-p,y=o[0],M=o[1],i=o[2],l=o[3],b=o[4],d=o[5],f=o[6],m=o[7],q=o[8],x=o[9],g=o[10],j=o[11],k=a*a*u+p,v=c*a*u+s*n,w=s*a*u-c*n,z=a*c*u-s*n,A=c*c*u+p,B=s*c*u+a*n,C=a*s*u+c*n,D=c*s*u-a*n,E=s*s*u+p;return t[0]=y*k+b*v+q*w,t[1]=M*k+d*v+x*w,t[2]=i*k+f*v+g*w,t[3]=l*k+m*v+j*w,t[4]=y*z+b*A+q*B,t[5]=M*z+d*A+x*B,t[6]=i*z+f*A+g*B,t[7]=l*z+m*A+j*B,t[8]=y*C+b*D+q*E,t[9]=M*C+d*D+x*E,t[10]=i*C+f*D+g*E,t[11]=l*C+m*D+j*E,o!==t&&(t[12]=o[12],t[13]=o[13],t[14]=o[14],t[15]=o[15]),t};module.exports=rotate;
432
432
 
433
433
  },{"./copy":124}],145:[function(require,module,exports){
434
434
  const rotateX=(t,o,e)=>{const r=Math.sin(e),s=Math.cos(e),a=o[4],n=o[5],c=o[6],h=o[7],u=o[8],M=o[9],X=o[10],d=o[11];return o!==t&&(t[0]=o[0],t[1]=o[1],t[2]=o[2],t[3]=o[3],t[12]=o[12],t[13]=o[13],t[14]=o[14],t[15]=o[15]),t[4]=a*s+u*r,t[5]=n*s+M*r,t[6]=c*s+X*r,t[7]=h*s+d*r,t[8]=u*s-a*r,t[9]=M*s-n*r,t[10]=X*s-c*r,t[11]=d*s-h*r,t};module.exports=rotateX;
@@ -458,7 +458,7 @@ const flip=(l,o)=>(l[0]=-o[0],l[1]=-o[1],l[2]=-o[2],l[3]=-o[3],l);module.exports
458
458
  const vec3=require("../vec3"),fromNormalAndPoint=(e,o,r)=>{const c=vec3.normalize(vec3.create(),o),n=vec3.dot(r,c);return e[0]=c[0],e[1]=c[1],e[2]=c[2],e[3]=n,e};module.exports=fromNormalAndPoint;
459
459
 
460
460
  },{"../vec3":214}],154:[function(require,module,exports){
461
- const vec3=require("../vec3"),fromPoints=(e,c,t,r)=>{const o=vec3.subtract(vec3.create(),t,c),s=vec3.subtract(vec3.create(),r,c);vec3.cross(o,o,s),vec3.normalize(o,o);const v=vec3.dot(o,c);return e[0]=o[0],e[1]=o[1],e[2]=o[2],e[3]=v,e};module.exports=fromPoints;
461
+ const vec3=require("../vec3"),fromPoints=(e,...c)=>{const r=c.length,t=vec3.create(),o=vec3.create(),v=e=>{const v=c[e],n=c[(e+1)%r],s=c[(e+2)%r];return vec3.subtract(t,n,v),vec3.subtract(o,s,v),vec3.cross(t,t,o),vec3.normalize(t,t),t};return e[0]=0,e[1]=0,e[2]=0,3===r?vec3.copy(e,v(0)):(c.forEach((c,r)=>{vec3.add(e,e,v(r))}),vec3.normalize(e,e)),e[3]=vec3.dot(e,c[0]),e};module.exports=fromPoints;
462
462
 
463
463
  },{"../vec3":214}],155:[function(require,module,exports){
464
464
  const{EPS:EPS}=require("../constants"),vec3=require("../vec3"),fromPointsRandom=(e,c,o,t)=>{let r=vec3.subtract(vec3.create(),o,c),v=vec3.subtract(vec3.create(),t,c);vec3.length(r)<EPS&&(r=vec3.orthogonal(r,v)),vec3.length(v)<EPS&&(v=vec3.orthogonal(v,r));let n=vec3.cross(vec3.create(),r,v);vec3.length(n)<EPS&&(v=vec3.orthogonal(v,r),n=vec3.cross(n,r,v)),n=vec3.normalize(n,n);const s=vec3.dot(n,c);return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=s,e};module.exports=fromPointsRandom;
@@ -602,7 +602,7 @@ const abs=(a,s)=>(a[0]=Math.abs(s[0]),a[1]=Math.abs(s[1]),a[2]=Math.abs(s[2]),a)
602
602
  const add=(d,o,a)=>(d[0]=o[0]+a[0],d[1]=o[1]+a[1],d[2]=o[2]+a[2],d);module.exports=add;
603
603
 
604
604
  },{}],202:[function(require,module,exports){
605
- const dot=require("./dot"),angle=(t,a)=>{const o=t[0],e=t[1],r=t[2],n=a[0],s=a[1],h=a[2],M=Math.sqrt(o*o+e*e+r*r)*Math.sqrt(n*n+s*s+h*h),d=M&&dot(t,a)/M;return Math.acos(Math.min(Math.max(d,-1),1))};module.exports=angle;
605
+ const dot=require("./dot"),angle=(t,o)=>{const a=t[0],e=t[1],h=t[2],n=o[0],r=o[1],M=o[2],d=Math.hypot(a,e,h)*Math.hypot(n,r,M),s=d&&dot(t,o)/d;return Math.acos(Math.min(Math.max(s,-1),1))};module.exports=angle;
606
606
 
607
607
  },{"./dot":209}],203:[function(require,module,exports){
608
608
  const create=require("./create"),clone=e=>{const r=create();return r[0]=e[0],r[1]=e[1],r[2]=e[2],r};module.exports=clone;
@@ -733,40 +733,40 @@ module.exports={measureAggregateArea:require("./measureAggregateArea"),measureAg
733
733
  },{"./measureAggregateArea":245,"./measureAggregateBoundingBox":246,"./measureAggregateEpsilon":247,"./measureAggregateVolume":248,"./measureArea":249,"./measureBoundingBox":250,"./measureBoundingSphere":251,"./measureCenter":252,"./measureCenterOfMass":253,"./measureDimensions":254,"./measureEpsilon":255,"./measureVolume":256}],245:[function(require,module,exports){
734
734
  const flatten=require("../utils/flatten"),measureArea=require("./measureArea"),measureAggregateArea=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("measureAggregateArea: no geometries supplied");const r=measureArea(e);if(1===e.length)return r;return r.reduce((e,r)=>e+r,0)};module.exports=measureAggregateArea;
735
735
 
736
- },{"../utils/flatten":378,"./measureArea":249}],246:[function(require,module,exports){
736
+ },{"../utils/flatten":379,"./measureArea":249}],246:[function(require,module,exports){
737
737
  const flatten=require("../utils/flatten"),vec3min=require("../maths/vec3/min"),vec3max=require("../maths/vec3/max"),measureBoundingBox=require("./measureBoundingBox"),measureAggregateBoundingBox=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("measureAggregateBoundingBox: no geometries supplied");const r=measureBoundingBox(e);if(1===e.length)return r;const u=[[Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE],[-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE]];return r.reduce((e,r)=>e=[vec3min(e[0],e[0],r[0]),vec3max(e[1],e[1],r[1])],u)};module.exports=measureAggregateBoundingBox;
738
738
 
739
- },{"../maths/vec3/max":217,"../maths/vec3/min":218,"../utils/flatten":378,"./measureBoundingBox":250}],247:[function(require,module,exports){
739
+ },{"../maths/vec3/max":217,"../maths/vec3/min":218,"../utils/flatten":379,"./measureBoundingBox":250}],247:[function(require,module,exports){
740
740
  const flatten=require("../utils/flatten"),measureAggregateBoundingBox=require("./measureAggregateBoundingBox"),calculateEpsilonFromBounds=require("./calculateEpsilonFromBounds"),{geom2:geom2,geom3:geom3,path2:path2}=require("../geometries"),measureAggregateEpsilon=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("measureAggregateEpsilon: no geometries supplied");const o=measureAggregateBoundingBox(e);let r=0;return r=e.reduce((e,o)=>path2.isA(o)||geom2.isA(o)?Math.max(e,2):geom3.isA(o)?Math.max(e,3):0,r),calculateEpsilonFromBounds(o,r)};module.exports=measureAggregateEpsilon;
741
741
 
742
- },{"../geometries":44,"../utils/flatten":378,"./calculateEpsilonFromBounds":243,"./measureAggregateBoundingBox":246}],248:[function(require,module,exports){
742
+ },{"../geometries":44,"../utils/flatten":379,"./calculateEpsilonFromBounds":243,"./measureAggregateBoundingBox":246}],248:[function(require,module,exports){
743
743
  const flatten=require("../utils/flatten"),measureVolume=require("./measureVolume"),measureAggregateVolume=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("measureAggregateVolume: no geometries supplied");const r=measureVolume(e);if(1===e.length)return r;return r.reduce((e,r)=>e+r,0)};module.exports=measureAggregateVolume;
744
744
 
745
- },{"../utils/flatten":378,"./measureVolume":256}],249:[function(require,module,exports){
745
+ },{"../utils/flatten":379,"./measureVolume":256}],249:[function(require,module,exports){
746
746
  const flatten=require("../utils/flatten"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),poly3=require("../geometries/poly3"),cache=new WeakMap,measureAreaOfPath2=()=>0,measureAreaOfGeom2=e=>{let r=cache.get(e);if(r)return r;return r=geom2.toSides(e).reduce((e,r)=>e+(r[0][0]*r[1][1]-r[0][1]*r[1][0]),0),r*=.5,cache.set(e,r),r},measureAreaOfGeom3=e=>{let r=cache.get(e);if(r)return r;return r=geom3.toPolygons(e).reduce((e,r)=>e+poly3.measureArea(r),0),cache.set(e,r),r},measureArea=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const r=e.map(e=>path2.isA(e)?0:geom2.isA(e)?measureAreaOfGeom2(e):geom3.isA(e)?measureAreaOfGeom3(e):0);return 1===r.length?r[0]:r};module.exports=measureArea;
747
747
 
748
- },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../utils/flatten":378}],250:[function(require,module,exports){
749
- const flatten=require("../utils/flatten"),vec2=require("../maths/vec2"),vec3=require("../maths/vec3"),mat4=require("../maths/mat4"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),poly3=require("../geometries/poly3"),cache=new WeakMap,measureBoundingBoxOfPath2Points=e=>{let o,n=cache.get(e);if(n)return n;o=0===e.length?vec2.create():vec2.clone(e[0]);const t=vec2.clone(o);return e.forEach(e=>{vec2.min(o,o,e),vec2.max(t,t,e)}),n=[[o[0],o[1],0],[t[0],t[1],0]],cache.set(e,n),n},measureBoundingBoxOfPath2=e=>{let o=cache.get(e);return o||(o=mat4.isOnlyTransformScale(e.transforms)?transformBoundingBox(measureBoundingBoxOfPath2Points(e.points),e.transforms):measureBoundingBoxOfPath2Points(path2.toPoints(e)),cache.set(e,o),o)},measureBoundingBoxOfGeom2Points=({points:e,sides:o})=>{const n=e||o;let t,r,a=cache.get(n);return a||(e?(t=0===e.length?vec2.create():vec2.clone(e[0]),r=vec2.clone(t),e.forEach(e=>{vec2.min(t,t,e),vec2.max(r,r,e)})):(t=0===o.length?vec2.create():vec2.clone(o[0][0]),r=vec2.clone(t),o.forEach(e=>{vec2.min(t,t,e[0]),vec2.max(r,r,e[0])})),a=[[t[0],t[1],0],[r[0],r[1],0]],cache.set(n,a),a)},measureBoundingBoxOfGeom2=e=>{let o=cache.get(e);return o||(o=mat4.isOnlyTransformScale(e.transforms)?transformBoundingBox(measureBoundingBoxOfGeom2Points(e),e.transforms):measureBoundingBoxOfGeom2Points({points:geom2.toPoints(e)}),cache.set(e,o),o)},measureBoundingBoxOfGeom3Polygons=e=>{let o=cache.get(e);if(o)return o;const n=vec3.create();if(e.length>0){const o=poly3.toPoints(e[0]);vec3.copy(n,o[0])}const t=vec3.clone(n);return e.forEach(e=>{poly3.toPoints(e).forEach(e=>{vec3.min(n,n,e),vec3.max(t,t,e)})}),o=[[n[0],n[1],n[2]],[t[0],t[1],t[2]]],cache.set(e,o),o},measureBoundingBoxOfGeom3=e=>{let o=cache.get(e);return o||(o=mat4.isOnlyTransformScale(e.transforms)?transformBoundingBox(measureBoundingBoxOfGeom3Polygons(e.polygons),e.transforms):measureBoundingBoxOfGeom3Polygons(geom3.toPolygons(e)),cache.set(e,o),o)},transformBoundingBox=(e,o)=>o&&!mat4.isIdentity(o)?[vec3.transform(vec3.create(),e[0],o),vec3.transform(vec3.create(),e[1],o)]:e,measureBoundingBox=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const o=e.map(e=>path2.isA(e)?measureBoundingBoxOfPath2(e):geom2.isA(e)?measureBoundingBoxOfGeom2(e):geom3.isA(e)?measureBoundingBoxOfGeom3(e):[[0,0,0],[0,0,0]]);return 1===o.length?o[0]:o};measureBoundingBox.setCache=((e,o)=>cache.set(e,o)),module.exports=measureBoundingBox;
748
+ },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../utils/flatten":379}],250:[function(require,module,exports){
749
+ const flatten=require("../utils/flatten"),vec2=require("../maths/vec2"),vec3=require("../maths/vec3"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),poly3=require("../geometries/poly3"),cache=new WeakMap,measureBoundingBoxOfPath2=e=>{let o=cache.get(e);if(o)return o;const t=path2.toPoints(e);let n;n=0===t.length?vec2.create():vec2.clone(t[0]);let r=vec2.clone(n);return t.forEach(e=>{vec2.min(n,n,e),vec2.max(r,r,e)}),n=[n[0],n[1],0],r=[r[0],r[1],0],o=[n,r],cache.set(e,o),o},measureBoundingBoxOfGeom2=e=>{let o=cache.get(e);if(o)return o;const t=geom2.toPoints(e);let n;n=0===t.length?vec2.create():vec2.clone(t[0]);let r=vec2.clone(n);return t.forEach(e=>{vec2.min(n,n,e),vec2.max(r,r,e)}),n=[n[0],n[1],0],r=[r[0],r[1],0],o=[n,r],cache.set(e,o),o},measureBoundingBoxOfGeom3=e=>{let o=cache.get(e);if(o)return o;const t=geom3.toPolygons(e);let n=vec3.create();if(t.length>0){const e=poly3.toPoints(t[0]);vec3.copy(n,e[0])}let r=vec3.clone(n);return t.forEach(e=>{poly3.toPoints(e).forEach(e=>{vec3.min(n,n,e),vec3.max(r,r,e)})}),n=[n[0],n[1],n[2]],r=[r[0],r[1],r[2]],o=[n,r],cache.set(e,o),o},measureBoundingBox=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const o=e.map(e=>path2.isA(e)?measureBoundingBoxOfPath2(e):geom2.isA(e)?measureBoundingBoxOfGeom2(e):geom3.isA(e)?measureBoundingBoxOfGeom3(e):[[0,0,0],[0,0,0]]);return 1===o.length?o[0]:o};module.exports=measureBoundingBox;
750
750
 
751
- },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../maths/mat4":137,"../maths/vec2":183,"../maths/vec3":214,"../utils/flatten":378}],251:[function(require,module,exports){
751
+ },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../maths/vec2":183,"../maths/vec3":214,"../utils/flatten":379}],251:[function(require,module,exports){
752
752
  const flatten=require("../utils/flatten"),vec2=require("../maths/vec2"),vec3=require("../maths/vec3"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),poly3=require("../geometries/poly3"),cacheOfBoundingSpheres=new WeakMap,measureBoundingSphereOfPath2=e=>{let t=cacheOfBoundingSpheres.get(e);if(void 0!==t)return t;const r=vec3.create();let o=0;const c=path2.toPoints(e);if(c.length>0){let e=0;const t=vec3.create();c.forEach(o=>{vec3.add(r,r,vec3.fromVec2(t,o,0)),e++}),vec3.scale(r,r,1/e),c.forEach(e=>{o=Math.max(o,vec2.squaredDistance(r,e))}),o=Math.sqrt(o)}return t=[r,o],cacheOfBoundingSpheres.set(e,t),t},measureBoundingSphereOfGeom2=e=>{let t=cacheOfBoundingSpheres.get(e);if(void 0!==t)return t;const r=vec3.create();let o=0;const c=geom2.toSides(e);if(c.length>0){let e=0;const t=vec3.create();c.forEach(o=>{vec3.add(r,r,vec3.fromVec2(t,o[0],0)),e++}),vec3.scale(r,r,1/e),c.forEach(e=>{o=Math.max(o,vec2.squaredDistance(r,e[0]))}),o=Math.sqrt(o)}return t=[r,o],cacheOfBoundingSpheres.set(e,t),t},measureBoundingSphereOfGeom3=e=>{let t=cacheOfBoundingSpheres.get(e);if(void 0!==t)return t;const r=vec3.create();let o=0;const c=geom3.toPolygons(e);if(c.length>0){let e=0;c.forEach(t=>{poly3.toPoints(t).forEach(t=>{vec3.add(r,r,t),e++})}),vec3.scale(r,r,1/e),c.forEach(e=>{poly3.toPoints(e).forEach(e=>{o=Math.max(o,vec3.squaredDistance(r,e))})}),o=Math.sqrt(o)}return t=[r,o],cacheOfBoundingSpheres.set(e,t),t},measureBoundingSphere=(...e)=>{const t=(e=flatten(e)).map(e=>path2.isA(e)?measureBoundingSphereOfPath2(e):geom2.isA(e)?measureBoundingSphereOfGeom2(e):geom3.isA(e)?measureBoundingSphereOfGeom3(e):[[0,0,0],0]);return 1===t.length?t[0]:t};module.exports=measureBoundingSphere;
753
753
 
754
- },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../maths/vec2":183,"../maths/vec3":214,"../utils/flatten":378}],252:[function(require,module,exports){
754
+ },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../maths/vec2":183,"../maths/vec3":214,"../utils/flatten":379}],252:[function(require,module,exports){
755
755
  const flatten=require("../utils/flatten"),measureBoundingBox=require("./measureBoundingBox"),measureCenter=(...e)=>{const n=(e=flatten(e)).map(e=>{const n=measureBoundingBox(e);return[n[0][0]+(n[1][0]-n[0][0])/2,n[0][1]+(n[1][1]-n[0][1])/2,n[0][2]+(n[1][2]-n[0][2])/2]});return 1===n.length?n[0]:n};module.exports=measureCenter;
756
756
 
757
- },{"../utils/flatten":378,"./measureBoundingBox":250}],253:[function(require,module,exports){
758
- const flatten=require("../utils/flatten"),vec3=require("../maths/vec3"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),cacheOfCenterOfMass=new WeakMap,measureCenterOfMassGeom2=e=>{let t=cacheOfCenterOfMass.get(e);if(void 0!==t)return t;const s=geom2.toSides(e);let r=0,a=0,c=0;if(s.length>0){for(let e=0;e<s.length;e++){const t=s[e][0],o=s[e][1],n=t[0]*o[1]-t[1]*o[0];r+=n,a+=(t[0]+o[0])*n,c+=(t[1]+o[1])*n}const e=1/(6*(r/=2));a*=e,c*=e}return t=vec3.fromValues(a,c,0),cacheOfCenterOfMass.set(e,t),t},measureCenterOfMassGeom3=e=>{let t=cacheOfCenterOfMass.get(e);if(void 0!==t)return t;t=vec3.create();const s=geom3.toPolygons(e);if(0===s.length)return t;let r=0;const a=vec3.create();return s.forEach(e=>{const s=e.vertices;for(let e=0;e<s.length-2;e++){vec3.cross(a,s[e+1],s[e+2]);const c=vec3.dot(s[0],a)/6;r+=c,vec3.add(a,s[0],s[e+1]),vec3.add(a,a,s[e+2]);const o=vec3.scale(a,a,.25*c);vec3.add(t,t,o)}}),vec3.scale(t,t,1/r),cacheOfCenterOfMass.set(e,t),t},measureCenterOfMass=(...e)=>{const t=(e=flatten(e)).map(e=>geom2.isA(e)?measureCenterOfMassGeom2(e):geom3.isA(e)?measureCenterOfMassGeom3(e):[0,0,0]);return 1===t.length?t[0]:t};module.exports=measureCenterOfMass;
757
+ },{"../utils/flatten":379,"./measureBoundingBox":250}],253:[function(require,module,exports){
758
+ const flatten=require("../utils/flatten"),vec3=require("../maths/vec3"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),cacheOfCenterOfMass=new WeakMap,measureCenterOfMassGeom2=e=>{let t=cacheOfCenterOfMass.get(e);if(void 0!==t)return t;const s=geom2.toSides(e);let r=0,c=0,a=0;if(s.length>0){for(let e=0;e<s.length;e++){const t=s[e][0],o=s[e][1],n=t[0]*o[1]-t[1]*o[0];r+=n,c+=(t[0]+o[0])*n,a+=(t[1]+o[1])*n}const e=1/(6*(r/=2));c*=e,a*=e}return t=vec3.fromValues(c,a,0),cacheOfCenterOfMass.set(e,t),t},measureCenterOfMassGeom3=e=>{let t=cacheOfCenterOfMass.get(e);if(void 0!==t)return t;t=vec3.create();const s=geom3.toPolygons(e);if(0===s.length)return t;let r=0;const c=vec3.create();return s.forEach(e=>{const s=e.vertices;for(let e=0;e<s.length-2;e++){vec3.cross(c,s[e+1],s[e+2]);const a=vec3.dot(s[0],c)/6;r+=a,vec3.add(c,s[0],s[e+1]),vec3.add(c,c,s[e+2]);const o=vec3.scale(c,c,.25*a);vec3.add(t,t,o)}}),vec3.scale(t,t,1/r),cacheOfCenterOfMass.set(e,t),t},measureCenterOfMass=(...e)=>{const t=(e=flatten(e)).map(e=>geom2.isA(e)?measureCenterOfMassGeom2(e):geom3.isA(e)?measureCenterOfMassGeom3(e):[0,0,0]);return 1===t.length?t[0]:t};module.exports=measureCenterOfMass;
759
759
 
760
- },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../maths/vec3":214,"../utils/flatten":378}],254:[function(require,module,exports){
760
+ },{"../geometries/geom2":22,"../geometries/geom3":36,"../maths/vec3":214,"../utils/flatten":379}],254:[function(require,module,exports){
761
761
  const flatten=require("../utils/flatten"),measureBoundingBox=require("./measureBoundingBox"),measureDimensions=(...e)=>{const n=(e=flatten(e)).map(e=>{const n=measureBoundingBox(e);return[n[1][0]-n[0][0],n[1][1]-n[0][1],n[1][2]-n[0][2]]});return 1===n.length?n[0]:n};module.exports=measureDimensions;
762
762
 
763
- },{"../utils/flatten":378,"./measureBoundingBox":250}],255:[function(require,module,exports){
763
+ },{"../utils/flatten":379,"./measureBoundingBox":250}],255:[function(require,module,exports){
764
764
  const flatten=require("../utils/flatten"),{geom2:geom2,geom3:geom3,path2:path2}=require("../geometries"),calculateEpsilonFromBounds=require("./calculateEpsilonFromBounds"),measureBoundingBox=require("./measureBoundingBox"),measureEpsilonOfPath2=e=>calculateEpsilonFromBounds(measureBoundingBox(e),2),measureEpsilonOfGeom2=e=>calculateEpsilonFromBounds(measureBoundingBox(e),2),measureEpsilonOfGeom3=e=>calculateEpsilonFromBounds(measureBoundingBox(e),3),measureEpsilon=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const o=e.map(e=>path2.isA(e)?measureEpsilonOfPath2(e):geom2.isA(e)?measureEpsilonOfGeom2(e):geom3.isA(e)?measureEpsilonOfGeom3(e):0);return 1===o.length?o[0]:o};module.exports=measureEpsilon;
765
765
 
766
- },{"../geometries":44,"../utils/flatten":378,"./calculateEpsilonFromBounds":243,"./measureBoundingBox":250}],256:[function(require,module,exports){
766
+ },{"../geometries":44,"../utils/flatten":379,"./calculateEpsilonFromBounds":243,"./measureBoundingBox":250}],256:[function(require,module,exports){
767
767
  const flatten=require("../utils/flatten"),geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),poly3=require("../geometries/poly3"),cache=new WeakMap,measureVolumeOfPath2=()=>0,measureVolumeOfGeom2=()=>0,measureVolumeOfGeom3=e=>{let r=cache.get(e);if(r)return r;return r=geom3.toPolygons(e).reduce((e,r)=>e+poly3.measureSignedVolume(r),0),cache.set(e,r),r},measureVolume=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const r=e.map(e=>path2.isA(e)?0:geom2.isA(e)?0:geom3.isA(e)?measureVolumeOfGeom3(e):0);return 1===r.length?r[0]:r};module.exports=measureVolume;
768
768
 
769
- },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../utils/flatten":378}],257:[function(require,module,exports){
769
+ },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57,"../geometries/poly3":73,"../utils/flatten":379}],257:[function(require,module,exports){
770
770
  const vec2=require("../../maths/vec2"),geom2=require("../../geometries/geom2"),fromFakePolygon=(e,o)=>{if(o.vertices.length<4)return null;const r=[],n=o.vertices.filter((e,o)=>e[2]>0&&(r.push(o),!0));if(2!==n.length)throw new Error("Assertion failed: fromFakePolygon: not enough points found");const t=n.map(o=>{const r=Math.round(o[0]/e)*e+0,n=Math.round(o[1]/e)*e+0;return vec2.fromValues(r,n)});if(vec2.equals(t[0],t[1]))return null;const s=r[1]-r[0];if(1!==s&&3!==s)throw new Error("Assertion failed: fromFakePolygon: unknown index ordering");return 1===s&&t.reverse(),t},fromFakePolygons=(e,o)=>{const r=o.map(o=>fromFakePolygon(e,o)).filter(e=>null!==e);return geom2.create(r)};module.exports=fromFakePolygons;
771
771
 
772
772
  },{"../../geometries/geom2":22,"../../maths/vec2":183}],258:[function(require,module,exports){
@@ -775,13 +775,13 @@ module.exports={intersect:require("./intersect"),scission:require("./scission"),
775
775
  },{"./intersect":259,"./scission":266,"./subtract":268,"./union":279}],259:[function(require,module,exports){
776
776
  const flatten=require("../../utils/flatten"),areAllShapesTheSameType=require("../../utils/areAllShapesTheSameType"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),intersectGeom2=require("./intersectGeom2"),intersectGeom3=require("./intersectGeom3"),intersect=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");if(!areAllShapesTheSameType(e))throw new Error("only intersect of the types are supported");const r=e[0];return geom2.isA(r)?intersectGeom2(e):geom3.isA(r)?intersectGeom3(e):r};module.exports=intersect;
777
777
 
778
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../utils/areAllShapesTheSameType":376,"../../utils/flatten":378,"./intersectGeom2":260,"./intersectGeom3":261}],260:[function(require,module,exports){
778
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../utils/areAllShapesTheSameType":377,"../../utils/flatten":379,"./intersectGeom2":260,"./intersectGeom3":261}],260:[function(require,module,exports){
779
779
  const flatten=require("../../utils/flatten"),geom3=require("../../geometries/geom3"),measureEpsilon=require("../../measurements/measureEpsilon"),fromFakePolygons=require("./fromFakePolygons"),to3DWalls=require("./to3DWalls"),intersectGeom3=require("./intersectGeom3"),intersect=(...e)=>{const o=(e=flatten(e)).map(e=>to3DWalls({z0:-1,z1:1},e)),r=intersectGeom3(o),t=measureEpsilon(r);return fromFakePolygons(t,geom3.toPolygons(r))};module.exports=intersect;
780
780
 
781
- },{"../../geometries/geom3":36,"../../measurements/measureEpsilon":255,"../../utils/flatten":378,"./fromFakePolygons":257,"./intersectGeom3":261,"./to3DWalls":272}],261:[function(require,module,exports){
781
+ },{"../../geometries/geom3":36,"../../measurements/measureEpsilon":255,"../../utils/flatten":379,"./fromFakePolygons":257,"./intersectGeom3":261,"./to3DWalls":272}],261:[function(require,module,exports){
782
782
  const flatten=require("../../utils/flatten"),retessellate=require("./retessellate"),intersectSub=require("./intersectGeom3Sub"),intersect=(...e)=>{let t=(e=flatten(e)).shift();return e.forEach(e=>{t=intersectSub(t,e)}),t=retessellate(t)};module.exports=intersect;
783
783
 
784
- },{"../../utils/flatten":378,"./intersectGeom3Sub":262,"./retessellate":265}],262:[function(require,module,exports){
784
+ },{"../../utils/flatten":379,"./intersectGeom3Sub":262,"./retessellate":265}],262:[function(require,module,exports){
785
785
  const geom3=require("../../geometries/geom3"),mayOverlap=require("./mayOverlap"),{Tree:Tree}=require("./trees"),intersectGeom3Sub=(e,o)=>{if(!mayOverlap(e,o))return geom3.create();const r=new Tree(geom3.toPolygons(e)),t=new Tree(geom3.toPolygons(o));r.invert(),t.clipTo(r),t.invert(),r.clipTo(t),t.clipTo(r),r.addPolygons(t.allPolygons()),r.invert();const n=r.allPolygons();return geom3.create(n)};module.exports=intersectGeom3Sub;
786
786
 
787
787
  },{"../../geometries/geom3":36,"./mayOverlap":263,"./trees":276}],263:[function(require,module,exports){
@@ -790,25 +790,25 @@ const{EPS:EPS}=require("../../maths/constants"),measureBoundingBox=require("../.
790
790
  },{"../../maths/constants":87,"../../measurements/measureBoundingBox":250}],264:[function(require,module,exports){
791
791
  const{EPS:EPS}=require("../../maths/constants"),line2=require("../../maths/line2"),vec2=require("../../maths/vec2"),OrthoNormalBasis=require("../../maths/OrthoNormalBasis"),interpolateBetween2DPointsForY=require("../../maths/utils/interpolateBetween2DPointsForY"),{insertSorted:insertSorted,fnNumberSort:fnNumberSort}=require("../../utils"),poly3=require("../../geometries/poly3"),reTesselateCoplanarPolygons=t=>{if(t.length<2)return t;const e=[],o=t.length,n=poly3.plane(t[0]),l=new OrthoNormalBasis(n),i=[],r=[],s={},f={},p={},h=1/EPS*10;for(let e=0;e<o;e++){const o=t[e];let n=[],c=o.vertices.length,g=-1;if(c>0){let t,i;for(let r=0;r<c;r++){let s=l.to2D(o.vertices[r]);const c=Math.floor(s[1]*h);let a;c in p?a=p[c]:c+1 in p?a=p[c+1]:c-1 in p?a=p[c-1]:(a=s[1],p[c]=s[1]),s=vec2.fromValues(s[0],a),n.push(s);const u=s[1];(0===r||u<t)&&(t=u,g=r),(0===r||u>i)&&(i=u),u in f||(f[u]={}),f[u][e]=!0}t>=i?(n=[],c=0,g=-1):(t in s||(s[t]=[]),s[t].push(e))}n.reverse(),g=c-g-1,i.push(n),r.push(g)}const c=[];for(const t in f)c.push(t);c.sort(fnNumberSort);let g=[],a=[];for(let t=0;t<c.length;t++){const o=[],p=c[t],h=Number(p),u=f[p];for(let t=0;t<g.length;++t){const e=g[t],o=e.polygonindex;if(u[o]){const n=i[o],l=n.length;let r=e.leftvertexindex,s=e.rightvertexindex;for(;;){let t=r+1;if(t>=l&&(t=0),n[t][1]!==h)break;r=t}let f=s-1;if(f<0&&(f=l-1),n[f][1]===h&&(s=f),r!==e.leftvertexindex&&r===s)g.splice(t,1),--t;else{e.leftvertexindex=r,e.rightvertexindex=s,e.topleft=n[r],e.topright=n[s];let t=r+1;t>=l&&(t=0),e.bottomleft=n[t];let o=s-1;o<0&&(o=l-1),e.bottomright=n[o]}}}let m;if(t>=c.length-1)g=[],m=null;else{const e=.5*(h+(m=Number(c[t+1]))),o=s[p];for(const t in o){const n=o[t],l=i[n],s=l.length,f=r[n];let p=f;for(;;){let t=p+1;if(t>=s&&(t=0),l[t][1]!==h)break;if(t===f)break;p=t}let c=f;for(;;){let t=c-1;if(t<0&&(t=s-1),l[t][1]!==h)break;if(t===p)break;c=t}let a=p+1;a>=s&&(a=0);let u=c-1;u<0&&(u=s-1);const m={polygonindex:n,leftvertexindex:p,rightvertexindex:c,topleft:l[p],topright:l[c],bottomleft:l[a],bottomright:l[u]};insertSorted(g,m,(t,o)=>{const n=interpolateBetween2DPointsForY(t.topleft,t.bottomleft,e),l=interpolateBetween2DPointsForY(o.topleft,o.bottomleft,e);return n>l?1:n<l?-1:0})}}for(const t in g){const e=g[t];let n=interpolateBetween2DPointsForY(e.topleft,e.bottomleft,h);const l=vec2.fromValues(n,h);n=interpolateBetween2DPointsForY(e.topright,e.bottomright,h);const i=vec2.fromValues(n,h);n=interpolateBetween2DPointsForY(e.topleft,e.bottomleft,m);const r=vec2.fromValues(n,m);n=interpolateBetween2DPointsForY(e.topright,e.bottomright,m);const s=vec2.fromValues(n,m),f={topleft:l,topright:i,bottomleft:r,bottomright:s,leftline:line2.fromPoints(line2.create(),l,r),rightline:line2.fromPoints(line2.create(),s,i)};if(o.length>0){const t=o[o.length-1],e=vec2.distance(f.topleft,t.topright),n=vec2.distance(f.bottomleft,t.bottomright);e<EPS&&n<EPS&&(f.topleft=t.topleft,f.leftline=t.leftline,f.bottomleft=t.bottomleft,o.splice(o.length-1,1))}o.push(f)}if(t>0){const t={},i={};for(let e=0;e<o.length;e++){const n=o[e];for(let e=0;e<a.length;e++)if(!i[e]){const o=a[e];if(vec2.distance(o.bottomleft,n.topleft)<EPS&&vec2.distance(o.bottomright,n.topright)<EPS){i[e]=!0;const l=line2.direction(n.leftline),r=line2.direction(o.leftline),s=l[0]-r[0],f=line2.direction(n.rightline),p=line2.direction(o.rightline),h=f[0]-p[0],c=Math.abs(s)<EPS,g=Math.abs(h)<EPS,a=g||h>=0;(c||s>=0)&&a&&(n.outpolygon=o.outpolygon,n.leftlinecontinues=c,n.rightlinecontinues=g,t[e]=!0);break}}}for(let o=0;o<a.length;o++)if(!t[o]){const t=a[o];t.outpolygon.rightpoints.push(t.bottomright),vec2.distance(t.bottomright,t.bottomleft)>EPS&&t.outpolygon.leftpoints.push(t.bottomleft),t.outpolygon.leftpoints.reverse();const i=t.outpolygon.rightpoints.concat(t.outpolygon.leftpoints).map(t=>l.to3D(t)),r=poly3.fromPointsAndPlane(i,n);r.vertices.length&&e.push(r)}}for(let t=0;t<o.length;t++){const e=o[t];e.outpolygon?(e.leftlinecontinues||e.outpolygon.leftpoints.push(e.topleft),e.rightlinecontinues||e.outpolygon.rightpoints.push(e.topright)):(e.outpolygon={leftpoints:[],rightpoints:[]},e.outpolygon.leftpoints.push(e.topleft),vec2.distance(e.topleft,e.topright)>EPS&&e.outpolygon.rightpoints.push(e.topright))}a=o}return e};module.exports=reTesselateCoplanarPolygons;
792
792
 
793
- },{"../../geometries/poly3":73,"../../maths/OrthoNormalBasis":86,"../../maths/constants":87,"../../maths/line2":98,"../../maths/utils/interpolateBetween2DPointsForY":163,"../../maths/vec2":183,"../../utils":380}],265:[function(require,module,exports){
793
+ },{"../../geometries/poly3":73,"../../maths/OrthoNormalBasis":86,"../../maths/constants":87,"../../maths/line2":98,"../../maths/utils/interpolateBetween2DPointsForY":163,"../../maths/vec2":183,"../../utils":381}],265:[function(require,module,exports){
794
794
  const geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),reTesselateCoplanarPolygons=require("./reTesselateCoplanarPolygons"),NEPS=1e-13,aboutEqualNormals=(e,o)=>Math.abs(e[0]-o[0])<=NEPS&&Math.abs(e[1]-o[1])<=NEPS&&Math.abs(e[2]-o[2])<=NEPS,coplanar=(e,o)=>Math.abs(e[3]-o[3])<1.5e-7&&aboutEqualNormals(e,o),retessellate=e=>{if(e.isRetesselated)return e;const o=geom3.toPolygons(e),a=[];o.forEach(e=>{const o=a.find(o=>coplanar(o[0],poly3.plane(e)));if(o){o[1].push(e)}else a.push([poly3.plane(e),[e]])});let s=[];a.forEach(e=>{const o=e[1],a=reTesselateCoplanarPolygons(o);s=s.concat(a)});const l=geom3.create(s);return l.isRetesselated=!0,l};module.exports=retessellate;
795
795
 
796
796
  },{"../../geometries/geom3":36,"../../geometries/poly3":73,"./reTesselateCoplanarPolygons":264}],266:[function(require,module,exports){
797
797
  const flatten=require("../../utils/flatten"),geom3=require("../../geometries/geom3"),scissionGeom3=require("./scissionGeom3"),scission=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const s=e.map(e=>geom3.isA(e)?scissionGeom3(e):e);return 1===s.length?s[0]:s};module.exports=scission;
798
798
 
799
- },{"../../geometries/geom3":36,"../../utils/flatten":378,"./scissionGeom3":267}],267:[function(require,module,exports){
799
+ },{"../../geometries/geom3":36,"../../utils/flatten":379,"./scissionGeom3":267}],267:[function(require,module,exports){
800
800
  const vec3=require("../../maths/vec3"),measureEpsilon=require("../../measurements/measureEpsilon"),geom3=require("../../geometries/geom3"),sortNb=e=>e.sort((e,s)=>e-s).filter((e,s,o)=>!s||e!==o[s-1]),insertMapping=(e,s,o)=>{const t=`${s}`,n=e.get(t);void 0===n?e.set(t,[o]):n.push(o)},findMapping=(e,s)=>{const o=`${s}`;return e.get(o)},scissionGeom3=e=>{const s=measureEpsilon(e),o=geom3.toPolygons(e),t=o.length,n=new Map,r=vec3.create();o.forEach((e,o)=>{e.vertices.forEach(e=>{insertMapping(n,vec3.snap(r,e,s),o)})});const c=o.map(e=>{let o=[];return e.vertices.forEach(e=>{o=o.concat(findMapping(n,vec3.snap(r,e,s)))}),{e:1,d:sortNb(o)}});n.clear();let i=0;const a=c.length;for(let e=0;e<a;e++){const s=c[e];if(s.e>0){const o=new Array(t);o[e]=!0;do{i=0,o.forEach((e,s)=>{const t=c[s];if(t.e>0){t.e=-1;for(let e=0;e<t.d.length;e++)o[t.d[e]]=!0;i++}})}while(i>0);s.indexes=o}}const p=[];for(let e=0;e<a;e++)if(c[e].indexes){const s=[];c[e].indexes.forEach((e,t)=>s.push(o[t])),p.push(geom3.create(s))}return p};module.exports=scissionGeom3;
801
801
 
802
802
  },{"../../geometries/geom3":36,"../../maths/vec3":214,"../../measurements/measureEpsilon":255}],268:[function(require,module,exports){
803
803
  const flatten=require("../../utils/flatten"),areAllShapesTheSameType=require("../../utils/areAllShapesTheSameType"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),subtractGeom2=require("./subtractGeom2"),subtractGeom3=require("./subtractGeom3"),subtract=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");if(!areAllShapesTheSameType(e))throw new Error("only subtract of the types are supported");const r=e[0];return geom2.isA(r)?subtractGeom2(e):geom3.isA(r)?subtractGeom3(e):r};module.exports=subtract;
804
804
 
805
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../utils/areAllShapesTheSameType":376,"../../utils/flatten":378,"./subtractGeom2":269,"./subtractGeom3":270}],269:[function(require,module,exports){
805
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../utils/areAllShapesTheSameType":377,"../../utils/flatten":379,"./subtractGeom2":269,"./subtractGeom3":270}],269:[function(require,module,exports){
806
806
  const flatten=require("../../utils/flatten"),geom3=require("../../geometries/geom3"),measureEpsilon=require("../../measurements/measureEpsilon"),fromFakePolygons=require("./fromFakePolygons"),to3DWalls=require("./to3DWalls"),subtractGeom3=require("./subtractGeom3"),subtract=(...e)=>{const o=(e=flatten(e)).map(e=>to3DWalls({z0:-1,z1:1},e)),r=subtractGeom3(o),t=measureEpsilon(r);return fromFakePolygons(t,geom3.toPolygons(r))};module.exports=subtract;
807
807
 
808
- },{"../../geometries/geom3":36,"../../measurements/measureEpsilon":255,"../../utils/flatten":378,"./fromFakePolygons":257,"./subtractGeom3":270,"./to3DWalls":272}],270:[function(require,module,exports){
808
+ },{"../../geometries/geom3":36,"../../measurements/measureEpsilon":255,"../../utils/flatten":379,"./fromFakePolygons":257,"./subtractGeom3":270,"./to3DWalls":272}],270:[function(require,module,exports){
809
809
  const flatten=require("../../utils/flatten"),retessellate=require("./retessellate"),subtractSub=require("./subtractGeom3Sub"),subtract=(...t)=>{let e=(t=flatten(t)).shift();return t.forEach(t=>{e=subtractSub(e,t)}),e=retessellate(e)};module.exports=subtract;
810
810
 
811
- },{"../../utils/flatten":378,"./retessellate":265,"./subtractGeom3Sub":271}],271:[function(require,module,exports){
811
+ },{"../../utils/flatten":379,"./retessellate":265,"./subtractGeom3Sub":271}],271:[function(require,module,exports){
812
812
  const geom3=require("../../geometries/geom3"),mayOverlap=require("./mayOverlap"),{Tree:Tree}=require("./trees"),subtractGeom3Sub=(e,o)=>{if(!mayOverlap(e,o))return geom3.clone(e);const r=new Tree(geom3.toPolygons(e)),t=new Tree(geom3.toPolygons(o));r.invert(),r.clipTo(t),t.clipTo(r,!0),r.addPolygons(t.allPolygons()),r.invert();const l=r.allPolygons();return geom3.create(l)};module.exports=subtractGeom3Sub;
813
813
 
814
814
  },{"../../geometries/geom3":36,"./mayOverlap":263,"./trees":276}],272:[function(require,module,exports){
@@ -835,19 +835,19 @@ const{EPS:EPS}=require("../../../maths/constants"),plane=require("../../../maths
835
835
  },{"../../../geometries/poly3":73,"../../../maths/constants":87,"../../../maths/plane":156,"../../../maths/vec3":214,"./splitLineSegmentByPlane":277}],279:[function(require,module,exports){
836
836
  const flatten=require("../../utils/flatten"),areAllShapesTheSameType=require("../../utils/areAllShapesTheSameType"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),unionGeom2=require("./unionGeom2"),unionGeom3=require("./unionGeom3"),union=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");if(!areAllShapesTheSameType(e))throw new Error("only unions of the same type are supported");const o=e[0];return geom2.isA(o)?unionGeom2(e):geom3.isA(o)?unionGeom3(e):o};module.exports=union;
837
837
 
838
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../utils/areAllShapesTheSameType":376,"../../utils/flatten":378,"./unionGeom2":280,"./unionGeom3":281}],280:[function(require,module,exports){
838
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../utils/areAllShapesTheSameType":377,"../../utils/flatten":379,"./unionGeom2":280,"./unionGeom3":281}],280:[function(require,module,exports){
839
839
  const flatten=require("../../utils/flatten"),geom3=require("../../geometries/geom3"),measureEpsilon=require("../../measurements/measureEpsilon"),fromFakePolygons=require("./fromFakePolygons"),to3DWalls=require("./to3DWalls"),unionGeom3=require("./unionGeom3"),union=(...e)=>{const o=(e=flatten(e)).map(e=>to3DWalls({z0:-1,z1:1},e)),n=unionGeom3(o),r=measureEpsilon(n);return fromFakePolygons(r,geom3.toPolygons(n))};module.exports=union;
840
840
 
841
- },{"../../geometries/geom3":36,"../../measurements/measureEpsilon":255,"../../utils/flatten":378,"./fromFakePolygons":257,"./to3DWalls":272,"./unionGeom3":281}],281:[function(require,module,exports){
841
+ },{"../../geometries/geom3":36,"../../measurements/measureEpsilon":255,"../../utils/flatten":379,"./fromFakePolygons":257,"./to3DWalls":272,"./unionGeom3":281}],281:[function(require,module,exports){
842
842
  const flatten=require("../../utils/flatten"),retessellate=require("./retessellate"),unionSub=require("./unionGeom3Sub"),union=(...e)=>{let t;for(e=flatten(e),t=1;t<e.length;t+=2)e.push(unionSub(e[t-1],e[t]));let n=e[t-1];return n=retessellate(n)};module.exports=union;
843
843
 
844
- },{"../../utils/flatten":378,"./retessellate":265,"./unionGeom3Sub":282}],282:[function(require,module,exports){
844
+ },{"../../utils/flatten":379,"./retessellate":265,"./unionGeom3Sub":282}],282:[function(require,module,exports){
845
845
  const geom3=require("../../geometries/geom3"),mayOverlap=require("./mayOverlap"),{Tree:Tree}=require("./trees"),unionSub=(e,o)=>{if(!mayOverlap(e,o))return unionForNonIntersecting(e,o);const n=new Tree(geom3.toPolygons(e)),r=new Tree(geom3.toPolygons(o));n.clipTo(r,!1),r.clipTo(n),r.invert(),r.clipTo(n),r.invert();const t=n.allPolygons().concat(r.allPolygons());return geom3.create(t)},unionForNonIntersecting=(e,o)=>{let n=geom3.toPolygons(e);return n=n.concat(geom3.toPolygons(o)),geom3.create(n)};module.exports=unionSub;
846
846
 
847
847
  },{"../../geometries/geom3":36,"./mayOverlap":263,"./trees":276}],283:[function(require,module,exports){
848
848
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),expandGeom2=require("./expandGeom2"),expandGeom3=require("./expandGeom3"),expandPath2=require("./expandPath2"),expand=(e,...r)=>{if(0===(r=flatten(r)).length)throw new Error("wrong number of arguments");const t=r.map(r=>path2.isA(r)?expandPath2(e,r):geom2.isA(r)?expandGeom2(e,r):geom3.isA(r)?expandGeom3(e,r):r);return 1===t.length?t[0]:t};module.exports=expand;
849
849
 
850
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../utils/flatten":378,"./expandGeom2":284,"./expandGeom3":285,"./expandPath2":286}],284:[function(require,module,exports){
850
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../utils/flatten":379,"./expandGeom2":284,"./expandGeom3":285,"./expandPath2":286}],284:[function(require,module,exports){
851
851
  const geom2=require("../../geometries/geom2"),offsetFromPoints=require("./offsetFromPoints"),expandGeom2=(e,o)=>{const{delta:r,corners:s,segments:t}=Object.assign({},{delta:1,corners:"edge",segments:16},e);if("edge"!==s&&"chamfer"!==s&&"round"!==s)throw new Error('corners must be "edge", "chamfer", or "round"');const n=geom2.toOutlines(o).map(o=>offsetFromPoints(e={delta:r,corners:s,closed:!0,segments:t},o)).reduce((e,o)=>e.concat(geom2.toSides(geom2.fromPoints(o))),[]);return geom2.create(n)};module.exports=expandGeom2;
852
852
 
853
853
  },{"../../geometries/geom2":22,"./offsetFromPoints":291}],285:[function(require,module,exports){
@@ -859,7 +859,7 @@ const area=require("../../maths/utils/area"),vec2=require("../../maths/vec2"),ge
859
859
  },{"../../geometries/geom2":22,"../../geometries/path2":57,"../../maths/utils/area":161,"../../maths/vec2":183,"./offsetFromPoints":291}],287:[function(require,module,exports){
860
860
  const{EPS:EPS}=require("../../maths/constants"),mat4=require("../../maths/mat4"),vec3=require("../../maths/vec3"),fnNumberSort=require("../../utils/fnNumberSort"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),sphere=require("../../primitives/sphere"),retessellate=require("../booleans/retessellate"),unionGeom3Sub=require("../booleans/unionGeom3Sub"),extrudePolygon=require("./extrudePolygon"),mapPlaneToVertex=(e,t,o)=>{const n=e.findIndex(e=>vec3.equals(e[0],t));if(n<0){const n=[t,[o]];return e.push(n),e.length}return e[n][1].push(o),n},mapPlaneToEdge=(e,t,o)=>{const n=e.findIndex(e=>vec3.equals(e[0],t[0])&&vec3.equals(e[1],t[1])||vec3.equals(e[0],t[1])&&vec3.equals(e[1],t[0]));if(n<0){const n=[t,[o]];return e.push(n),e.length}return e[n][1].push(o),n},addUniqueAngle=(e,t)=>{const o=e.findIndex(e=>e===t);return o<0?(e.push(t),e.length):o},expandShell=(e,t)=>{const{delta:o,segments:n}=Object.assign({},{delta:1,segments:12},e);let s=geom3.create();const r=[],c=[],a=vec3.create(),l=vec3.create();return geom3.toPolygons(t).forEach((e,t)=>{const n=vec3.scale(vec3.create(),poly3.plane(e),2*o),a=poly3.transform(mat4.fromTranslation(mat4.create(),vec3.scale(vec3.create(),n,-.5)),e),l=extrudePolygon(n,a);s=unionGeom3Sub(s,l);const u=e.vertices;for(let t=0;t<u.length;t++){mapPlaneToVertex(r,u[t],poly3.plane(e));const o=(t+1)%u.length,n=[u[t],u[o]];mapPlaneToEdge(c,n,poly3.plane(e))}}),c.forEach(e=>{const t=e[0],r=e[1],c=t[0],u=t[1],i=vec3.subtract(vec3.create(),u,c);vec3.normalize(i,i);const h=r[0],m=vec3.cross(vec3.create(),h,i);let v=[];for(let e=0;e<n;e++)addUniqueAngle(v,e*Math.PI*2/n);for(let e=0,t=r.length;e<t;e++){const t=r[e],o=vec3.dot(m,t),n=vec3.dot(h,t);let s=Math.atan2(o,n);s<0&&(s+=2*Math.PI),addUniqueAngle(v,s),(s=Math.atan2(-o,-n))<0&&(s+=2*Math.PI),addUniqueAngle(v,s)}const d=(v=v.sort(fnNumberSort)).length;let p,g;const f=[],q=[],P=[];for(let e=-1;e<d;e++){const t=v[e<0?e+d:e],n=Math.sin(t),s=Math.cos(t);vec3.scale(a,h,s*o),vec3.scale(l,m,n*o),vec3.add(a,a,l);const r=vec3.add(vec3.create(),c,a),i=vec3.add(vec3.create(),u,a);let y=!1;if(e>=0&&vec3.distance(r,p)<EPS&&(y=!0),!y){if(e>=0){f.push(r),q.push(i);const e=[g,i,r,p],t=poly3.fromPoints(e);P.push(t)}p=r,g=i}}q.reverse(),P.push(poly3.fromPoints(f)),P.push(poly3.fromPoints(q));const y=geom3.create(P);s=unionGeom3Sub(s,y)}),r.forEach(e=>{const t=e[0],r=e[1],c=r[0];let u=null,i=0;for(let e=1;e<r.length;e++){const t=r[e],o=vec3.cross(a,c,t),n=vec3.length(o);n>.05&&n>i&&(i=n,u=t)}u||(u=vec3.orthogonal(a,c));const h=vec3.cross(a,c,u);vec3.normalize(h,h);const m=vec3.cross(l,h,c),v=sphere({center:[t[0],t[1],t[2]],radius:o,segments:n,axes:[c,h,m]});s=unionGeom3Sub(s,v)}),retessellate(s)};module.exports=expandShell;
861
861
 
862
- },{"../../geometries/geom3":36,"../../geometries/poly3":73,"../../maths/constants":87,"../../maths/mat4":137,"../../maths/vec3":214,"../../primitives/sphere":367,"../../utils/fnNumberSort":379,"../booleans/retessellate":265,"../booleans/unionGeom3Sub":282,"./extrudePolygon":288}],288:[function(require,module,exports){
862
+ },{"../../geometries/geom3":36,"../../geometries/poly3":73,"../../maths/constants":87,"../../maths/mat4":137,"../../maths/vec3":214,"../../primitives/sphere":367,"../../utils/fnNumberSort":380,"../booleans/retessellate":265,"../booleans/unionGeom3Sub":282,"./extrudePolygon":288}],288:[function(require,module,exports){
863
863
  const mat4=require("../../maths/mat4"),vec3=require("../../maths/vec3"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),extrudePolygon=(e,t)=>{vec3.dot(poly3.plane(t),e)>0&&(t=poly3.invert(t));const r=[t],o=poly3.transform(mat4.fromTranslation(mat4.create(),e),t),s=t.vertices.length;for(let e=0;e<s;e++){const i=[],m=e<s-1?e+1:0;i.push(t.vertices[e]),i.push(o.vertices[e]),i.push(o.vertices[m]),i.push(t.vertices[m]);const n=poly3.fromPoints(i);r.push(n)}return r.push(poly3.invert(o)),geom3.create(r)};module.exports=extrudePolygon;
864
864
 
865
865
  },{"../../geometries/geom3":36,"../../geometries/poly3":73,"../../maths/mat4":137,"../../maths/vec3":214}],289:[function(require,module,exports){
@@ -868,7 +868,7 @@ module.exports={expand:require("./expand"),offset:require("./offset")};
868
868
  },{"./expand":283,"./offset":290}],290:[function(require,module,exports){
869
869
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),path2=require("../../geometries/path2"),offsetGeom2=require("./offsetGeom2"),offsetPath2=require("./offsetPath2"),offset=(e,...t)=>{if(0===(t=flatten(t)).length)throw new Error("wrong number of arguments");const o=t.map(t=>path2.isA(t)?offsetPath2(e,t):geom2.isA(t)?offsetGeom2(e,t):t);return 1===o.length?o[0]:o};module.exports=offset;
870
870
 
871
- },{"../../geometries/geom2":22,"../../geometries/path2":57,"../../utils/flatten":378,"./offsetGeom2":292,"./offsetPath2":293}],291:[function(require,module,exports){
871
+ },{"../../geometries/geom2":22,"../../geometries/path2":57,"../../utils/flatten":379,"./offsetGeom2":292,"./offsetPath2":293}],291:[function(require,module,exports){
872
872
  const{EPS:EPS}=require("../../maths/constants"),intersect=require("../../maths/utils/intersect"),line2=require("../../maths/line2"),vec2=require("../../maths/vec2"),area=require("../../maths/utils/area"),offsetFromPoints=(e,s)=>{let{delta:t,corners:c,closed:n,segments:a}=Object.assign({},{delta:1,corners:"edge",closed:!1,segments:16},e);if(Math.abs(t)<EPS)return s;let l=e.closed?area(s):1;0===l&&(l=1);const r=l>0&&t>=0||l<0&&t<0;t=Math.abs(t);let i=null;const o=[],u=[],f=vec2.create(),v=s.length;for(let e=0;e<v;e++){const c=(e+1)%v,a=s[e],l=s[c];r?vec2.subtract(f,a,l):vec2.subtract(f,l,a),vec2.normal(f,f),vec2.normalize(f,f),vec2.scale(f,f,t);const h=vec2.add(vec2.create(),a,f),d=vec2.add(vec2.create(),l,f),m=[h,d];if(null!=i&&(n||!n&&0!==c)){const e=intersect(i[0],i[1],m[0],m[1]);e?(o.pop(),m[0]=e):u.push({c:a,s0:i,s1:m})}i=[h,d],(0!==c||n)&&(o.push(m[0]),o.push(m[1]))}if(n&&null!=i){const e=o[0],t=o[1],c=intersect(i[0],i[1],e,t);if(c)o[0]=c,o.pop();else{const c=s[0],n=[e,t];u.push({c:c,s0:i,s1:n})}}if("edge"===c){const e=line2.create(),s=line2.create();u.forEach(t=>{line2.fromPoints(e,t.s0[0],t.s0[1]),line2.fromPoints(s,t.s1[0],t.s1[1]);const c=line2.intersectPointOfLines(e,s);if(Number.isFinite(c[0])&&Number.isFinite(c[1])){const e=t.s0[1];let s=o.findIndex(s=>vec2.equals(e,s));s=(s+1)%o.length,o.splice(s,0,c)}else{const e=t.s1[0],s=o.findIndex(s=>vec2.equals(e,s));o.splice(s,1)}})}if("round"===c){let e=Math.floor(a/4);const s=vec2.create();u.forEach(c=>{let n=vec2.angle(vec2.subtract(s,c.s1[0],c.c));if(n-=vec2.angle(vec2.subtract(s,c.s0[1],c.c)),r&&n<0&&(n+=Math.PI)<0&&(n+=Math.PI),!r&&n>0&&(n-=Math.PI)>0&&(n-=Math.PI),0!==n){const l=n/(e=Math.floor(a*(Math.abs(n)/(2*Math.PI)))),r=vec2.angle(vec2.subtract(s,c.s0[1],c.c)),i=[];for(let s=1;s<e;s++){const e=r+l*s,n=vec2.fromAngleRadians(vec2.create(),e);vec2.scale(n,n,t),vec2.add(n,n,c.c),i.push(n)}if(i.length>0){const e=c.s0[1];let s=o.findIndex(s=>vec2.equals(e,s));s=(s+1)%o.length,o.splice(s,0,...i)}}else{const e=c.s1[0],s=o.findIndex(s=>vec2.equals(e,s));o.splice(s,1)}})}return o};module.exports=offsetFromPoints;
873
873
 
874
874
  },{"../../maths/constants":87,"../../maths/line2":98,"../../maths/utils/area":161,"../../maths/utils/intersect":164,"../../maths/vec2":183}],292:[function(require,module,exports){
@@ -883,13 +883,13 @@ const mat4=require("../../maths/mat4"),geom2=require("../../geometries/geom2"),g
883
883
  },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/poly3":73,"../../maths/mat4":137,"./extrudeWalls":301,"./slice":310}],295:[function(require,module,exports){
884
884
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),extrudeLinearGeom2=require("./extrudeLinearGeom2"),extrudeLinear=(e,...t)=>{const{height:r,twistAngle:n,twistSteps:i}=Object.assign({},{height:1,twistAngle:0,twistSteps:1},e);if(0===(t=flatten(t)).length)throw new Error("wrong number of arguments");e={offset:[0,0,r],twistAngle:n,twistSteps:i};const s=t.map(t=>geom2.isA(t)?extrudeLinearGeom2(e,t):t);return 1===s.length?s[0]:s};module.exports=extrudeLinear;
885
885
 
886
- },{"../../geometries/geom2":22,"../../utils/flatten":378,"./extrudeLinearGeom2":296}],296:[function(require,module,exports){
886
+ },{"../../geometries/geom2":22,"../../utils/flatten":379,"./extrudeLinearGeom2":296}],296:[function(require,module,exports){
887
887
  const mat4=require("../../maths/mat4"),vec3=require("../../maths/vec3"),geom2=require("../../geometries/geom2"),slice=require("./slice"),extrudeFromSlices=require("./extrudeFromSlices"),extrudeGeom2=(e,t)=>{let{offset:r,twistAngle:s,twistSteps:o}=Object.assign({},{offset:[0,0,1],twistAngle:0,twistSteps:12},e);if(o<1)throw new Error("twistSteps must be 1 or more");0===s&&(o=1);const c=vec3.clone(r),i=geom2.toSides(t);if(0===i.length)throw new Error("the given geometry cannot be empty");const m=slice.fromSides(i);c[2]<0&&slice.reverse(m,m);const a=mat4.create();return extrudeFromSlices(e={numberOfSlices:o+1,capStart:!0,capEnd:!0,callback:(e,t,r)=>{const i=t/o*s,m=vec3.scale(vec3.create(),c,t/o);return mat4.multiply(a,mat4.fromZRotation(a,i),mat4.fromTranslation(mat4.create(),m)),slice.transform(a,r)}},m)};module.exports=extrudeGeom2;
888
888
 
889
889
  },{"../../geometries/geom2":22,"../../maths/mat4":137,"../../maths/vec3":214,"./extrudeFromSlices":294,"./slice":310}],297:[function(require,module,exports){
890
890
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),path2=require("../../geometries/path2"),extrudeRectangularPath2=require("./extrudeRectangularPath2"),extrudeRectangularGeom2=require("./extrudeRectangularGeom2"),extrudeRectangular=(e,...t)=>{const{size:r,height:a}=Object.assign({},{size:1,height:1},e);if(0===(t=flatten(t)).length)throw new Error("wrong number of arguments");if(r<=0)throw new Error("size must be positive");if(a<=0)throw new Error("height must be positive");const u=t.map(t=>path2.isA(t)?extrudeRectangularPath2(e,t):geom2.isA(t)?extrudeRectangularGeom2(e,t):t);return 1===u.length?u[0]:u};module.exports=extrudeRectangular;
891
891
 
892
- },{"../../geometries/geom2":22,"../../geometries/path2":57,"../../utils/flatten":378,"./extrudeRectangularGeom2":298,"./extrudeRectangularPath2":299}],298:[function(require,module,exports){
892
+ },{"../../geometries/geom2":22,"../../geometries/path2":57,"../../utils/flatten":379,"./extrudeRectangularGeom2":298,"./extrudeRectangularPath2":299}],298:[function(require,module,exports){
893
893
  const{area:area}=require("../../maths/utils"),geom2=require("../../geometries/geom2"),path2=require("../../geometries/path2"),expand=require("../expansions/expand"),extrudeLinearGeom2=require("./extrudeLinearGeom2"),extrudeRectangularGeom2=(e,r)=>{const{size:t,height:o}=Object.assign({},{size:1,height:1},e);e.delta=t,e.offset=[0,0,o];const a=geom2.toOutlines(r);if(0===a.length)throw new Error("the given geometry cannot be empty");const n=a.map(r=>(area(r)<0&&r.reverse(),expand(e,path2.fromPoints({closed:!0},r)))).reduce((e,r)=>e.concat(geom2.toSides(r)),[]),i=geom2.create(n);return extrudeLinearGeom2(e,i)};module.exports=extrudeRectangularGeom2;
894
894
 
895
895
  },{"../../geometries/geom2":22,"../../geometries/path2":57,"../../maths/utils":162,"../expansions/expand":283,"./extrudeLinearGeom2":296}],299:[function(require,module,exports){
@@ -907,7 +907,7 @@ module.exports={extrudeFromSlices:require("./extrudeFromSlices"),extrudeLinear:r
907
907
  },{"./extrudeFromSlices":294,"./extrudeLinear":295,"./extrudeRectangular":297,"./extrudeRotate":300,"./project":303,"./slice":310}],303:[function(require,module,exports){
908
908
  const flatten=require("../../utils/flatten"),aboutEqualNormals=require("../../maths/utils/aboutEqualNormals"),plane=require("../../maths/plane"),mat4=require("../../maths/mat4"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),measureEpsilon=require("../../measurements/measureEpsilon"),unionGeom2=require("../booleans/unionGeom2"),unionGeom3=require("../booleans/unionGeom3"),projectGeom3=(e,o)=>{const r=plane.fromNormalAndPoint(plane.create(),e.axis,e.origin);if(Number.isNaN(r[0])||Number.isNaN(r[1])||Number.isNaN(r[2])||Number.isNaN(r[3]))throw new Error("project: invalid axis or origin");const t=measureEpsilon(o),n=t*t*Math.sqrt(3)/4;if(0===t)return geom2.create();const a=geom3.toPolygons(o),i=[];for(let e=0;e<a.length;e++){const o=a[e].vertices.map(e=>plane.projectionOfPoint(r,e)),t=poly3.create(o);if(poly3.measureArea(t)<n)continue;const s=poly3.plane(t);aboutEqualNormals(r,s)&&i.push(t)}let s=geom3.create(i);if(s=unionGeom3(s,s),!aboutEqualNormals(r,[0,0,1])){const e=mat4.fromVectorRotation(mat4.create(),r,[0,0,1]);s=geom3.transform(e,s)}const m=geom3.toPolygons(s).map(e=>geom2.fromPoints(poly3.toPoints(e)));return s=unionGeom2(m)},project=(e,...o)=>{const{axis:r,origin:t}=Object.assign({},{axis:[0,0,1],origin:[0,0,0]},e);if(0===(o=flatten(o)).length)throw new Error("wrong number of arguments");e={axis:r,origin:t};const n=o.map(o=>geom3.isA(o)?projectGeom3(e,o):o);return 1===n.length?n[0]:n};module.exports=project;
909
909
 
910
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/poly3":73,"../../maths/mat4":137,"../../maths/plane":156,"../../maths/utils/aboutEqualNormals":160,"../../measurements/measureEpsilon":255,"../../utils/flatten":378,"../booleans/unionGeom2":280,"../booleans/unionGeom3":281}],304:[function(require,module,exports){
910
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/poly3":73,"../../maths/mat4":137,"../../maths/plane":156,"../../maths/utils/aboutEqualNormals":160,"../../measurements/measureEpsilon":255,"../../utils/flatten":379,"../booleans/unionGeom2":280,"../booleans/unionGeom3":281}],304:[function(require,module,exports){
911
911
  const plane=require("../../../maths/plane"),vec3=require("../../../maths/vec3"),calculatePlane=e=>{const c=e.edges;if(c.length<3)throw new Error("slices must have 3 or more edges to calculate a plane");const a=c.reduce((e,c)=>vec3.add(vec3.create(),e,c[0]),vec3.create());let t;vec3.scale(a,a,1/c.length);let l=0;c.forEach(e=>{const c=vec3.squaredDistance(a,e[0]);c>l&&(t=e,l=c)});const r=c.find(e=>vec3.equals(e[1],t[0]));return plane.fromPoints(plane.create(),r[0],t[0],t[1])};module.exports=calculatePlane;
912
912
 
913
913
  },{"../../../maths/plane":156,"../../../maths/vec3":214}],305:[function(require,module,exports){
@@ -949,19 +949,19 @@ const vec3=require("../../../maths/vec3"),create=require("./create"),transform=(
949
949
  },{"../../../maths/vec3":214,"./create":306}],317:[function(require,module,exports){
950
950
  const flatten=require("../../utils/flatten"),areAllShapesTheSameType=require("../../utils/areAllShapesTheSameType"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),hullPath2=require("./hullPath2"),hullGeom2=require("./hullGeom2"),hullGeom3=require("./hullGeom3"),hull=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");if(!areAllShapesTheSameType(e))throw new Error("only hulls of the same type are supported");const l=e[0];return path2.isA(l)?hullPath2(e):geom2.isA(l)?hullGeom2(e):geom3.isA(l)?hullGeom3(e):l};module.exports=hull;
951
951
 
952
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../utils/areAllShapesTheSameType":376,"../../utils/flatten":378,"./hullGeom2":319,"./hullGeom3":320,"./hullPath2":321}],318:[function(require,module,exports){
952
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../utils/areAllShapesTheSameType":377,"../../utils/flatten":379,"./hullGeom2":319,"./hullGeom3":320,"./hullPath2":321}],318:[function(require,module,exports){
953
953
  const flatten=require("../../utils/flatten"),union=require("../booleans/union"),hull=require("./hull"),hullChain=(...n)=>{if((n=flatten(n)).length<2)throw new Error("wrong number of arguments");const e=[];for(let l=1;l<n.length;l++)e.push(hull(n[l-1],n[l]));return union(e)};module.exports=hullChain;
954
954
 
955
- },{"../../utils/flatten":378,"../booleans/union":279,"./hull":317}],319:[function(require,module,exports){
955
+ },{"../../utils/flatten":379,"../booleans/union":279,"./hull":317}],319:[function(require,module,exports){
956
956
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),hullPoints2=require("./hullPoints2"),hullGeom2=(...e)=>{e=flatten(e);const t=[],o=new Map;for(let l=0;l<e.length;l++){const n=geom2.toSides(e[l]);for(let e=0;e<n.length;e++){const l=n[e][0],s=`${l[0]},${l[1]}`;o.has(s)||(t.push(l),o.set(s,!0))}}o.clear();const l=hullPoints2(t);return l.length<3?geom2.create():geom2.fromPoints(l)};module.exports=hullGeom2;
957
957
 
958
- },{"../../geometries/geom2":22,"../../utils/flatten":378,"./hullPoints2":322}],320:[function(require,module,exports){
958
+ },{"../../geometries/geom2":22,"../../utils/flatten":379,"./hullPoints2":322}],320:[function(require,module,exports){
959
959
  const flatten=require("../../utils/flatten"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),quickhull=require("./quickhull"),hullGeom3=(...e)=>{if(1===(e=flatten(e)).length)return e[0];const t=[],l=new Map;for(let o=0;o<e.length;++o){const r=geom3.toPolygons(e[o]);for(let e=0;e<r.length;++e){const o=r[e].vertices;for(let e=0;e<o.length;++e){const r=`${o[e]}`;l.has(r)||(t.push(o[e]),l.set(r,!0))}}}l.clear();const o=quickhull(t,{skipTriangulation:!0}).map(e=>{const l=e.map(e=>t[e]);return poly3.create(l)});return geom3.create(o)};module.exports=hullGeom3;
960
960
 
961
- },{"../../geometries/geom3":36,"../../geometries/poly3":73,"../../utils/flatten":378,"./quickhull":330}],321:[function(require,module,exports){
961
+ },{"../../geometries/geom3":36,"../../geometries/poly3":73,"../../utils/flatten":379,"./quickhull":330}],321:[function(require,module,exports){
962
962
  const flatten=require("../../utils/flatten"),vec2=require("../../maths/vec2"),path2=require("../../geometries/path2"),hullPoints2=require("./hullPoints2"),hullPath2=(...t)=>{t=flatten(t);const e=[];t.forEach(t=>{path2.toPoints(t).forEach(t=>{e.findIndex(e=>vec2.equals(e,t))<0&&e.push(t)})});const l=hullPoints2(e);return path2.fromPoints({closed:!0},l)};module.exports=hullPath2;
963
963
 
964
- },{"../../geometries/path2":57,"../../maths/vec2":183,"../../utils/flatten":378,"./hullPoints2":322}],322:[function(require,module,exports){
964
+ },{"../../geometries/path2":57,"../../maths/vec2":183,"../../utils/flatten":379,"./hullPoints2":322}],322:[function(require,module,exports){
965
965
  const vec2=require("../../maths/vec2"),angleBetweenPoints=(e,t)=>Math.atan2(t[1]-e[1],t[0]-e[0]),compareIndex=(e,t)=>e.angle<t.angle?-1:e.angle>t.angle?1:e.distance<t.distance?-1:e.distance>t.distance?1:0,compute=e=>{if(e.length<3)return e;let t=0;e.forEach((n,r)=>{const a=e[t];n[1]===a[1]?n[0]<a[0]&&(t=r):n[1]<a[1]&&(t=r)});const n=[];let r=0,a=0;for(let l=0;l<e.length;l++)l!==t&&((r=angleBetweenPoints(e[t],e[l]))<0&&(r+=Math.PI),a=vec2.squaredDistance(e[t],e[l]),n.push({index:l,angle:r,distance:a}));n.sort((e,t)=>compareIndex(e,t));const l=new Array(e.length+1);let o=2;for(let r=0;r<e.length;r++)r!==t&&(l[o]=n[o-2].index,o++);l[0]=l[e.length],l[1]=t;const s=(t,n,r)=>(e[n][0]-e[t][0])*(e[r][1]-e[t][1])-(e[n][1]-e[t][1])*(e[r][0]-e[t][0]);let c,i=2;for(let t=3;t<=e.length;t++){for(;s(l[i-1],l[i],l[t])<Number.EPSILON;)i--;i++,c=l[t],l[t]=l[i],l[i]=c}const g=new Array(i);for(let e=0;e<i;e++)g[e]=l[e+1];return g},hullPoints2=e=>{const t=compute(e);let n=[];return Array.isArray(t)&&(n=t.map(t=>e[t])),n};module.exports=hullPoints2;
966
966
 
967
967
  },{"../../maths/vec2":183}],323:[function(require,module,exports){
@@ -997,7 +997,7 @@ const vec3=require("../../maths/vec3"),line3=require("../../maths/line3"),poly3=
997
997
  },{"../../geometries/poly3":73,"../../maths/line3":115,"../../maths/vec3":214}],333:[function(require,module,exports){
998
998
  const flatten=require("../../utils/flatten"),measureEpsilon=require("../../measurements/measureEpsilon"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),snapPolygons=require("./snapPolygons"),mergePolygons=require("./mergePolygons"),insertTjunctions=require("./insertTjunctions"),triangulatePolygons=require("./triangulatePolygons"),repairTjunctions=require("./repairTjunctions"),generalizePath2=(e,r)=>r,generalizeGeom2=(e,r)=>r,generalizeGeom3=(e,r)=>{const{snap:n,simplify:i,triangulate:o,repair:t}=Object.assign({},{snap:!1,simplify:!1,triangulate:!1,repair:!1},e),s=measureEpsilon(r);let a=geom3.toPolygons(r);n&&(a=snapPolygons(s,a)),i&&(a=mergePolygons(s,a)),o&&(a=insertTjunctions(a),a=triangulatePolygons(s,a)),t&&(a=repairTjunctions(s,a));const g=Object.assign({},r);return g.polygons=a,g},generalize=(e,...r)=>{if(0===(r=flatten(r)).length)throw new Error("wrong number of arguments");const n=r.map((r,n)=>{if(path2.isA(r))return generalizePath2(0,r);if(geom2.isA(r))return generalizeGeom2(0,r);if(geom3.isA(r))return generalizeGeom3(e,r);throw new Error("invalid geometry")});return 1===n.length?n[0]:n};module.exports=generalize;
999
999
 
1000
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../measurements/measureEpsilon":255,"../../utils/flatten":378,"./insertTjunctions":335,"./mergePolygons":336,"./repairTjunctions":337,"./snapPolygons":339,"./triangulatePolygons":340}],334:[function(require,module,exports){
1000
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../measurements/measureEpsilon":255,"../../utils/flatten":379,"./insertTjunctions":335,"./mergePolygons":336,"./repairTjunctions":337,"./snapPolygons":339,"./triangulatePolygons":340}],334:[function(require,module,exports){
1001
1001
  module.exports={generalize:require("./generalize"),snap:require("./snap")};
1002
1002
 
1003
1003
  },{"./generalize":333,"./snap":338}],335:[function(require,module,exports){
@@ -1012,8 +1012,8 @@ const{polygonsToEdges:polygonsToEdges,edgesToPolygons:edgesToPolygons,cullOpenEd
1012
1012
  },{"./edges":332}],338:[function(require,module,exports){
1013
1013
  const flatten=require("../../utils/flatten"),vec2=require("../../maths/vec2"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),measureEpsilon=require("../../measurements/measureEpsilon"),snapPolygons=require("./snapPolygons"),snapPath2=e=>{const s=measureEpsilon(e),r=path2.toPoints(e).map(e=>vec2.snap(vec2.create(),e,s));return path2.create(r)},snapGeom2=e=>{const s=measureEpsilon(e);let r=geom2.toSides(e).map(e=>[vec2.snap(vec2.create(),e[0],s),vec2.snap(vec2.create(),e[1],s)]);return r=r.filter(e=>!vec2.equals(e[0],e[1])),geom2.create(r)},snapGeom3=e=>{const s=measureEpsilon(e),r=geom3.toPolygons(e),o=snapPolygons(s,r);return geom3.create(o)},snap=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const s=e.map(e=>path2.isA(e)?snapPath2(e):geom2.isA(e)?snapGeom2(e):geom3.isA(e)?snapGeom3(e):e);return 1===s.length?s[0]:s};module.exports=snap;
1014
1014
 
1015
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/vec2":183,"../../measurements/measureEpsilon":255,"../../utils/flatten":378,"./snapPolygons":339}],339:[function(require,module,exports){
1016
- const vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),isValidPoly3=(e,o)=>{const r=poly3.measureArea(o);return Number.isFinite(r)&&r>e},snapPolygons=(e,o)=>{let r=o.map(o=>{const r=o.vertices.map(o=>vec3.snap(vec3.create(),o,e)),t=[];for(let e=0;e<r.length;e++){const o=(e+1)%r.length;vec3.equals(r[e],r[o])||t.push(r[e])}const s=poly3.create(t);return o.color&&(s.color=o.color),s});const t=e*e*Math.sqrt(3)/4;return r=r.filter(e=>isValidPoly3(t,e))};module.exports=snapPolygons;
1015
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/vec2":183,"../../measurements/measureEpsilon":255,"../../utils/flatten":379,"./snapPolygons":339}],339:[function(require,module,exports){
1016
+ const vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),isValidPoly3=(e,o)=>{const r=Math.abs(poly3.measureArea(o));return Number.isFinite(r)&&r>e},snapPolygons=(e,o)=>{let r=o.map(o=>{const r=o.vertices.map(o=>vec3.snap(vec3.create(),o,e)),t=[];for(let e=0;e<r.length;e++){const o=(e+1)%r.length;vec3.equals(r[e],r[o])||t.push(r[e])}const s=poly3.create(t);return o.color&&(s.color=o.color),s});const t=e*e*Math.sqrt(3)/4;return r=r.filter(e=>isValidPoly3(t,e))};module.exports=snapPolygons;
1017
1017
 
1018
1018
  },{"../../geometries/poly3":73,"../../maths/vec3":214}],340:[function(require,module,exports){
1019
1019
  const vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),triangulatePolygon=(o,e,r)=>{const t=e.vertices.length;if(t>3){if(t>4){const c=[0,0,0];e.vertices.forEach(o=>vec3.add(c,c,o)),vec3.snap(c,vec3.divide(c,c,[t,t,t]),o);for(let o=0;o<t;o++){const s=poly3.fromPoints([c,e.vertices[o],e.vertices[(o+1)%t]]);e.color&&(s.color=e.color),r.push(s)}return}const c=poly3.fromPoints([e.vertices[0],e.vertices[1],e.vertices[2]]),s=poly3.fromPoints([e.vertices[0],e.vertices[2],e.vertices[3]]);return e.color&&(c.color=e.color,s.color=e.color),void r.push(c,s)}r.push(e)},triangulatePolygons=(o,e)=>{const r=[];return e.forEach(e=>{triangulatePolygon(o,e,r)}),r};module.exports=triangulatePolygons;
@@ -1021,28 +1021,28 @@ const vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),t
1021
1021
  },{"../../geometries/poly3":73,"../../maths/vec3":214}],341:[function(require,module,exports){
1022
1022
  const flatten=require("../../utils/flatten"),padArrayToLength=require("../../utils/padArrayToLength"),measureAggregateBoundingBox=require("../../measurements/measureAggregateBoundingBox"),{translate:translate}=require("./translate"),validateOptions=e=>{if(!Array.isArray(e.modes)||e.modes.length>3)throw new Error("align(): modes must be an array of length <= 3");if(e.modes=padArrayToLength(e.modes,"none",3),3!==e.modes.filter(e=>["center","max","min","none"].includes(e)).length)throw new Error('align(): all modes must be one of "center", "max" or "min"');if(!Array.isArray(e.relativeTo)||e.relativeTo.length>3)throw new Error("align(): relativeTo must be an array of length <= 3");if(e.relativeTo=padArrayToLength(e.relativeTo,0,3),3!==e.relativeTo.filter(e=>Number.isFinite(e)||null==e).length)throw new Error("align(): all relativeTo values must be a number, or null.");if("boolean"!=typeof e.grouped)throw new Error("align(): grouped must be a boolean value.");return e},populateRelativeToFromBounds=(e,r,t)=>{for(let n=0;n<3;n++)null==e[n]&&("center"===r[n]?e[n]=(t[0][n]+t[1][n])/2:"max"===r[n]?e[n]=t[1][n]:"min"===r[n]&&(e[n]=t[0][n]));return e},alignGeometries=(e,r,t)=>{const n=measureAggregateBoundingBox(e),o=[0,0,0];for(let e=0;e<3;e++)"center"===r[e]?o[e]=t[e]-(n[0][e]+n[1][e])/2:"max"===r[e]?o[e]=t[e]-n[1][e]:"min"===r[e]&&(o[e]=t[e]-n[0][e]);return translate(o,e)},align=(e,...r)=>{e=Object.assign({},{modes:["center","center","min"],relativeTo:[0,0,0],grouped:!1},e),e=validateOptions(e);let{modes:t,relativeTo:n,grouped:o}=e;if(0===(r=flatten(r)).length)throw new Error("align(): No geometries were provided to act upon");if(n.filter(e=>null==e).length){const e=measureAggregateBoundingBox(r);n=populateRelativeToFromBounds(n,t,e)}return 1===(r=o?alignGeometries(r,t,n):r.map(e=>alignGeometries(e,t,n))).length?r[0]:r};module.exports=align;
1023
1023
 
1024
- },{"../../measurements/measureAggregateBoundingBox":246,"../../utils/flatten":378,"../../utils/padArrayToLength":382,"./translate":348}],342:[function(require,module,exports){
1024
+ },{"../../measurements/measureAggregateBoundingBox":246,"../../utils/flatten":379,"../../utils/padArrayToLength":383,"./translate":348}],342:[function(require,module,exports){
1025
1025
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),measureBoundingBox=require("../../measurements/measureBoundingBox"),{translate:translate}=require("./translate"),centerGeometry=(e,r)=>{const{axes:t,relativeTo:n}=Object.assign({},{axes:[!0,!0,!0],relativeTo:[0,0,0]},e),a=measureBoundingBox(r),o=[0,0,0];return t[0]&&(o[0]=n[0]-(a[0][0]+(a[1][0]-a[0][0])/2)),t[1]&&(o[1]=n[1]-(a[0][1]+(a[1][1]-a[0][1])/2)),t[2]&&(o[2]=n[2]-(a[0][2]+(a[1][2]-a[0][2])/2)),translate(o,r)},center=(e,...r)=>{const{axes:t,relativeTo:n}=Object.assign({},{axes:[!0,!0,!0],relativeTo:[0,0,0]},e);if(0===(r=flatten(r)).length)throw new Error("wrong number of arguments");if(3!==n.length)throw new Error("relativeTo must be an array of length 3");e={axes:t,relativeTo:n};const a=r.map(r=>path2.isA(r)?centerGeometry(e,r):geom2.isA(r)?centerGeometry(e,r):geom3.isA(r)?centerGeometry(e,r):r);return 1===a.length?a[0]:a},centerX=(...e)=>center({axes:[!0,!1,!1]},e),centerY=(...e)=>center({axes:[!1,!0,!1]},e),centerZ=(...e)=>center({axes:[!1,!1,!0]},e);module.exports={center:center,centerX:centerX,centerY:centerY,centerZ:centerZ};
1026
1026
 
1027
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../measurements/measureBoundingBox":250,"../../utils/flatten":378,"./translate":348}],343:[function(require,module,exports){
1027
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../measurements/measureBoundingBox":250,"../../utils/flatten":379,"./translate":348}],343:[function(require,module,exports){
1028
1028
  module.exports={align:require("./align"),center:require("./center").center,centerX:require("./center").centerX,centerY:require("./center").centerY,centerZ:require("./center").centerZ,mirror:require("./mirror").mirror,mirrorX:require("./mirror").mirrorX,mirrorY:require("./mirror").mirrorY,mirrorZ:require("./mirror").mirrorZ,rotate:require("./rotate").rotate,rotateX:require("./rotate").rotateX,rotateY:require("./rotate").rotateY,rotateZ:require("./rotate").rotateZ,scale:require("./scale").scale,scaleX:require("./scale").scaleX,scaleY:require("./scale").scaleY,scaleZ:require("./scale").scaleZ,transform:require("./transform"),translate:require("./translate").translate,translateX:require("./translate").translateX,translateY:require("./translate").translateY,translateZ:require("./translate").translateZ};
1029
1029
 
1030
1030
  },{"./align":341,"./center":342,"./mirror":344,"./rotate":345,"./scale":346,"./transform":347,"./translate":348}],344:[function(require,module,exports){
1031
1031
  const flatten=require("../../utils/flatten"),mat4=require("../../maths/mat4"),plane=require("../../maths/plane"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),mirror=(r,...e)=>{const{origin:o,normal:m}=Object.assign({},{origin:[0,0,0],normal:[0,0,1]},r);if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const i=plane.fromNormalAndPoint(plane.create(),m,o);if(Number.isNaN(i[0]))throw new Error("the given origin and normal do not define a proper plane");const n=mat4.mirrorByPlane(mat4.create(),i),t=e.map(r=>path2.isA(r)?path2.transform(n,r):geom2.isA(r)?geom2.transform(n,r):geom3.isA(r)?geom3.transform(n,r):r);return 1===t.length?t[0]:t},mirrorX=(...r)=>mirror({normal:[1,0,0]},r),mirrorY=(...r)=>mirror({normal:[0,1,0]},r),mirrorZ=(...r)=>mirror({normal:[0,0,1]},r);module.exports={mirror:mirror,mirrorX:mirrorX,mirrorY:mirrorY,mirrorZ:mirrorZ};
1032
1032
 
1033
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../maths/plane":156,"../../utils/flatten":378}],345:[function(require,module,exports){
1033
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../maths/plane":156,"../../utils/flatten":379}],345:[function(require,module,exports){
1034
1034
  const flatten=require("../../utils/flatten"),mat4=require("../../maths/mat4"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),rotate=(t,...e)=>{if(!Array.isArray(t))throw new Error("angles must be an array");if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");for(t=t.slice();t.length<3;)t.push(0);const r=t[2],o=t[1],a=t[0],m=mat4.fromTaitBryanRotation(mat4.create(),r,o,a),n=e.map(t=>path2.isA(t)?path2.transform(m,t):geom2.isA(t)?geom2.transform(m,t):geom3.isA(t)?geom3.transform(m,t):t);return 1===n.length?n[0]:n},rotateX=(t,...e)=>rotate([t,0,0],e),rotateY=(t,...e)=>rotate([0,t,0],e),rotateZ=(t,...e)=>rotate([0,0,t],e);module.exports={rotate:rotate,rotateX:rotateX,rotateY:rotateY,rotateZ:rotateZ};
1035
1035
 
1036
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../utils/flatten":378}],346:[function(require,module,exports){
1036
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../utils/flatten":379}],346:[function(require,module,exports){
1037
1037
  const flatten=require("../../utils/flatten"),mat4=require("../../maths/mat4"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),scale=(e,...r)=>{if(!Array.isArray(e))throw new Error("factors must be an array");if(0===(r=flatten(r)).length)throw new Error("wrong number of arguments");for(e=e.slice();e.length<3;)e.push(1);if(e[0]<=0||e[1]<=0||e[2]<=0)throw new Error("factors must be positive");const a=mat4.fromScaling(mat4.create(),e),t=r.map(e=>path2.isA(e)?path2.transform(a,e):geom2.isA(e)?geom2.transform(a,e):geom3.isA(e)?geom3.transform(a,e):e);return 1===t.length?t[0]:t},scaleX=(e,...r)=>scale([e,1,1],r),scaleY=(e,...r)=>scale([1,e,1],r),scaleZ=(e,...r)=>scale([1,1,e],r);module.exports={scale:scale,scaleX:scaleX,scaleY:scaleY,scaleZ:scaleZ};
1038
1038
 
1039
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../utils/flatten":378}],347:[function(require,module,exports){
1039
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../utils/flatten":379}],347:[function(require,module,exports){
1040
1040
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),transform=(e,...r)=>{if(0===(r=flatten(r)).length)throw new Error("wrong number of arguments");const t=r.map(r=>path2.isA(r)?path2.transform(e,r):geom2.isA(r)?geom2.transform(e,r):geom3.isA(r)?geom3.transform(e,r):r);return 1===t.length?t[0]:t};module.exports=transform;
1041
1041
 
1042
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../utils/flatten":378}],348:[function(require,module,exports){
1042
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../utils/flatten":379}],348:[function(require,module,exports){
1043
1043
  const flatten=require("../../utils/flatten"),mat4=require("../../maths/mat4"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),translate=(t,...e)=>{if(!Array.isArray(t))throw new Error("offset must be an array");if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");for(t=t.slice();t.length<3;)t.push(0);const r=mat4.fromTranslation(mat4.create(),t),a=e.map(t=>path2.isA(t)?path2.transform(r,t):geom2.isA(t)?geom2.transform(r,t):geom3.isA(t)?geom3.transform(r,t):t);return 1===a.length?a[0]:a},translateX=(t,...e)=>translate([t,0,0],e),translateY=(t,...e)=>translate([0,t,0],e),translateZ=(t,...e)=>translate([0,0,t],e);module.exports={translate:translate,translateX:translateX,translateY:translateY,translateZ:translateZ};
1044
1044
 
1045
- },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../utils/flatten":378}],349:[function(require,module,exports){
1045
+ },{"../../geometries/geom2":22,"../../geometries/geom3":36,"../../geometries/path2":57,"../../maths/mat4":137,"../../utils/flatten":379}],349:[function(require,module,exports){
1046
1046
  const{EPS:EPS}=require("../maths/constants"),vec2=require("../maths/vec2"),path2=require("../geometries/path2"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),arc=e=>{const r={center:[0,0],radius:1,startAngle:0,endAngle:2*Math.PI,makeTangent:!1,segments:32};let{center:t,radius:s,startAngle:a,endAngle:n,makeTangent:o,segments:c}=Object.assign({},r,e);if(!isNumberArray(t,2))throw new Error("center must be an array of X and Y values");if(!isGT(s,0))throw new Error("radius must be greater than zero");if(!isGTE(a,0))throw new Error("startAngle must be positive");if(!isGTE(n,0))throw new Error("endAngle must be positive");if(!isGTE(c,4))throw new Error("segments must be four or more");a%=2*Math.PI,n%=2*Math.PI;let i=2*Math.PI;a<n&&(i=n-a),a>n&&(i=n+(2*Math.PI-a));const m=Math.acos((s*s+s*s-EPS*EPS)/(2*s*s)),h=vec2.clone(t);let l;const u=[];if(i<m)l=vec2.fromAngleRadians(vec2.create(),a),vec2.scale(l,l,s),vec2.add(l,l,h),u.push(l);else{const e=Math.max(1,Math.floor(c*(i/(2*Math.PI))))+1;let r=.5*e/i;r>.25&&(r=.25);const t=o?e+2:e;for(let n=0;n<=t;n++){let t=n;o&&((t=(n-1)*(e-2*r)/e+r)<0&&(t=0),t>e&&(t=e));const c=a+t*(i/e);l=vec2.fromAngleRadians(vec2.create(),c),vec2.scale(l,l,s),vec2.add(l,l,h),u.push(l)}}return path2.fromPoints({close:!1},u)};module.exports=arc;
1047
1047
 
1048
1048
  },{"../geometries/path2":57,"../maths/constants":87,"../maths/vec2":183,"./commonChecks":351}],350:[function(require,module,exports){
@@ -1070,12 +1070,12 @@ const{EPS:EPS}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2
1070
1070
  const vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),ellipsoid=e=>{const{center:c,radius:a,segments:r,axes:s}=Object.assign({},{center:[0,0,0],radius:[1,1,1],segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},e);if(!isNumberArray(c,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(a,3))throw new Error("radius must be an array of X, Y and Z values");if(!a.every(e=>e>0))throw new Error("radius values must be greater than zero");if(!isGTE(r,4))throw new Error("segments must be four or more");const t=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),s[0]),a[0]),v=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),s[1]),a[1]),o=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),s[2]),a[2]),l=Math.round(r/4);let u;const d=[],i=vec3.create(),n=vec3.create();for(let e=0;e<=r;e++){const a=2*Math.PI*e/r,s=vec3.add(vec3.create(),vec3.scale(i,t,Math.cos(a)),vec3.scale(n,v,Math.sin(a)));if(e>0){let e,a;for(let r=0;r<=l;r++){const t=.5*Math.PI*r/l,v=Math.cos(t),m=Math.sin(t);if(r>0){let t,h=[];t=vec3.subtract(vec3.create(),vec3.scale(i,u,e),vec3.scale(n,o,a)),h.push(vec3.add(t,t,c)),t=vec3.subtract(vec3.create(),vec3.scale(i,s,e),vec3.scale(n,o,a)),h.push(vec3.add(t,t,c)),r<l&&(t=vec3.subtract(vec3.create(),vec3.scale(i,s,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c))),t=vec3.subtract(vec3.create(),vec3.scale(i,u,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c)),d.push(poly3.fromPoints(h)),h=[],t=vec3.add(vec3.create(),vec3.scale(i,u,e),vec3.scale(n,o,a)),h.push(vec3.add(vec3.create(),c,t)),t=vec3.add(t,vec3.scale(i,s,e),vec3.scale(n,o,a)),h.push(vec3.add(vec3.create(),c,t)),r<l&&(t=vec3.add(t,vec3.scale(i,s,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t))),t=vec3.add(t,vec3.scale(i,u,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t)),h.reverse(),d.push(poly3.fromPoints(h))}e=v,a=m}}u=s}return geom3.create(d)};module.exports=ellipsoid;
1071
1071
 
1072
1072
  },{"../geometries/geom3":36,"../geometries/poly3":73,"../maths/vec3":214,"./commonChecks":351}],358:[function(require,module,exports){
1073
- const mat4=require("../maths/mat4"),geom3=require("../geometries/geom3"),polyhedron=require("./polyhedron"),{isGT:isGT,isGTE:isGTE}=require("./commonChecks"),geodesicSphere=e=>{let{radius:r,frequency:t}=Object.assign({},{radius:1,frequency:6},e);if(!isGT(r,0))throw new Error("radius must be greater than zero");if(!isGTE(t,6))throw new Error("frequency must be six or more");t=Math.floor(t/6);const o=[[.850651,0,-.525731],[.850651,-0,.525731],[-.850651,-0,.525731],[-.850651,0,-.525731],[0,-.525731,.850651],[0,.525731,.850651],[0,.525731,-.850651],[0,-.525731,-.850651],[-.525731,-.850651,-0],[.525731,-.850651,-0],[.525731,.850651,0],[-.525731,.850651,0]],s=[[0,9,1],[1,10,0],[6,7,0],[10,6,0],[7,9,0],[5,1,4],[4,1,9],[5,10,1],[2,8,3],[3,11,2],[2,5,4],[4,8,2],[2,11,5],[3,7,6],[6,11,3],[8,7,3],[9,8,4],[11,10,5],[10,11,6],[8,9,7]],n=(e,r,t)=>{const o=e[0],s=e[1],n=e[2];let c=t;const a=[],f=[];for(let e=0;e<r;e++)for(let t=0;t<r-e;t++){const l=e/r,u=(e+1)/r,h=t/(r-e),m=(t+1)/(r-e),p=r-e-1?t/(r-e-1):1,g=[];g[0]=i(i(o,s,h),n,l),g[1]=i(i(o,s,m),n,l),g[2]=i(i(o,s,p),n,u);for(let e=0;e<3;e++){const r=Math.sqrt(g[e][0]*g[e][0]+g[e][1]*g[e][1]+g[e][2]*g[e][2]);for(let t=0;t<3;t++)g[e][t]/=r}if(a.push(g[0],g[1],g[2]),f.push([c,c+1,c+2]),c+=3,t<r-e-1){const h=r-e-1?(t+1)/(r-e-1):1;g[0]=i(i(o,s,m),n,l),g[1]=i(i(o,s,h),n,u),g[2]=i(i(o,s,p),n,u);for(let e=0;e<3;e++){const r=Math.sqrt(g[e][0]*g[e][0]+g[e][1]*g[e][1]+g[e][2]*g[e][2]);for(let t=0;t<3;t++)g[e][t]/=r}a.push(g[0],g[1],g[2]),f.push([c,c+1,c+2]),c+=3}}return{points:a,triangles:f,offset:c}},i=(e,r,t)=>{const o=1-t,s=[];for(let n=0;n<3;n++)s[n]=e[n]*o+r[n]*t;return s};let c=[],a=[],f=0;for(let e=0;e<s.length;e++){const r=n([o[s[e][0]],o[s[e][1]],o[s[e][2]]],t,f);c=c.concat(r.points),a=a.concat(r.triangles),f=r.offset}let l=polyhedron({points:c,faces:a,orientation:"inward"});return 1!==r&&(l=geom3.transform(mat4.fromScaling(mat4.create(),[r,r,r]),l)),l};module.exports=geodesicSphere;
1073
+ const mat4=require("../maths/mat4"),geom3=require("../geometries/geom3"),polyhedron=require("./polyhedron"),{isGT:isGT,isGTE:isGTE}=require("./commonChecks"),geodesicSphere=e=>{let{radius:t,frequency:r}=Object.assign({},{radius:1,frequency:6},e);if(!isGT(t,0))throw new Error("radius must be greater than zero");if(!isGTE(r,6))throw new Error("frequency must be six or more");r=Math.floor(r/6);const o=[[.850651,0,-.525731],[.850651,-0,.525731],[-.850651,-0,.525731],[-.850651,0,-.525731],[0,-.525731,.850651],[0,.525731,.850651],[0,.525731,-.850651],[0,-.525731,-.850651],[-.525731,-.850651,-0],[.525731,-.850651,-0],[.525731,.850651,0],[-.525731,.850651,0]],s=[[0,9,1],[1,10,0],[6,7,0],[10,6,0],[7,9,0],[5,1,4],[4,1,9],[5,10,1],[2,8,3],[3,11,2],[2,5,4],[4,8,2],[2,11,5],[3,7,6],[6,11,3],[8,7,3],[9,8,4],[11,10,5],[10,11,6],[8,9,7]],n=(e,t,r)=>{const o=e[0],s=e[1],n=e[2];let c=r;const a=[],f=[];for(let e=0;e<t;e++)for(let r=0;r<t-e;r++){const l=e/t,h=(e+1)/t,u=r/(t-e),m=(r+1)/(t-e),p=t-e-1?r/(t-e-1):1,g=[];g[0]=i(i(o,s,u),n,l),g[1]=i(i(o,s,m),n,l),g[2]=i(i(o,s,p),n,h);for(let e=0;e<3;e++){const t=Math.hypot(g[e][0],g[e][1],g[e][2]);for(let r=0;r<3;r++)g[e][r]/=t}if(a.push(g[0],g[1],g[2]),f.push([c,c+1,c+2]),c+=3,r<t-e-1){const u=t-e-1?(r+1)/(t-e-1):1;g[0]=i(i(o,s,m),n,l),g[1]=i(i(o,s,u),n,h),g[2]=i(i(o,s,p),n,h);for(let e=0;e<3;e++){const t=Math.hypot(g[e][0],g[e][1],g[e][2]);for(let r=0;r<3;r++)g[e][r]/=t}a.push(g[0],g[1],g[2]),f.push([c,c+1,c+2]),c+=3}}return{points:a,triangles:f,offset:c}},i=(e,t,r)=>{const o=1-r,s=[];for(let n=0;n<3;n++)s[n]=e[n]*o+t[n]*r;return s};let c=[],a=[],f=0;for(let e=0;e<s.length;e++){const t=n([o[s[e][0]],o[s[e][1]],o[s[e][2]]],r,f);c=c.concat(t.points),a=a.concat(t.triangles),f=t.offset}let l=polyhedron({points:c,faces:a,orientation:"inward"});return 1!==t&&(l=geom3.transform(mat4.fromScaling(mat4.create(),[t,t,t]),l)),l};module.exports=geodesicSphere;
1074
1074
 
1075
1075
  },{"../geometries/geom3":36,"../maths/mat4":137,"./commonChecks":351,"./polyhedron":362}],359:[function(require,module,exports){
1076
- module.exports={arc:require("./arc"),circle:require("./circle"),cube:require("./cube"),cuboid:require("./cuboid"),cylinder:require("./cylinder"),cylinderElliptic:require("./cylinderElliptic"),ellipse:require("./ellipse"),ellipsoid:require("./ellipsoid"),geodesicSphere:require("./geodesicSphere"),line:require("./line"),polygon:require("./polygon"),polyhedron:require("./polyhedron"),rectangle:require("./rectangle"),roundedCuboid:require("./roundedCuboid"),roundedCylinder:require("./roundedCylinder"),roundedRectangle:require("./roundedRectangle"),sphere:require("./sphere"),square:require("./square"),star:require("./star"),torus:require("./torus")};
1076
+ module.exports={arc:require("./arc"),circle:require("./circle"),cube:require("./cube"),cuboid:require("./cuboid"),cylinder:require("./cylinder"),cylinderElliptic:require("./cylinderElliptic"),ellipse:require("./ellipse"),ellipsoid:require("./ellipsoid"),geodesicSphere:require("./geodesicSphere"),line:require("./line"),polygon:require("./polygon"),polyhedron:require("./polyhedron"),rectangle:require("./rectangle"),roundedCuboid:require("./roundedCuboid"),roundedCylinder:require("./roundedCylinder"),roundedRectangle:require("./roundedRectangle"),sphere:require("./sphere"),square:require("./square"),star:require("./star"),torus:require("./torus"),triangle:require("./triangle")};
1077
1077
 
1078
- },{"./arc":349,"./circle":350,"./cube":352,"./cuboid":353,"./cylinder":354,"./cylinderElliptic":355,"./ellipse":356,"./ellipsoid":357,"./geodesicSphere":358,"./line":360,"./polygon":361,"./polyhedron":362,"./rectangle":363,"./roundedCuboid":364,"./roundedCylinder":365,"./roundedRectangle":366,"./sphere":367,"./square":368,"./star":369,"./torus":370}],360:[function(require,module,exports){
1078
+ },{"./arc":349,"./circle":350,"./cube":352,"./cuboid":353,"./cylinder":354,"./cylinderElliptic":355,"./ellipse":356,"./ellipsoid":357,"./geodesicSphere":358,"./line":360,"./polygon":361,"./polyhedron":362,"./rectangle":363,"./roundedCuboid":364,"./roundedCylinder":365,"./roundedRectangle":366,"./sphere":367,"./square":368,"./star":369,"./torus":370,"./triangle":371}],360:[function(require,module,exports){
1079
1079
  const path2=require("../geometries/path2"),line=r=>{if(!Array.isArray(r))throw new Error("points must be an array");return path2.fromPoints({},r)};module.exports=line;
1080
1080
 
1081
1081
  },{"../geometries/path2":57}],361:[function(require,module,exports){
@@ -1109,45 +1109,48 @@ const vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isGT:i
1109
1109
  const extrudeRotate=require("../operations/extrusions/extrudeRotate"),{rotate:rotate}=require("../operations/transforms/rotate"),{translate:translate}=require("../operations/transforms/translate"),circle=require("./circle"),{isGT:isGT,isGTE:isGTE}=require("./commonChecks"),torus=e=>{const r={innerRadius:1,innerSegments:32,outerRadius:4,outerSegments:32,innerRotation:0,startAngle:0,outerRotation:2*Math.PI},{innerRadius:t,innerSegments:o,outerRadius:n,outerSegments:s,innerRotation:i,startAngle:a,outerRotation:u}=Object.assign({},r,e);if(!isGT(t,0))throw new Error("innerRadius must be greater than zero");if(!isGTE(o,3))throw new Error("innerSegments must be three or more");if(!isGT(n,0))throw new Error("outerRadius must be greater than zero");if(!isGTE(s,3))throw new Error("outerSegments must be three or more");if(!isGTE(a,0))throw new Error("startAngle must be positive");if(!isGT(u,0))throw new Error("outerRotation must be greater than zero");if(t>=n)throw new Error("inner circle is two large to rotate about the outer circle");let m=circle({radius:t,segments:o});return 0!==i&&(m=rotate([0,0,i],m)),m=translate([n,0],m),extrudeRotate({startAngle:a,angle:u,segments:s},m)};module.exports=torus;
1110
1110
 
1111
1111
  },{"../operations/extrusions/extrudeRotate":300,"../operations/transforms/rotate":345,"../operations/transforms/translate":348,"./circle":350,"./commonChecks":351}],371:[function(require,module,exports){
1112
+ const vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isNumberArray:isNumberArray}=require("./commonChecks"),NEPS=1e-13,solveAngleFromSSS=(e,r,t)=>Math.acos((e*e+r*r-t*t)/(2*e*r)),solveSideFromSAS=(e,r,t)=>r>NEPS?Math.sqrt(e*e+t*t-2*e*t*Math.cos(r)):Math.sqrt((e-t)*(e-t)+e*t*r*r*(1-r*r/12)),solveAAA=e=>{if(Math.abs(e[0]+e[1]+e[2]-Math.PI)>NEPS)throw new Error("AAA triangles require angles that sum to PI");const r=e[0],t=e[1],s=Math.PI-r-t,a=1/Math.sin(s)*Math.sin(r),n=1/Math.sin(s)*Math.sin(t);return createTriangle(r,t,s,a,n,1)},solveAAS=e=>{const r=e[0],t=e[1],s=Math.PI+NEPS-r-t;if(s<NEPS)throw new Error("AAS triangles require angles that sum to PI");const a=e[2],n=a/Math.sin(r)*Math.sin(t),o=a/Math.sin(r)*Math.sin(s);return createTriangle(r,t,s,a,n,o)},solveASA=e=>{const r=e[0],t=e[2],s=Math.PI+NEPS-r-t;if(s<NEPS)throw new Error("ASA triangles require angles that sum to PI");const a=e[1],n=a/Math.sin(s)*Math.sin(r),o=a/Math.sin(s)*Math.sin(t);return createTriangle(r,t,s,n,o,a)},solveSAS=e=>{const r=e[0],t=e[1],s=e[2],a=solveSideFromSAS(r,t,s),n=solveAngleFromSSS(a,r,s),o=Math.PI-n-t;return createTriangle(n,t,o,s,a,r)},solveSSA=e=>{const r=e[0],t=e[1],s=e[2],a=Math.asin(t*Math.sin(s)/r),n=Math.PI-a-s,o=r/Math.sin(s)*Math.sin(n);return createTriangle(a,n,s,t,o,r)},solveSSS=e=>{const r=e[1],t=e[2],s=e[0];if(r+t<=s||t+s<=r||s+r<=t)throw new Error("SSS triangle is incorrect, as the longest side is longer than the sum of the other sides");const a=solveAngleFromSSS(t,s,r),n=solveAngleFromSSS(s,r,t),o=Math.PI-a-n;return createTriangle(a,n,o,r,t,s)},createTriangle=(e,r,t,s,a,n)=>{const o=vec2.fromValues(0,0),i=vec2.fromValues(n,0),S=vec2.fromValues(s,0);return vec2.add(S,vec2.rotate(S,S,[0,0],Math.PI-r),i),geom2.fromPoints([o,i,S])},triangle=e=>{let{type:r,values:t}=Object.assign({},{type:"SSS",values:[1,1,1]},e);if("string"!=typeof r)throw new Error("triangle type must be a string");if("A"!==(r=r.toUpperCase())[0]&&"S"!==r[0]||"A"!==r[1]&&"S"!==r[1]||"A"!==r[2]&&"S"!==r[2])throw new Error("triangle type must contain three letters; A or S");if(!isNumberArray(t,3))throw new Error("triangle values must contain three values");if(!t.every(e=>e>0))throw new Error("triangle values must be greater than zero");switch(r){case"AAA":return solveAAA(t);case"AAS":return solveAAS(t);case"ASA":return solveASA(t);case"SAS":return solveSAS(t);case"SSA":return solveSSA(t);case"SSS":return solveSSS(t);default:throw new Error("invalid triangle type, try again")}};module.exports=triangle;
1113
+
1114
+ },{"../geometries/geom2":22,"../maths/vec2":183,"./commonChecks":351}],372:[function(require,module,exports){
1112
1115
  module.exports={height:14,32:[16],33:[10,5,21,5,7,void 0,5,2,4,1,5,0,6,1,5,2],34:[16,4,21,4,14,void 0,12,21,12,14],35:[21,11,25,4,-7,void 0,17,25,10,-7,void 0,4,12,18,12,void 0,3,6,17,6],36:[20,8,25,8,-4,void 0,12,25,12,-4,void 0,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3],37:[24,21,21,3,0,void 0,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,void 0,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7],38:[26,23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2],39:[10,5,19,4,20,5,21,6,20,6,18,5,16,4,15],40:[14,11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7],41:[14,3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7],42:[16,8,21,8,9,void 0,3,18,13,12,void 0,13,18,3,12],43:[26,13,18,13,0,void 0,4,9,22,9],44:[10,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4],45:[26,4,9,22,9],46:[10,5,2,4,1,5,0,6,1,5,2],47:[22,20,25,2,-7],48:[20,9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21],49:[20,6,17,8,18,11,21,11,0],50:[20,4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0],51:[20,5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4],52:[20,13,21,3,7,18,7,void 0,13,21,13,0],53:[20,15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4],54:[20,16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7],55:[20,17,21,7,0,void 0,3,21,17,21],56:[20,8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21],57:[20,16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3],58:[10,5,14,4,13,5,12,6,13,5,14,void 0,5,2,4,1,5,0,6,1,5,2],59:[10,5,14,4,13,5,12,6,13,5,14,void 0,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4],60:[24,20,18,4,9,20,0],61:[26,4,12,22,12,void 0,4,6,22,6],62:[24,4,18,20,9,4,0],63:[18,3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,void 0,9,2,8,1,9,0,10,1,9,2],64:[27,18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,void 0,12,16,10,14,9,11,9,8,10,6,11,5,void 0,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,void 0,19,16,18,8,18,6,19,5],65:[18,9,21,1,0,void 0,9,21,17,0,void 0,4,7,14,7],66:[21,4,21,4,0,void 0,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,void 0,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0],67:[21,18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5],68:[21,4,21,4,0,void 0,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0],69:[19,4,21,4,0,void 0,4,21,17,21,void 0,4,11,12,11,void 0,4,0,17,0],70:[18,4,21,4,0,void 0,4,21,17,21,void 0,4,11,12,11],71:[21,18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,void 0,13,8,18,8],72:[22,4,21,4,0,void 0,18,21,18,0,void 0,4,11,18,11],73:[8,4,21,4,0],74:[16,12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7],75:[21,4,21,4,0,void 0,18,21,4,7,void 0,9,12,18,0],76:[17,4,21,4,0,void 0,4,0,16,0],77:[24,4,21,4,0,void 0,4,21,12,0,void 0,20,21,12,0,void 0,20,21,20,0],78:[22,4,21,4,0,void 0,4,21,18,0,void 0,18,21,18,0],79:[22,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21],80:[21,4,21,4,0,void 0,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10],81:[22,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,void 0,12,4,18,-2],82:[21,4,21,4,0,void 0,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,void 0,11,11,18,0],83:[20,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3],84:[16,8,21,8,0,void 0,1,21,15,21],85:[22,4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21],86:[18,1,21,9,0,void 0,17,21,9,0],87:[24,2,21,7,0,void 0,12,21,7,0,void 0,12,21,17,0,void 0,22,21,17,0],88:[20,3,21,17,0,void 0,17,21,3,0],89:[18,1,21,9,11,9,0,void 0,17,21,9,11],90:[20,17,21,3,0,void 0,3,21,17,21,void 0,3,0,17,0],91:[14,4,25,4,-7,void 0,5,25,5,-7,void 0,4,25,11,25,void 0,4,-7,11,-7],92:[14,0,21,14,-3],93:[14,9,25,9,-7,void 0,10,25,10,-7,void 0,3,25,10,25,void 0,3,-7,10,-7],94:[16,6,15,8,18,10,15,void 0,3,12,8,17,13,12,void 0,8,17,8,0],95:[16,0,-2,16,-2],96:[10,6,21,5,20,4,18,4,16,5,15,6,16,5,17],97:[19,15,14,15,0,void 0,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],98:[19,4,21,4,0,void 0,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3],99:[18,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],100:[19,15,21,15,0,void 0,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],101:[18,3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],102:[12,10,21,8,21,6,20,5,17,5,0,void 0,2,14,9,14],103:[19,15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,void 0,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],104:[19,4,21,4,0,void 0,4,10,7,13,9,14,12,14,14,13,15,10,15,0],105:[8,3,21,4,20,5,21,4,22,3,21,void 0,4,14,4,0],106:[10,5,21,6,20,7,21,6,22,5,21,void 0,6,14,6,-3,5,-6,3,-7,1,-7],107:[17,4,21,4,0,void 0,14,14,4,4,void 0,8,8,15,0],108:[8,4,21,4,0],109:[30,4,14,4,0,void 0,4,10,7,13,9,14,12,14,14,13,15,10,15,0,void 0,15,10,18,13,20,14,23,14,25,13,26,10,26,0],110:[19,4,14,4,0,void 0,4,10,7,13,9,14,12,14,14,13,15,10,15,0],111:[19,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14],112:[19,4,14,4,-7,void 0,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3],113:[19,15,14,15,-7,void 0,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],114:[13,4,14,4,0,void 0,4,8,5,11,7,13,9,14,12,14],115:[17,14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3],116:[12,5,21,5,4,6,1,8,0,10,0,void 0,2,14,9,14],117:[19,4,14,4,4,5,1,7,0,10,0,12,1,15,4,void 0,15,14,15,0],118:[16,2,14,8,0,void 0,14,14,8,0],119:[22,3,14,7,0,void 0,11,14,7,0,void 0,11,14,15,0,void 0,19,14,15,0],120:[17,3,14,14,0,void 0,14,14,3,0],121:[16,2,14,8,0,void 0,14,14,8,0,6,-4,4,-6,2,-7,1,-7],122:[17,14,14,3,0,void 0,3,14,14,14,void 0,3,0,14,0],123:[14,9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,void 0,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,void 0,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7],124:[8,4,25,4,-7],125:[14,5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,void 0,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,void 0,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7],126:[24,3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,void 0,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]};
1113
1116
 
1114
- },{}],372:[function(require,module,exports){
1117
+ },{}],373:[function(require,module,exports){
1115
1118
  module.exports={vectorChar:require("./vectorChar"),vectorText:require("./vectorText")};
1116
1119
 
1117
- },{"./vectorChar":373,"./vectorText":375}],373:[function(require,module,exports){
1120
+ },{"./vectorChar":374,"./vectorText":376}],374:[function(require,module,exports){
1118
1121
  const vectorParams=require("./vectorParams"),vectorChar=(t,e)=>{const{xOffset:r,yOffset:s,input:h,font:o,height:c,extrudeOffset:n}=vectorParams(t,e);let a=h.charCodeAt(0);a&&o[a]||(a=63);const f=[].concat(o[a]),i=(c-n)/o.height,u=n/2,g=f.shift()*i,l=[];let v=[];for(let t=0,e=f.length;t<e;t+=2){const e=i*f[t]+r,h=i*f[t+1]+s+u;void 0===f[t]?(l.push(v),v=[],t--):v.push([e,h])}return v.length&&l.push(v),{width:g,height:c,segments:l}};module.exports=vectorChar;
1119
1122
 
1120
- },{"./vectorParams":374}],374:[function(require,module,exports){
1123
+ },{"./vectorParams":375}],375:[function(require,module,exports){
1121
1124
  const defaultFont=require("./fonts/single-line/hershey/simplex.js"),defaultsVectorParams={xOffset:0,yOffset:0,input:"?",align:"left",font:defaultFont,height:14,lineSpacing:2.142857142857143,letterSpacing:1,extrudeOffset:0},vectorParams=(t,e)=>{e||"string"!=typeof t||(t={input:t}),t=t||{};const s=Object.assign({},defaultsVectorParams,t);return s.input=e||s.input,s};module.exports=vectorParams;
1122
1125
 
1123
- },{"./fonts/single-line/hershey/simplex.js":371}],375:[function(require,module,exports){
1126
+ },{"./fonts/single-line/hershey/simplex.js":372}],376:[function(require,module,exports){
1124
1127
  const vectorChar=require("./vectorChar"),vectorParams=require("./vectorParams"),translateLine=(t,e)=>{const{x:n,y:s}=Object.assign({x:0,y:0},t||{}),r=e.segments;let h=null,a=null;for(let t=0,e=r.length;t<e;t++)for(let e=0,o=(h=r[t]).length;e<o;e++)a=h[e],h[e]=[a[0]+n,a[1]+s];return e},vectorText=(t,e)=>{const{xOffset:n,yOffset:s,input:r,font:h,height:a,align:o,extrudeOffset:i,lineSpacing:c,letterSpacing:g}=vectorParams(t,e);let[l,f]=[n,s],[m,x,u,d,v,w]=[],O={width:0,segments:[]};const p=[];let y=[],C=0;const L=l,P=()=>{p.push(O),C=Math.max(C,O.width),O={width:0,segments:[]}};for(m=0,x=r.length;m<x;m++)u=r[m],d=vectorChar({xOffset:l,yOffset:f,font:h,height:a,extrudeOffset:i},u),"\n"!==u?(v=d.width*g,O.width+=v,l+=v," "!==u&&(O.segments=O.segments.concat(d.segments))):(l=L,f-=d.height*c,P());for(O.segments.length&&P(),m=0,x=p.length;m<x;m++)O=p[m],C>O.width&&(w=C-O.width,"right"===o?O=translateLine({x:w},O):"center"===o&&(O=translateLine({x:w/2},O))),y=y.concat(O.segments);return y};module.exports=vectorText;
1125
1128
 
1126
- },{"./vectorChar":373,"./vectorParams":374}],376:[function(require,module,exports){
1129
+ },{"./vectorChar":374,"./vectorParams":375}],377:[function(require,module,exports){
1127
1130
  const geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),areAllShapesTheSameType=e=>{let r;return e.forEach(e=>{let o=0;if(geom2.isA(e)&&(o=1),geom3.isA(e)&&(o=2),path2.isA(e)&&(o=3),r&&o!==r)return!1;r=o}),!0};module.exports=areAllShapesTheSameType;
1128
1131
 
1129
- },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57}],377:[function(require,module,exports){
1132
+ },{"../geometries/geom2":22,"../geometries/geom3":36,"../geometries/path2":57}],378:[function(require,module,exports){
1130
1133
  const degToRad=d=>.017453292519943295*d;module.exports=degToRad;
1131
1134
 
1132
- },{}],378:[function(require,module,exports){
1135
+ },{}],379:[function(require,module,exports){
1133
1136
  const flatten=t=>t.reduce((t,a)=>Array.isArray(a)?t.concat(flatten(a)):t.concat(a),[]);module.exports=flatten;
1134
1137
 
1135
- },{}],379:[function(require,module,exports){
1138
+ },{}],380:[function(require,module,exports){
1136
1139
  const fnNumberSort=(o,r)=>o-r;module.exports=fnNumberSort;
1137
1140
 
1138
- },{}],380:[function(require,module,exports){
1141
+ },{}],381:[function(require,module,exports){
1139
1142
  module.exports={areAllShapesTheSameType:require("./areAllShapesTheSameType"),degToRad:require("./degToRad"),flatten:require("./flatten"),fnNumberSort:require("./fnNumberSort"),insertSorted:require("./insertSorted"),radiusToSegments:require("./radiusToSegments"),radToDeg:require("./radToDeg")};
1140
1143
 
1141
- },{"./areAllShapesTheSameType":376,"./degToRad":377,"./flatten":378,"./fnNumberSort":379,"./insertSorted":381,"./radToDeg":383,"./radiusToSegments":384}],381:[function(require,module,exports){
1144
+ },{"./areAllShapesTheSameType":377,"./degToRad":378,"./flatten":379,"./fnNumberSort":380,"./insertSorted":382,"./radToDeg":384,"./radiusToSegments":385}],382:[function(require,module,exports){
1142
1145
  const insertSorted=(t,e,o)=>{let r=0,s=t.length;for(;s>r;){const l=Math.floor((r+s)/2);o(e,t[l])>0?r=l+1:s=l}t.splice(r,0,e)};module.exports=insertSorted;
1143
1146
 
1144
- },{}],382:[function(require,module,exports){
1147
+ },{}],383:[function(require,module,exports){
1145
1148
  const padArrayToLength=(r,e,o)=>{for(r=r.slice();r.length<o;)r.push(e);return r};module.exports=padArrayToLength;
1146
1149
 
1147
- },{}],383:[function(require,module,exports){
1150
+ },{}],384:[function(require,module,exports){
1148
1151
  const radToDeg=o=>57.29577951308232*o;module.exports=radToDeg;
1149
1152
 
1150
- },{}],384:[function(require,module,exports){
1153
+ },{}],385:[function(require,module,exports){
1151
1154
  const radiusToSegments=(t,e,a)=>{const s=e>0?2*t*Math.PI/e:0,o=a>0?2*Math.PI/a:0;return Math.ceil(Math.max(s,o,4))};module.exports=radiusToSegments;
1152
1155
 
1153
1156
  },{}]},{},[85])(85)