@jscad/modeling 2.12.5 → 3.0.1-alpha.0

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 (1206) hide show
  1. package/CHANGELOG.md +49 -321
  2. package/LICENSE +1 -1
  3. package/README.md +5 -3
  4. package/dist/jscad-modeling.es.js +7 -0
  5. package/dist/jscad-modeling.min.js +7 -1214
  6. package/global.d.ts +15 -0
  7. package/package.json +22 -19
  8. package/rollup.config.js +21 -0
  9. package/src/colors/colorNameToRgb.d.ts +2 -4
  10. package/src/colors/colorNameToRgb.js +4 -6
  11. package/src/colors/colorNameToRgb.test.js +2 -2
  12. package/src/colors/colorize.d.ts +6 -8
  13. package/src/colors/colorize.js +20 -26
  14. package/src/colors/colorize.test.js +14 -16
  15. package/src/colors/cssColors.d.ts +1 -1
  16. package/src/colors/cssColors.js +2 -4
  17. package/src/colors/hexToRgb.d.ts +2 -4
  18. package/src/colors/hexToRgb.js +3 -5
  19. package/src/colors/hexToRgb.test.js +2 -2
  20. package/src/colors/hslToRgb.d.ts +5 -7
  21. package/src/colors/hslToRgb.js +4 -6
  22. package/src/colors/hslToRgb.test.js +2 -2
  23. package/src/colors/hsvToRgb.d.ts +5 -7
  24. package/src/colors/hsvToRgb.js +3 -5
  25. package/src/colors/hsvToRgb.test.js +2 -2
  26. package/src/colors/hueToColorComponent.d.ts +1 -3
  27. package/src/colors/hueToColorComponent.js +2 -4
  28. package/src/colors/index.d.ts +11 -12
  29. package/src/colors/index.js +12 -13
  30. package/src/colors/rgbToHex.d.ts +3 -5
  31. package/src/colors/rgbToHex.js +2 -4
  32. package/src/colors/rgbToHex.test.js +2 -2
  33. package/src/colors/rgbToHsl.d.ts +5 -7
  34. package/src/colors/rgbToHsl.js +2 -4
  35. package/src/colors/rgbToHsl.test.js +2 -2
  36. package/src/colors/rgbToHsv.d.ts +5 -7
  37. package/src/colors/rgbToHsv.js +2 -4
  38. package/src/colors/rgbToHsv.test.js +2 -2
  39. package/src/connectors/create.js +3 -5
  40. package/src/connectors/create.test.js +3 -3
  41. package/src/connectors/extends.js +7 -8
  42. package/src/connectors/fromPointAxisNormal.js +6 -8
  43. package/src/connectors/fromPointAxisNormal.test.js +3 -3
  44. package/src/connectors/index.js +7 -9
  45. package/src/connectors/normalize.js +7 -9
  46. package/src/connectors/toString.js +1 -3
  47. package/src/connectors/transform.js +10 -12
  48. package/src/connectors/transform.test.js +3 -3
  49. package/src/connectors/transformationBetween.js +25 -27
  50. package/src/connectors/transformationBetween.test.js +13 -13
  51. package/src/curves/bezier/arcLengthToT.d.ts +2 -4
  52. package/src/curves/bezier/arcLengthToT.js +6 -8
  53. package/src/curves/bezier/arcLengthToT.test.js +13 -13
  54. package/src/curves/bezier/create.d.ts +2 -4
  55. package/src/curves/bezier/create.js +3 -5
  56. package/src/curves/bezier/create.test.js +2 -2
  57. package/src/curves/bezier/index.d.ts +7 -8
  58. package/src/curves/bezier/index.js +9 -8
  59. package/src/curves/bezier/length.d.ts +2 -4
  60. package/src/curves/bezier/length.js +4 -6
  61. package/src/curves/bezier/length.test.js +12 -12
  62. package/src/curves/bezier/lengths.d.ts +2 -4
  63. package/src/curves/bezier/lengths.js +5 -7
  64. package/src/curves/bezier/lengths.test.js +12 -12
  65. package/src/curves/bezier/tangentAt.d.ts +2 -4
  66. package/src/curves/bezier/tangentAt.js +2 -4
  67. package/src/curves/bezier/tangentAt.test.js +2 -2
  68. package/src/curves/bezier/type.d.ts +1 -3
  69. package/src/curves/bezier/valueAt.d.ts +2 -4
  70. package/src/curves/bezier/valueAt.js +2 -4
  71. package/src/curves/bezier/valueAt.test.js +2 -2
  72. package/src/curves/index.d.ts +1 -3
  73. package/src/curves/index.js +4 -5
  74. package/src/geometries/geom2/applyTransforms.js +7 -13
  75. package/src/geometries/geom2/applyTransforms.test.js +6 -6
  76. package/src/geometries/geom2/clone.d.ts +2 -4
  77. package/src/geometries/geom2/clone.js +3 -5
  78. package/src/geometries/geom2/clone.test.js +5 -5
  79. package/src/geometries/geom2/create.d.ts +3 -5
  80. package/src/geometries/geom2/create.js +19 -19
  81. package/src/geometries/geom2/create.test.js +6 -6
  82. package/src/geometries/geom2/fromCompactBinary.d.ts +2 -4
  83. package/src/geometries/geom2/fromCompactBinary.js +19 -11
  84. package/src/geometries/geom2/fromSides.d.ts +4 -0
  85. package/src/geometries/geom2/fromSides.js +115 -0
  86. package/src/geometries/geom2/fromToCompactBinary.test.js +16 -38
  87. package/src/geometries/geom2/index.d.ts +14 -15
  88. package/src/geometries/geom2/index.js +17 -24
  89. package/src/geometries/geom2/isA.d.ts +2 -4
  90. package/src/geometries/geom2/isA.js +4 -6
  91. package/src/geometries/geom2/isA.test.js +5 -3
  92. package/src/geometries/geom2/reverse.d.ts +2 -4
  93. package/src/geometries/geom2/reverse.js +12 -14
  94. package/src/geometries/geom2/reverse.test.js +29 -9
  95. package/src/geometries/geom2/toCompactBinary.d.ts +2 -4
  96. package/src/geometries/geom2/toCompactBinary.js +18 -15
  97. package/src/geometries/geom2/toOutlines.d.ts +3 -5
  98. package/src/geometries/geom2/toOutlines.js +3 -109
  99. package/src/geometries/geom2/toOutlines.test.js +34 -61
  100. package/src/geometries/geom2/toPoints.d.ts +3 -5
  101. package/src/geometries/geom2/toPoints.js +10 -13
  102. package/src/geometries/geom2/toPoints.test.js +8 -8
  103. package/src/geometries/geom2/toSides.d.ts +3 -5
  104. package/src/geometries/geom2/toSides.js +13 -6
  105. package/src/geometries/geom2/toString.d.ts +2 -4
  106. package/src/geometries/geom2/toString.js +9 -11
  107. package/src/geometries/geom2/toString.test.js +17 -0
  108. package/src/geometries/geom2/transform.d.ts +3 -5
  109. package/src/geometries/geom2/transform.js +9 -11
  110. package/src/geometries/geom2/transform.test.js +28 -29
  111. package/src/geometries/geom2/type.d.ts +5 -7
  112. package/src/geometries/geom2/validate.d.ts +1 -3
  113. package/src/geometries/geom2/validate.js +34 -13
  114. package/src/geometries/geom2/validate.test.js +39 -0
  115. package/src/geometries/geom3/applyTransforms.js +5 -7
  116. package/src/geometries/geom3/applyTransforms.test.js +6 -6
  117. package/src/geometries/geom3/clone.d.ts +2 -4
  118. package/src/geometries/geom3/clone.js +3 -5
  119. package/src/geometries/geom3/clone.test.js +5 -5
  120. package/src/geometries/geom3/create.d.ts +3 -5
  121. package/src/geometries/geom3/create.js +17 -8
  122. package/src/geometries/geom3/create.test.js +5 -5
  123. package/src/geometries/geom3/fromCompactBinary.d.ts +2 -4
  124. package/src/geometries/geom3/fromCompactBinary.js +6 -8
  125. package/src/geometries/geom3/fromPoints.d.ts +3 -5
  126. package/src/geometries/geom3/fromPoints.js +11 -19
  127. package/src/geometries/geom3/fromPoints.test.js +6 -6
  128. package/src/geometries/geom3/fromPointsConvex.d.ts +3 -5
  129. package/src/geometries/geom3/fromPointsConvex.js +6 -7
  130. package/src/geometries/geom3/fromPointsConvex.test.js +6 -5
  131. package/src/geometries/geom3/fromToCompactBinary.test.js +7 -7
  132. package/src/geometries/geom3/index.d.ts +14 -15
  133. package/src/geometries/geom3/index.js +22 -30
  134. package/src/geometries/geom3/invert.d.ts +2 -4
  135. package/src/geometries/geom3/invert.js +8 -10
  136. package/src/geometries/geom3/invert.test.js +5 -5
  137. package/src/geometries/geom3/isA.d.ts +2 -4
  138. package/src/geometries/geom3/isA.js +2 -4
  139. package/src/geometries/geom3/isA.test.js +2 -2
  140. package/src/geometries/geom3/toCompactBinary.d.ts +2 -4
  141. package/src/geometries/geom3/toCompactBinary.js +10 -12
  142. package/src/geometries/geom3/toPoints.d.ts +3 -5
  143. package/src/geometries/geom3/toPoints.js +5 -8
  144. package/src/geometries/geom3/toPoints.test.js +9 -9
  145. package/src/geometries/geom3/toPolygons.d.ts +3 -5
  146. package/src/geometries/geom3/toPolygons.js +4 -6
  147. package/src/geometries/geom3/toString.d.ts +2 -4
  148. package/src/geometries/geom3/toString.js +5 -7
  149. package/src/geometries/geom3/toString.test.js +17 -0
  150. package/src/geometries/geom3/transform.d.ts +3 -5
  151. package/src/geometries/geom3/transform.js +6 -8
  152. package/src/geometries/geom3/transform.test.js +6 -6
  153. package/src/geometries/geom3/type.d.ts +4 -6
  154. package/src/geometries/geom3/validate.d.ts +1 -3
  155. package/src/geometries/geom3/validate.js +5 -6
  156. package/src/geometries/geom3/validate.test.js +26 -0
  157. package/src/geometries/index.d.ts +6 -7
  158. package/src/geometries/index.js +10 -10
  159. package/src/geometries/path2/appendArc.d.ts +4 -6
  160. package/src/geometries/path2/appendArc.js +58 -60
  161. package/src/geometries/path2/appendArc.test.js +8 -7
  162. package/src/geometries/path2/appendBezier.d.ts +3 -5
  163. package/src/geometries/path2/appendBezier.js +41 -43
  164. package/src/geometries/path2/appendBezier.test.js +3 -3
  165. package/src/geometries/path2/appendPoints.d.ts +3 -5
  166. package/src/geometries/path2/appendPoints.js +6 -8
  167. package/src/geometries/path2/appendPoints.test.js +2 -2
  168. package/src/geometries/path2/applyTransforms.js +3 -5
  169. package/src/geometries/path2/applyTransforms.test.js +4 -4
  170. package/src/geometries/path2/clone.d.ts +2 -4
  171. package/src/geometries/path2/clone.js +3 -5
  172. package/src/geometries/path2/close.d.ts +2 -4
  173. package/src/geometries/path2/close.js +6 -8
  174. package/src/geometries/path2/close.test.js +2 -2
  175. package/src/geometries/path2/concat.d.ts +2 -4
  176. package/src/geometries/path2/concat.js +11 -13
  177. package/src/geometries/path2/concat.test.js +2 -2
  178. package/src/geometries/path2/create.d.ts +3 -5
  179. package/src/geometries/path2/create.js +12 -9
  180. package/src/geometries/path2/create.test.js +2 -2
  181. package/src/geometries/path2/equals.d.ts +2 -4
  182. package/src/geometries/path2/equals.js +9 -11
  183. package/src/geometries/path2/equals.test.js +2 -2
  184. package/src/geometries/path2/fromCompactBinary.d.ts +2 -4
  185. package/src/geometries/path2/fromCompactBinary.js +5 -7
  186. package/src/geometries/path2/fromPoints.d.ts +3 -5
  187. package/src/geometries/path2/fromPoints.js +9 -11
  188. package/src/geometries/path2/fromPoints.test.js +3 -3
  189. package/src/geometries/path2/fromToCompactBinary.test.js +2 -2
  190. package/src/geometries/path2/index.d.ts +18 -19
  191. package/src/geometries/path2/index.js +19 -28
  192. package/src/geometries/path2/isA.d.ts +2 -4
  193. package/src/geometries/path2/isA.js +2 -4
  194. package/src/geometries/path2/isA.test.js +2 -2
  195. package/src/geometries/path2/reverse.d.ts +2 -4
  196. package/src/geometries/path2/reverse.js +5 -7
  197. package/src/geometries/path2/reverse.test.js +2 -2
  198. package/src/geometries/path2/toCompactBinary.d.ts +2 -4
  199. package/src/geometries/path2/toCompactBinary.js +2 -4
  200. package/src/geometries/path2/toPoints.d.ts +3 -5
  201. package/src/geometries/path2/toPoints.js +4 -6
  202. package/src/geometries/path2/toPoints.test.js +3 -3
  203. package/src/geometries/path2/toString.d.ts +2 -4
  204. package/src/geometries/path2/toString.js +5 -7
  205. package/src/geometries/path2/transform.d.ts +3 -5
  206. package/src/geometries/path2/transform.js +6 -8
  207. package/src/geometries/path2/transform.test.js +5 -5
  208. package/src/geometries/path2/type.d.ts +4 -6
  209. package/src/geometries/path2/validate.d.ts +1 -3
  210. package/src/geometries/path2/validate.js +6 -7
  211. package/src/geometries/poly2/arePointsInside.d.ts +3 -5
  212. package/src/geometries/poly2/arePointsInside.js +21 -24
  213. package/src/geometries/poly2/arePointsInside.test.js +2 -2
  214. package/src/geometries/poly2/clone.d.ts +3 -0
  215. package/src/geometries/poly2/clone.js +8 -0
  216. package/src/geometries/poly2/clone.test.js +17 -0
  217. package/src/geometries/poly2/create.d.ts +3 -5
  218. package/src/geometries/poly2/create.js +11 -12
  219. package/src/geometries/poly2/create.test.js +4 -4
  220. package/src/geometries/poly2/index.d.ts +14 -6
  221. package/src/geometries/poly2/index.js +16 -11
  222. package/src/geometries/poly2/isA.d.ts +3 -0
  223. package/src/geometries/poly2/isA.js +16 -0
  224. package/src/geometries/poly2/isA.test.js +30 -0
  225. package/src/geometries/poly2/isConvex.d.ts +3 -0
  226. package/src/geometries/poly2/isConvex.js +37 -0
  227. package/src/geometries/poly2/isConvex.test.js +27 -0
  228. package/src/geometries/poly2/isSimple.d.ts +3 -0
  229. package/src/geometries/poly2/isSimple.js +38 -0
  230. package/src/geometries/poly2/isSimple.test.js +31 -0
  231. package/src/geometries/poly2/measureArea.d.ts +2 -4
  232. package/src/geometries/poly2/measureArea.js +5 -7
  233. package/src/geometries/poly2/measureArea.test.js +2 -2
  234. package/src/geometries/poly2/measureBoundingBox.d.ts +4 -0
  235. package/src/geometries/poly2/measureBoundingBox.js +18 -0
  236. package/src/geometries/poly2/measureBoundingBox.test.js +71 -0
  237. package/src/geometries/poly2/reverse.d.ts +3 -0
  238. package/src/geometries/poly2/reverse.js +13 -0
  239. package/src/geometries/poly2/reverse.test.js +27 -0
  240. package/src/geometries/poly2/toPoints.d.ts +4 -0
  241. package/src/geometries/poly2/toPoints.js +8 -0
  242. package/src/geometries/poly2/toPoints.test.js +18 -0
  243. package/src/geometries/poly2/toString.d.ts +3 -0
  244. package/src/geometries/poly2/toString.js +9 -0
  245. package/src/geometries/poly2/toString.test.js +10 -0
  246. package/src/geometries/poly2/transform.d.ts +4 -0
  247. package/src/geometries/poly2/transform.js +20 -0
  248. package/src/geometries/poly2/transform.test.js +62 -0
  249. package/src/geometries/poly2/type.d.ts +5 -5
  250. package/src/geometries/poly2/validate.d.ts +2 -0
  251. package/src/geometries/poly2/validate.js +46 -0
  252. package/src/geometries/poly2/validate.test.js +31 -0
  253. package/src/geometries/poly3/clone.d.ts +3 -5
  254. package/src/geometries/poly3/clone.js +6 -8
  255. package/src/geometries/poly3/clone.test.js +6 -5
  256. package/src/geometries/poly3/create.d.ts +3 -5
  257. package/src/geometries/poly3/create.js +6 -6
  258. package/src/geometries/poly3/create.test.js +15 -3
  259. package/src/geometries/poly3/fromVerticesAndPlane.d.ts +5 -0
  260. package/src/geometries/poly3/{fromPointsAndPlane.js → fromVerticesAndPlane.js} +5 -7
  261. package/src/geometries/poly3/index.d.ts +16 -18
  262. package/src/geometries/poly3/index.js +17 -22
  263. package/src/geometries/poly3/invert.d.ts +2 -4
  264. package/src/geometries/poly3/invert.js +6 -7
  265. package/src/geometries/poly3/invert.test.js +5 -5
  266. package/src/geometries/poly3/isA.d.ts +2 -4
  267. package/src/geometries/poly3/isA.js +2 -4
  268. package/src/geometries/poly3/isA.test.js +3 -3
  269. package/src/geometries/poly3/isConvex.d.ts +2 -4
  270. package/src/geometries/poly3/isConvex.js +21 -23
  271. package/src/geometries/poly3/isConvex.test.js +9 -9
  272. package/src/geometries/poly3/measureArea.d.ts +2 -4
  273. package/src/geometries/poly3/measureArea.js +4 -6
  274. package/src/geometries/poly3/measureArea.test.js +12 -11
  275. package/src/geometries/poly3/measureBoundingBox.d.ts +3 -5
  276. package/src/geometries/poly3/measureBoundingBox.js +6 -8
  277. package/src/geometries/poly3/measureBoundingBox.test.js +9 -8
  278. package/src/geometries/poly3/measureBoundingSphere.d.ts +3 -5
  279. package/src/geometries/poly3/measureBoundingSphere.js +4 -6
  280. package/src/geometries/poly3/measureBoundingSphere.test.js +8 -7
  281. package/src/geometries/poly3/measureSignedVolume.d.ts +2 -4
  282. package/src/geometries/poly3/measureSignedVolume.js +4 -6
  283. package/src/geometries/poly3/measureSignedVolume.test.js +8 -8
  284. package/src/geometries/poly3/plane.d.ts +3 -5
  285. package/src/geometries/poly3/plane.js +2 -4
  286. package/src/geometries/poly3/toString.d.ts +2 -4
  287. package/src/geometries/poly3/toString.js +4 -12
  288. package/src/geometries/poly3/toString.test.js +10 -0
  289. package/src/geometries/poly3/toVertices.d.ts +4 -0
  290. package/src/geometries/poly3/toVertices.js +8 -0
  291. package/src/geometries/poly3/transform.d.ts +3 -5
  292. package/src/geometries/poly3/transform.js +7 -9
  293. package/src/geometries/poly3/transform.test.js +7 -7
  294. package/src/geometries/poly3/type.d.ts +6 -6
  295. package/src/geometries/poly3/validate.d.ts +1 -3
  296. package/src/geometries/poly3/validate.js +14 -15
  297. package/src/geometries/slice/calculatePlane.d.ts +5 -0
  298. package/src/geometries/slice/calculatePlane.js +65 -0
  299. package/src/geometries/slice/calculatePlane.test.js +43 -0
  300. package/src/geometries/slice/clone.d.ts +3 -0
  301. package/src/geometries/slice/clone.js +9 -0
  302. package/src/geometries/slice/clone.test.js +14 -0
  303. package/src/geometries/slice/create.d.ts +4 -0
  304. package/src/geometries/slice/create.js +18 -0
  305. package/src/{operations/extrusions → geometries}/slice/create.test.js +3 -3
  306. package/src/{operations/extrusions → geometries/slice}/earcut/assignHoles.js +6 -8
  307. package/src/geometries/slice/earcut/assignHoles.test.js +75 -0
  308. package/src/{operations/extrusions → geometries/slice}/earcut/eliminateHoles.js +3 -5
  309. package/src/{operations/extrusions → geometries/slice}/earcut/index.js +7 -8
  310. package/src/{operations/extrusions → geometries/slice}/earcut/linkedList.js +3 -6
  311. package/src/{operations/extrusions → geometries/slice}/earcut/linkedListSort.js +1 -4
  312. package/src/{operations/extrusions → geometries/slice}/earcut/linkedPolygon.js +8 -10
  313. package/src/{operations/extrusions → geometries/slice}/earcut/polygonHierarchy.js +13 -13
  314. package/src/{operations/extrusions → geometries/slice}/earcut/triangle.js +2 -5
  315. package/src/geometries/slice/equals.d.ts +3 -0
  316. package/src/geometries/slice/equals.js +27 -0
  317. package/src/geometries/slice/equals.test.js +17 -0
  318. package/src/geometries/slice/fromGeom2.d.ts +5 -0
  319. package/src/geometries/slice/fromGeom2.js +17 -0
  320. package/src/geometries/slice/fromVertices.d.ts +7 -0
  321. package/src/geometries/slice/fromVertices.js +34 -0
  322. package/src/geometries/slice/fromVertices.test.js +11 -0
  323. package/src/geometries/slice/index.d.ts +16 -0
  324. package/src/geometries/slice/index.js +23 -0
  325. package/src/geometries/slice/isA.d.ts +3 -0
  326. package/src/geometries/slice/isA.js +16 -0
  327. package/src/{operations/extrusions → geometries}/slice/isA.test.js +3 -3
  328. package/src/geometries/slice/reverse.d.ts +3 -0
  329. package/src/geometries/slice/reverse.js +14 -0
  330. package/src/geometries/slice/toEdges.d.ts +3 -0
  331. package/src/geometries/slice/toEdges.js +20 -0
  332. package/src/geometries/slice/toPolygons.d.ts +5 -0
  333. package/src/{operations/extrusions → geometries}/slice/toPolygons.js +9 -10
  334. package/src/geometries/slice/toString.d.ts +3 -0
  335. package/src/geometries/slice/toString.js +16 -0
  336. package/src/geometries/slice/toString.test.js +17 -0
  337. package/src/geometries/slice/toVertices.d.ts +4 -0
  338. package/src/geometries/slice/toVertices.js +19 -0
  339. package/src/geometries/slice/transform.d.ts +5 -0
  340. package/src/geometries/slice/transform.js +19 -0
  341. package/src/{operations/extrusions → geometries}/slice/transform.test.js +11 -21
  342. package/src/geometries/slice/type.d.ts +7 -0
  343. package/src/geometries/slice/validate.d.ts +1 -0
  344. package/src/geometries/slice/validate.js +48 -0
  345. package/src/geometries/slice/validate.test.js +36 -0
  346. package/src/geometries/types.d.ts +12 -10
  347. package/src/index.d.ts +2 -4
  348. package/src/index.js +14 -16
  349. package/src/index.test-d.ts +3 -3
  350. package/src/maths/constants.d.ts +1 -1
  351. package/src/maths/constants.js +10 -20
  352. package/src/maths/index.d.ts +9 -11
  353. package/src/maths/index.js +11 -12
  354. package/src/maths/line2/clone.d.ts +2 -4
  355. package/src/maths/line2/clone.js +4 -6
  356. package/src/maths/line2/clone.test.js +4 -3
  357. package/src/maths/line2/closestPoint.d.ts +3 -5
  358. package/src/maths/line2/closestPoint.js +7 -9
  359. package/src/maths/line2/closestPoint.test.js +4 -3
  360. package/src/maths/line2/copy.d.ts +2 -4
  361. package/src/maths/line2/copy.js +4 -6
  362. package/src/maths/line2/copy.test.js +4 -3
  363. package/src/maths/line2/create.d.ts +2 -4
  364. package/src/maths/line2/create.js +5 -8
  365. package/src/maths/line2/create.test.js +3 -3
  366. package/src/maths/line2/direction.d.ts +3 -5
  367. package/src/maths/line2/direction.js +4 -6
  368. package/src/maths/line2/direction.test.js +3 -3
  369. package/src/maths/line2/distanceToPoint.d.ts +3 -5
  370. package/src/maths/line2/distanceToPoint.js +5 -7
  371. package/src/maths/line2/distanceToPoint.test.js +6 -4
  372. package/src/maths/line2/equals.d.ts +2 -4
  373. package/src/maths/line2/equals.js +4 -6
  374. package/src/maths/line2/equals.test.js +3 -2
  375. package/src/maths/line2/fromPoints.d.ts +3 -5
  376. package/src/maths/line2/fromPoints.js +6 -8
  377. package/src/maths/line2/fromPoints.test.js +4 -3
  378. package/src/maths/line2/fromValues.d.ts +2 -4
  379. package/src/maths/line2/fromValues.js +6 -8
  380. package/src/maths/line2/fromValues.test.js +4 -3
  381. package/src/maths/line2/index.d.ts +16 -17
  382. package/src/maths/line2/index.js +16 -18
  383. package/src/maths/line2/intersectPointOfLines.d.ts +3 -5
  384. package/src/maths/line2/intersectPointOfLines.js +7 -8
  385. package/src/maths/line2/intersectPointOfLines.test.js +4 -3
  386. package/src/maths/line2/origin.d.ts +3 -5
  387. package/src/maths/line2/origin.js +4 -6
  388. package/src/maths/line2/origin.test.js +4 -3
  389. package/src/maths/line2/reverse.d.ts +2 -4
  390. package/src/maths/line2/reverse.js +7 -9
  391. package/src/maths/line2/reverse.test.js +4 -3
  392. package/src/maths/line2/toString.d.ts +2 -4
  393. package/src/maths/line2/toString.js +3 -5
  394. package/src/maths/line2/transform.d.ts +3 -5
  395. package/src/maths/line2/transform.js +9 -11
  396. package/src/maths/line2/transform.test.js +4 -3
  397. package/src/maths/line2/type.d.ts +1 -3
  398. package/src/maths/line2/xAtY.d.ts +2 -4
  399. package/src/maths/line2/xAtY.js +5 -7
  400. package/src/maths/line2/xAtY.test.js +6 -4
  401. package/src/maths/line3/clone.d.ts +2 -4
  402. package/src/maths/line3/clone.js +5 -7
  403. package/src/maths/line3/clone.test.js +4 -3
  404. package/src/maths/line3/closestPoint.d.ts +3 -5
  405. package/src/maths/line3/closestPoint.js +12 -14
  406. package/src/maths/line3/closestPoint.test.js +4 -3
  407. package/src/maths/line3/copy.d.ts +2 -4
  408. package/src/maths/line3/copy.js +5 -7
  409. package/src/maths/line3/copy.test.js +4 -3
  410. package/src/maths/line3/create.d.ts +2 -4
  411. package/src/maths/line3/create.js +4 -7
  412. package/src/maths/line3/create.test.js +3 -3
  413. package/src/maths/line3/direction.d.ts +3 -5
  414. package/src/maths/line3/direction.js +3 -5
  415. package/src/maths/line3/direction.test.js +4 -3
  416. package/src/maths/line3/distanceToPoint.d.ts +3 -5
  417. package/src/maths/line3/distanceToPoint.js +8 -10
  418. package/src/maths/line3/distanceToPoint.test.js +6 -4
  419. package/src/maths/line3/equals.d.ts +2 -4
  420. package/src/maths/line3/equals.js +4 -6
  421. package/src/maths/line3/equals.test.js +3 -2
  422. package/src/maths/line3/fromPlanes.d.ts +3 -5
  423. package/src/maths/line3/fromPlanes.js +14 -17
  424. package/src/maths/line3/fromPlanes.test.js +4 -4
  425. package/src/maths/line3/fromPointAndDirection.d.ts +3 -5
  426. package/src/maths/line3/fromPointAndDirection.js +6 -8
  427. package/src/maths/line3/fromPointAndDirection.test.js +4 -3
  428. package/src/maths/line3/fromPoints.d.ts +3 -5
  429. package/src/maths/line3/fromPoints.js +7 -9
  430. package/src/maths/line3/fromPoints.test.js +4 -3
  431. package/src/maths/line3/index.d.ts +16 -17
  432. package/src/maths/line3/index.js +16 -18
  433. package/src/maths/line3/intersectPointOfLineAndPlane.d.ts +4 -6
  434. package/src/maths/line3/intersectPointOfLineAndPlane.js +10 -13
  435. package/src/maths/line3/intersectPointOfLineAndPlane.test.js +4 -4
  436. package/src/maths/line3/origin.d.ts +3 -5
  437. package/src/maths/line3/origin.js +3 -5
  438. package/src/maths/line3/origin.test.js +4 -3
  439. package/src/maths/line3/reverse.d.ts +2 -4
  440. package/src/maths/line3/reverse.js +6 -8
  441. package/src/maths/line3/reverse.test.js +4 -3
  442. package/src/maths/line3/toString.d.ts +2 -4
  443. package/src/maths/line3/toString.js +3 -5
  444. package/src/maths/line3/transform.d.ts +3 -5
  445. package/src/maths/line3/transform.js +10 -12
  446. package/src/maths/line3/transform.test.js +4 -3
  447. package/src/maths/line3/type.d.ts +2 -4
  448. package/src/maths/mat4/add.d.ts +2 -4
  449. package/src/maths/mat4/add.js +5 -7
  450. package/src/maths/mat4/add.test.js +4 -3
  451. package/src/maths/mat4/clone.d.ts +2 -4
  452. package/src/maths/mat4/clone.js +4 -6
  453. package/src/maths/mat4/clone.test.js +4 -3
  454. package/src/maths/mat4/copy.d.ts +2 -4
  455. package/src/maths/mat4/copy.js +4 -6
  456. package/src/maths/mat4/copy.test.js +4 -3
  457. package/src/maths/mat4/create.d.ts +2 -4
  458. package/src/maths/mat4/create.js +2 -5
  459. package/src/maths/mat4/create.test.js +3 -3
  460. package/src/maths/mat4/equals.d.ts +2 -4
  461. package/src/maths/mat4/equals.js +4 -6
  462. package/src/maths/mat4/equals.test.js +3 -2
  463. package/src/maths/mat4/fromRotation.d.ts +3 -5
  464. package/src/maths/mat4/fromRotation.js +8 -10
  465. package/src/maths/mat4/fromRotation.test.js +4 -3
  466. package/src/maths/mat4/fromScaling.d.ts +3 -5
  467. package/src/maths/mat4/fromScaling.js +4 -6
  468. package/src/maths/mat4/fromScaling.test.js +4 -3
  469. package/src/maths/mat4/fromTaitBryanRotation.d.ts +2 -4
  470. package/src/maths/mat4/fromTaitBryanRotation.js +7 -9
  471. package/src/maths/mat4/fromTaitBryanRotation.test.js +3 -3
  472. package/src/maths/mat4/fromTranslation.d.ts +3 -5
  473. package/src/maths/mat4/fromTranslation.js +4 -6
  474. package/src/maths/mat4/fromTranslation.test.js +4 -3
  475. package/src/maths/mat4/fromValues.d.ts +2 -4
  476. package/src/maths/mat4/fromValues.js +19 -21
  477. package/src/maths/mat4/fromValues.test.js +4 -3
  478. package/src/maths/mat4/fromVectorRotation.d.ts +3 -5
  479. package/src/maths/mat4/fromVectorRotation.js +8 -10
  480. package/src/maths/mat4/fromVectorRotation.test.js +4 -5
  481. package/src/maths/mat4/fromXRotation.d.ts +2 -4
  482. package/src/maths/mat4/fromXRotation.js +5 -7
  483. package/src/maths/mat4/fromXRotation.test.js +4 -3
  484. package/src/maths/mat4/fromYRotation.d.ts +2 -4
  485. package/src/maths/mat4/fromYRotation.js +5 -7
  486. package/src/maths/mat4/fromYRotation.test.js +4 -3
  487. package/src/maths/mat4/fromZRotation.d.ts +2 -4
  488. package/src/maths/mat4/fromZRotation.js +5 -7
  489. package/src/maths/mat4/fromZRotation.test.js +4 -3
  490. package/src/maths/mat4/identity.d.ts +2 -4
  491. package/src/maths/mat4/identity.js +3 -5
  492. package/src/maths/mat4/identity.test.js +4 -3
  493. package/src/maths/mat4/index.d.ts +30 -28
  494. package/src/maths/mat4/index.js +29 -31
  495. package/src/maths/mat4/invert.d.ts +3 -0
  496. package/src/maths/mat4/invert.js +7 -7
  497. package/src/maths/mat4/invert.test.js +6 -5
  498. package/src/maths/mat4/isIdentity.d.ts +2 -4
  499. package/src/maths/mat4/isIdentity.js +4 -6
  500. package/src/maths/mat4/isIdentity.test.js +2 -2
  501. package/src/maths/mat4/isMirroring.d.ts +2 -4
  502. package/src/maths/mat4/isMirroring.js +4 -6
  503. package/src/maths/mat4/isMirroring.test.js +3 -3
  504. package/src/maths/mat4/isOnlyTransformScale.d.ts +3 -0
  505. package/src/maths/mat4/isOnlyTransformScale.js +7 -5
  506. package/src/maths/mat4/isOnlyTransformScale.test.js +3 -3
  507. package/src/maths/mat4/mirrorByPlane.d.ts +3 -5
  508. package/src/maths/mat4/mirrorByPlane.js +4 -6
  509. package/src/maths/mat4/mirrorByPlane.test.js +4 -4
  510. package/src/maths/mat4/multiply.d.ts +2 -4
  511. package/src/maths/mat4/multiply.js +5 -7
  512. package/src/maths/mat4/multiply.test.js +4 -3
  513. package/src/maths/mat4/rotate.d.ts +3 -5
  514. package/src/maths/mat4/rotate.js +9 -11
  515. package/src/maths/mat4/rotate.test.js +6 -5
  516. package/src/maths/mat4/rotateX.d.ts +2 -4
  517. package/src/maths/mat4/rotateX.js +6 -8
  518. package/src/maths/mat4/rotateX.test.js +4 -3
  519. package/src/maths/mat4/rotateY.d.ts +2 -4
  520. package/src/maths/mat4/rotateY.js +6 -8
  521. package/src/maths/mat4/rotateY.test.js +4 -3
  522. package/src/maths/mat4/rotateZ.d.ts +2 -4
  523. package/src/maths/mat4/rotateZ.js +6 -8
  524. package/src/maths/mat4/rotateZ.test.js +4 -3
  525. package/src/maths/mat4/scale.d.ts +3 -5
  526. package/src/maths/mat4/scale.js +5 -7
  527. package/src/maths/mat4/scale.test.js +4 -3
  528. package/src/maths/mat4/subtract.d.ts +2 -4
  529. package/src/maths/mat4/subtract.js +5 -7
  530. package/src/maths/mat4/subtract.test.js +4 -3
  531. package/src/maths/mat4/toString.d.ts +2 -4
  532. package/src/maths/mat4/toString.js +3 -5
  533. package/src/maths/mat4/translate.d.ts +3 -5
  534. package/src/maths/mat4/translate.js +5 -7
  535. package/src/maths/mat4/translate.test.js +11 -15
  536. package/src/maths/mat4/type.d.ts +1 -3
  537. package/src/maths/plane/clone.d.ts +2 -4
  538. package/src/maths/plane/clone.test.js +4 -3
  539. package/src/maths/plane/copy.d.ts +2 -4
  540. package/src/maths/plane/copy.test.js +4 -3
  541. package/src/maths/plane/create.d.ts +2 -4
  542. package/src/maths/plane/create.test.js +3 -3
  543. package/src/maths/plane/equals.d.ts +2 -4
  544. package/src/maths/plane/equals.test.js +3 -2
  545. package/src/maths/plane/flip.d.ts +2 -4
  546. package/src/maths/plane/flip.js +4 -6
  547. package/src/maths/plane/flip.test.js +4 -3
  548. package/src/maths/plane/fromNormalAndPoint.d.ts +3 -5
  549. package/src/maths/plane/fromNormalAndPoint.js +6 -9
  550. package/src/maths/plane/fromNormalAndPoint.test.js +4 -3
  551. package/src/maths/plane/fromPoints.d.ts +3 -5
  552. package/src/maths/plane/fromPoints.js +4 -6
  553. package/src/maths/plane/fromPoints.test.js +4 -3
  554. package/src/maths/plane/fromPointsRandom.d.ts +3 -5
  555. package/src/maths/plane/fromPointsRandom.js +8 -10
  556. package/src/maths/plane/fromValues.d.ts +2 -4
  557. package/src/maths/plane/index.d.ts +14 -16
  558. package/src/maths/plane/index.js +38 -40
  559. package/src/maths/plane/projectionOfPoint.d.ts +3 -5
  560. package/src/maths/plane/projectionOfPoint.js +5 -7
  561. package/src/maths/plane/projectionOfPoint.test.js +3 -3
  562. package/src/maths/plane/signedDistanceToPoint.d.ts +3 -5
  563. package/src/maths/plane/signedDistanceToPoint.js +5 -7
  564. package/src/maths/plane/signedDistanceToPoint.test.js +3 -2
  565. package/src/maths/plane/toString.d.ts +2 -4
  566. package/src/maths/plane/transform.d.ts +3 -5
  567. package/src/maths/plane/transform.js +11 -13
  568. package/src/maths/plane/transform.test.js +4 -3
  569. package/src/maths/plane/type.d.ts +1 -3
  570. package/src/maths/rotation.test.js +4 -4
  571. package/src/maths/types.d.ts +15 -8
  572. package/src/maths/utils/OrthonormalFormula.d.ts +9 -0
  573. package/src/maths/utils/OrthonormalFormula.js +82 -0
  574. package/src/maths/utils/OrthonormalFormula.test.js +72 -0
  575. package/src/maths/utils/aboutEqualNormals.d.ts +2 -4
  576. package/src/maths/utils/aboutEqualNormals.js +4 -6
  577. package/src/maths/utils/area.d.ts +2 -4
  578. package/src/maths/utils/area.js +2 -4
  579. package/src/maths/utils/interpolateBetween2DPointsForY.d.ts +2 -4
  580. package/src/maths/utils/interpolateBetween2DPointsForY.js +4 -6
  581. package/src/maths/utils/intersect.d.ts +2 -4
  582. package/src/maths/utils/intersect.js +14 -9
  583. package/src/maths/utils/intersect.test.js +40 -0
  584. package/src/maths/utils/solve2Linear.d.ts +2 -4
  585. package/src/maths/utils/solve2Linear.js +1 -3
  586. package/src/maths/utils/trigonometry.js +7 -9
  587. package/src/maths/utils/trigonometry.test.js +3 -3
  588. package/src/maths/vec1/type.d.ts +1 -3
  589. package/src/maths/vec2/abs.d.ts +2 -4
  590. package/src/maths/vec2/abs.js +4 -6
  591. package/src/maths/vec2/abs.test.js +4 -3
  592. package/src/maths/vec2/add.d.ts +2 -4
  593. package/src/maths/vec2/add.js +5 -7
  594. package/src/maths/vec2/add.test.js +4 -3
  595. package/src/maths/vec2/angle.d.ts +1 -3
  596. package/src/maths/vec2/angle.js +1 -1
  597. package/src/maths/vec2/angleDegrees.d.ts +2 -4
  598. package/src/maths/vec2/angleDegrees.js +4 -6
  599. package/src/maths/vec2/angleDegrees.test.js +6 -4
  600. package/src/maths/vec2/angleRadians.d.ts +2 -4
  601. package/src/maths/vec2/angleRadians.js +3 -5
  602. package/src/maths/vec2/angleRadians.test.js +6 -4
  603. package/src/maths/vec2/clone.d.ts +2 -4
  604. package/src/maths/vec2/clone.js +4 -6
  605. package/src/maths/vec2/clone.test.js +4 -3
  606. package/src/maths/vec2/copy.d.ts +2 -4
  607. package/src/maths/vec2/copy.js +4 -6
  608. package/src/maths/vec2/copy.test.js +4 -3
  609. package/src/maths/vec2/create.d.ts +2 -4
  610. package/src/maths/vec2/create.js +2 -5
  611. package/src/maths/vec2/create.test.js +3 -3
  612. package/src/maths/vec2/cross.d.ts +3 -5
  613. package/src/maths/vec2/cross.js +5 -7
  614. package/src/maths/vec2/cross.test.js +14 -12
  615. package/src/maths/vec2/distance.d.ts +2 -4
  616. package/src/maths/vec2/distance.js +4 -6
  617. package/src/maths/vec2/distance.test.js +6 -4
  618. package/src/maths/vec2/divide.d.ts +2 -4
  619. package/src/maths/vec2/divide.js +5 -7
  620. package/src/maths/vec2/divide.test.js +4 -3
  621. package/src/maths/vec2/dot.d.ts +2 -4
  622. package/src/maths/vec2/dot.js +4 -6
  623. package/src/maths/vec2/dot.test.js +3 -2
  624. package/src/maths/vec2/equals.d.ts +2 -4
  625. package/src/maths/vec2/equals.js +3 -5
  626. package/src/maths/vec2/equals.test.js +3 -2
  627. package/src/maths/vec2/fromAngleDegrees.d.ts +2 -4
  628. package/src/maths/vec2/fromAngleDegrees.js +5 -7
  629. package/src/maths/vec2/fromAngleDegrees.test.js +4 -3
  630. package/src/maths/vec2/fromAngleRadians.d.ts +2 -4
  631. package/src/maths/vec2/fromAngleRadians.js +5 -7
  632. package/src/maths/vec2/fromAngleRadians.test.js +4 -4
  633. package/src/maths/vec2/fromScalar.d.ts +2 -4
  634. package/src/maths/vec2/fromScalar.js +4 -6
  635. package/src/maths/vec2/fromScalar.test.js +4 -3
  636. package/src/maths/vec2/fromValues.d.ts +2 -4
  637. package/src/maths/vec2/fromValues.js +5 -7
  638. package/src/maths/vec2/index.d.ts +34 -35
  639. package/src/maths/vec2/index.js +33 -35
  640. package/src/maths/vec2/length.d.ts +2 -4
  641. package/src/maths/vec2/length.js +3 -5
  642. package/src/maths/vec2/length.test.js +6 -4
  643. package/src/maths/vec2/lerp.d.ts +2 -4
  644. package/src/maths/vec2/lerp.js +6 -8
  645. package/src/maths/vec2/lerp.test.js +4 -3
  646. package/src/maths/vec2/max.d.ts +2 -4
  647. package/src/maths/vec2/max.js +5 -7
  648. package/src/maths/vec2/max.test.js +4 -3
  649. package/src/maths/vec2/min.d.ts +2 -4
  650. package/src/maths/vec2/min.js +5 -7
  651. package/src/maths/vec2/min.test.js +4 -3
  652. package/src/maths/vec2/multiply.d.ts +2 -4
  653. package/src/maths/vec2/multiply.js +5 -7
  654. package/src/maths/vec2/multiply.test.js +4 -3
  655. package/src/maths/vec2/negate.d.ts +2 -4
  656. package/src/maths/vec2/negate.js +4 -6
  657. package/src/maths/vec2/negate.test.js +4 -3
  658. package/src/maths/vec2/normal.d.ts +2 -4
  659. package/src/maths/vec2/normal.js +7 -9
  660. package/src/maths/vec2/normal.test.js +4 -3
  661. package/src/maths/vec2/normalize.d.ts +2 -4
  662. package/src/maths/vec2/normalize.js +4 -8
  663. package/src/maths/vec2/normalize.test.js +4 -3
  664. package/src/maths/vec2/rotate.d.ts +2 -4
  665. package/src/maths/vec2/rotate.js +6 -8
  666. package/src/maths/vec2/rotate.test.js +4 -4
  667. package/src/maths/vec2/scale.d.ts +2 -4
  668. package/src/maths/vec2/scale.js +5 -7
  669. package/src/maths/vec2/scale.test.js +4 -3
  670. package/src/maths/vec2/snap.d.ts +2 -4
  671. package/src/maths/vec2/snap.js +5 -7
  672. package/src/maths/vec2/snap.test.js +4 -3
  673. package/src/maths/vec2/squaredDistance.d.ts +2 -4
  674. package/src/maths/vec2/squaredDistance.js +4 -6
  675. package/src/maths/vec2/squaredDistance.test.js +6 -4
  676. package/src/maths/vec2/squaredLength.d.ts +2 -4
  677. package/src/maths/vec2/squaredLength.js +3 -5
  678. package/src/maths/vec2/squaredLength.test.js +6 -4
  679. package/src/maths/vec2/subtract.d.ts +2 -4
  680. package/src/maths/vec2/subtract.js +5 -7
  681. package/src/maths/vec2/subtract.test.js +4 -3
  682. package/src/maths/vec2/toString.d.ts +2 -4
  683. package/src/maths/vec2/toString.js +3 -5
  684. package/src/maths/vec2/transform.d.ts +3 -5
  685. package/src/maths/vec2/transform.js +5 -7
  686. package/src/maths/vec2/transform.test.js +4 -3
  687. package/src/maths/vec2/type.d.ts +1 -3
  688. package/src/maths/vec3/abs.d.ts +2 -4
  689. package/src/maths/vec3/abs.js +4 -6
  690. package/src/maths/vec3/abs.test.js +4 -3
  691. package/src/maths/vec3/add.d.ts +2 -4
  692. package/src/maths/vec3/add.js +5 -7
  693. package/src/maths/vec3/add.test.js +4 -3
  694. package/src/maths/vec3/angle.d.ts +2 -4
  695. package/src/maths/vec3/angle.js +5 -7
  696. package/src/maths/vec3/angle.test.js +6 -4
  697. package/src/maths/vec3/clone.d.ts +2 -4
  698. package/src/maths/vec3/clone.js +4 -6
  699. package/src/maths/vec3/clone.test.js +4 -3
  700. package/src/maths/vec3/copy.d.ts +2 -4
  701. package/src/maths/vec3/copy.js +4 -6
  702. package/src/maths/vec3/copy.test.js +4 -3
  703. package/src/maths/vec3/create.d.ts +2 -4
  704. package/src/maths/vec3/create.js +2 -5
  705. package/src/maths/vec3/create.test.js +3 -3
  706. package/src/maths/vec3/cross.d.ts +2 -4
  707. package/src/maths/vec3/cross.js +5 -7
  708. package/src/maths/vec3/cross.test.js +4 -3
  709. package/src/maths/vec3/distance.d.ts +2 -4
  710. package/src/maths/vec3/distance.js +4 -6
  711. package/src/maths/vec3/distance.test.js +6 -4
  712. package/src/maths/vec3/divide.d.ts +2 -4
  713. package/src/maths/vec3/divide.js +5 -7
  714. package/src/maths/vec3/divide.test.js +4 -3
  715. package/src/maths/vec3/dot.d.ts +2 -4
  716. package/src/maths/vec3/dot.js +4 -6
  717. package/src/maths/vec3/dot.test.js +3 -2
  718. package/src/maths/vec3/equals.d.ts +2 -4
  719. package/src/maths/vec3/equals.js +3 -5
  720. package/src/maths/vec3/equals.test.js +3 -2
  721. package/src/maths/vec3/fromScalar.d.ts +2 -4
  722. package/src/maths/vec3/fromScalar.js +4 -6
  723. package/src/maths/vec3/fromScalar.test.js +4 -3
  724. package/src/maths/vec3/fromValues.d.ts +2 -4
  725. package/src/maths/vec3/fromValues.js +6 -8
  726. package/src/maths/vec3/fromValues.test.js +4 -3
  727. package/src/maths/vec3/fromVec2.d.ts +3 -5
  728. package/src/maths/vec3/fromVec2.js +4 -6
  729. package/src/maths/vec3/fromVec2.test.js +3 -3
  730. package/src/maths/vec3/index.d.ts +33 -34
  731. package/src/maths/vec3/index.js +32 -34
  732. package/src/maths/vec3/length.d.ts +2 -4
  733. package/src/maths/vec3/length.js +3 -5
  734. package/src/maths/vec3/length.test.js +6 -4
  735. package/src/maths/vec3/lerp.d.ts +2 -4
  736. package/src/maths/vec3/lerp.js +6 -8
  737. package/src/maths/vec3/lerp.test.js +4 -3
  738. package/src/maths/vec3/max.d.ts +2 -4
  739. package/src/maths/vec3/max.js +5 -7
  740. package/src/maths/vec3/max.test.js +4 -3
  741. package/src/maths/vec3/min.d.ts +2 -4
  742. package/src/maths/vec3/min.js +5 -7
  743. package/src/maths/vec3/min.test.js +4 -3
  744. package/src/maths/vec3/multiply.d.ts +2 -4
  745. package/src/maths/vec3/multiply.js +5 -7
  746. package/src/maths/vec3/multiply.test.js +4 -3
  747. package/src/maths/vec3/negate.d.ts +2 -4
  748. package/src/maths/vec3/negate.js +4 -6
  749. package/src/maths/vec3/negate.test.js +4 -3
  750. package/src/maths/vec3/normalize.d.ts +2 -4
  751. package/src/maths/vec3/normalize.js +4 -6
  752. package/src/maths/vec3/normalize.test.js +4 -3
  753. package/src/maths/vec3/orthogonal.d.ts +2 -4
  754. package/src/maths/vec3/orthogonal.js +7 -9
  755. package/src/maths/vec3/orthogonal.test.js +4 -3
  756. package/src/maths/vec3/rotateX.d.ts +2 -4
  757. package/src/maths/vec3/rotateX.js +6 -8
  758. package/src/maths/vec3/rotateX.test.js +4 -4
  759. package/src/maths/vec3/rotateY.d.ts +2 -4
  760. package/src/maths/vec3/rotateY.js +6 -8
  761. package/src/maths/vec3/rotateY.test.js +4 -4
  762. package/src/maths/vec3/rotateZ.d.ts +2 -4
  763. package/src/maths/vec3/rotateZ.js +6 -8
  764. package/src/maths/vec3/rotateZ.test.js +4 -4
  765. package/src/maths/vec3/scale.d.ts +2 -4
  766. package/src/maths/vec3/scale.js +5 -7
  767. package/src/maths/vec3/scale.test.js +4 -3
  768. package/src/maths/vec3/snap.d.ts +2 -4
  769. package/src/maths/vec3/snap.js +5 -7
  770. package/src/maths/vec3/snap.test.js +4 -3
  771. package/src/maths/vec3/squaredDistance.d.ts +2 -4
  772. package/src/maths/vec3/squaredDistance.js +4 -6
  773. package/src/maths/vec3/squaredDistance.test.js +6 -4
  774. package/src/maths/vec3/squaredLength.d.ts +2 -4
  775. package/src/maths/vec3/squaredLength.js +3 -5
  776. package/src/maths/vec3/squaredLength.test.js +6 -4
  777. package/src/maths/vec3/subtract.d.ts +2 -4
  778. package/src/maths/vec3/subtract.js +5 -7
  779. package/src/maths/vec3/subtract.test.js +4 -3
  780. package/src/maths/vec3/toString.d.ts +2 -4
  781. package/src/maths/vec3/toString.js +3 -5
  782. package/src/maths/vec3/transform.d.ts +3 -5
  783. package/src/maths/vec3/transform.js +5 -7
  784. package/src/maths/vec3/transform.test.js +12 -15
  785. package/src/maths/vec3/type.d.ts +1 -3
  786. package/src/maths/vec4/clone.d.ts +2 -4
  787. package/src/maths/vec4/clone.js +4 -6
  788. package/src/maths/vec4/clone.test.js +4 -3
  789. package/src/maths/vec4/copy.d.ts +2 -4
  790. package/src/maths/vec4/copy.js +4 -6
  791. package/src/maths/vec4/copy.test.js +4 -3
  792. package/src/maths/vec4/create.d.ts +2 -4
  793. package/src/maths/vec4/create.js +2 -5
  794. package/src/maths/vec4/create.test.js +3 -3
  795. package/src/maths/vec4/dot.d.ts +2 -4
  796. package/src/maths/vec4/dot.js +4 -6
  797. package/src/maths/vec4/dot.test.js +2 -2
  798. package/src/maths/vec4/equals.d.ts +2 -4
  799. package/src/maths/vec4/equals.js +3 -5
  800. package/src/maths/vec4/equals.test.js +3 -2
  801. package/src/maths/vec4/fromScalar.d.ts +2 -4
  802. package/src/maths/vec4/fromScalar.js +3 -5
  803. package/src/maths/vec4/fromScalar.test.js +4 -3
  804. package/src/maths/vec4/fromValues.d.ts +2 -4
  805. package/src/maths/vec4/fromValues.js +7 -9
  806. package/src/maths/vec4/fromValues.test.js +4 -3
  807. package/src/maths/vec4/index.d.ts +10 -11
  808. package/src/maths/vec4/index.js +9 -11
  809. package/src/maths/vec4/toString.d.ts +2 -4
  810. package/src/maths/vec4/toString.js +3 -5
  811. package/src/maths/vec4/transform.d.ts +3 -5
  812. package/src/maths/vec4/transform.js +6 -7
  813. package/src/maths/vec4/transform.test.js +4 -3
  814. package/src/maths/vec4/type.d.ts +1 -3
  815. package/src/measurements/calculateEpsilonFromBounds.js +2 -4
  816. package/src/measurements/calculateEpsilonFromBounds.test.js +4 -3
  817. package/src/measurements/index.d.ts +13 -14
  818. package/src/measurements/index.js +13 -15
  819. package/src/measurements/measureAggregateArea.d.ts +3 -5
  820. package/src/measurements/measureAggregateArea.js +4 -7
  821. package/src/measurements/measureAggregateArea.test.js +4 -3
  822. package/src/measurements/measureAggregateBoundingBox.d.ts +4 -6
  823. package/src/measurements/measureAggregateBoundingBox.js +6 -9
  824. package/src/measurements/measureAggregateBoundingBox.test.js +4 -4
  825. package/src/measurements/measureAggregateEpsilon.d.ts +3 -5
  826. package/src/measurements/measureAggregateEpsilon.js +10 -9
  827. package/src/measurements/measureAggregateEpsilon.test.js +6 -4
  828. package/src/measurements/measureAggregateVolume.d.ts +3 -5
  829. package/src/measurements/measureAggregateVolume.js +4 -7
  830. package/src/measurements/measureAggregateVolume.test.js +4 -3
  831. package/src/measurements/measureArea.d.ts +5 -7
  832. package/src/measurements/measureArea.js +37 -20
  833. package/src/measurements/measureArea.test.js +14 -4
  834. package/src/measurements/measureBoundingBox.d.ts +6 -8
  835. package/src/measurements/measureBoundingBox.js +81 -82
  836. package/src/measurements/measureBoundingBox.test.js +26 -5
  837. package/src/measurements/measureBoundingSphere.d.ts +4 -7
  838. package/src/measurements/measureBoundingSphere.js +83 -64
  839. package/src/measurements/measureBoundingSphere.test.js +7 -4
  840. package/src/measurements/measureCenter.d.ts +4 -6
  841. package/src/measurements/measureCenter.js +4 -6
  842. package/src/measurements/measureCenter.test.js +7 -4
  843. package/src/measurements/measureCenterOfMass.d.ts +4 -6
  844. package/src/measurements/measureCenterOfMass.js +6 -8
  845. package/src/measurements/measureCenterOfMass.test.js +7 -4
  846. package/src/measurements/measureDimensions.d.ts +4 -6
  847. package/src/measurements/measureDimensions.js +3 -5
  848. package/src/measurements/measureDimensions.test.js +7 -4
  849. package/src/measurements/measureEpsilon.d.ts +5 -7
  850. package/src/measurements/measureEpsilon.js +14 -30
  851. package/src/measurements/measureEpsilon.test.js +7 -4
  852. package/src/measurements/measureVolume.d.ts +5 -7
  853. package/src/measurements/measureVolume.js +7 -31
  854. package/src/measurements/measureVolume.test.js +7 -4
  855. package/src/measurements/types.d.ts +2 -1
  856. package/src/operations/booleans/index.d.ts +4 -6
  857. package/src/operations/booleans/index.js +5 -7
  858. package/src/operations/booleans/intersect.d.ts +5 -6
  859. package/src/operations/booleans/intersect.js +13 -15
  860. package/src/operations/booleans/intersect.test.js +24 -0
  861. package/src/operations/booleans/intersectGeom2.js +10 -20
  862. package/src/operations/booleans/intersectGeom2.test.js +47 -17
  863. package/src/operations/booleans/intersectGeom3.js +9 -15
  864. package/src/operations/booleans/intersectGeom3.test.js +17 -17
  865. package/src/operations/booleans/intersectGeom3Sub.js +10 -11
  866. package/src/operations/booleans/martinez/compareEvents.js +45 -0
  867. package/src/operations/booleans/martinez/compareSegments.js +51 -0
  868. package/src/operations/booleans/martinez/computeFields.js +109 -0
  869. package/src/operations/booleans/martinez/connectEdges.js +189 -0
  870. package/src/operations/booleans/martinez/contour.js +12 -0
  871. package/src/operations/booleans/martinez/divideSegment.js +32 -0
  872. package/src/operations/booleans/martinez/edgeType.js +4 -0
  873. package/src/operations/booleans/martinez/fillQueue.js +80 -0
  874. package/src/operations/booleans/martinez/index.js +154 -0
  875. package/src/operations/booleans/martinez/operation.js +4 -0
  876. package/src/operations/booleans/martinez/possibleIntersection.js +113 -0
  877. package/src/operations/booleans/martinez/segmentIntersection.js +132 -0
  878. package/src/operations/booleans/martinez/signedArea.js +16 -0
  879. package/src/operations/booleans/martinez/splaytree.js +599 -0
  880. package/src/operations/booleans/martinez/subdivideSegments.js +82 -0
  881. package/src/operations/booleans/martinez/sweepEvent.js +132 -0
  882. package/src/operations/booleans/martinez/tinyqueue.js +76 -0
  883. package/src/operations/booleans/mayOverlap.js +5 -7
  884. package/src/operations/booleans/mayOverlap.test.js +6 -6
  885. package/src/operations/booleans/scission.d.ts +4 -5
  886. package/src/operations/booleans/scission.js +5 -13
  887. package/src/operations/booleans/scission.test.js +10 -4
  888. package/src/operations/booleans/scissionGeom3.js +15 -16
  889. package/src/operations/booleans/subtract.d.ts +5 -6
  890. package/src/operations/booleans/subtract.js +13 -15
  891. package/src/operations/booleans/subtract.test.js +24 -0
  892. package/src/operations/booleans/subtractGeom2.js +10 -20
  893. package/src/operations/booleans/subtractGeom2.test.js +46 -17
  894. package/src/operations/booleans/subtractGeom3.js +9 -15
  895. package/src/operations/booleans/subtractGeom3.test.js +16 -6
  896. package/src/operations/booleans/subtractGeom3Sub.js +10 -11
  897. package/src/operations/booleans/trees/Node.js +45 -48
  898. package/src/operations/booleans/trees/PolygonTreeNode.js +35 -37
  899. package/src/operations/booleans/trees/Tree.js +9 -12
  900. package/src/operations/booleans/trees/index.js +1 -3
  901. package/src/operations/booleans/trees/splitLineSegmentByPlane.js +2 -4
  902. package/src/operations/booleans/trees/splitPolygonByPlane.js +55 -57
  903. package/src/operations/booleans/union.d.ts +5 -6
  904. package/src/operations/booleans/union.js +13 -15
  905. package/src/operations/booleans/union.test.js +24 -0
  906. package/src/operations/booleans/unionGeom2.js +10 -20
  907. package/src/operations/booleans/unionGeom2.test.js +153 -84
  908. package/src/operations/booleans/unionGeom3.js +9 -15
  909. package/src/operations/booleans/unionGeom3.test.js +22 -9
  910. package/src/operations/booleans/unionGeom3Sub.js +10 -12
  911. package/src/operations/extrusions/extrudeFromSlices.d.ts +3 -6
  912. package/src/operations/extrusions/extrudeFromSlices.js +19 -31
  913. package/src/operations/extrusions/extrudeFromSlices.test.js +54 -48
  914. package/src/operations/extrusions/extrudeHelical.d.ts +2 -4
  915. package/src/operations/extrusions/extrudeHelical.js +19 -26
  916. package/src/operations/extrusions/extrudeHelical.test.js +6 -6
  917. package/src/operations/extrusions/extrudeLinear.d.ts +4 -6
  918. package/src/operations/extrusions/extrudeLinear.js +10 -16
  919. package/src/operations/extrusions/extrudeLinear.test.js +90 -67
  920. package/src/operations/extrusions/extrudeLinearGeom2.js +18 -23
  921. package/src/operations/extrusions/extrudeLinearPath2.js +11 -12
  922. package/src/operations/extrusions/extrudeRotate.d.ts +2 -4
  923. package/src/operations/extrusions/extrudeRotate.js +28 -32
  924. package/src/operations/extrusions/extrudeRotate.test.js +70 -34
  925. package/src/operations/extrusions/extrudeWalls.js +11 -14
  926. package/src/operations/extrusions/extrudeWalls.test.js +24 -48
  927. package/src/operations/extrusions/index.d.ts +5 -9
  928. package/src/operations/extrusions/index.js +6 -10
  929. package/src/operations/extrusions/project.d.ts +6 -8
  930. package/src/operations/extrusions/project.js +35 -32
  931. package/src/operations/extrusions/project.test.js +116 -83
  932. package/src/operations/hulls/hull.d.ts +5 -7
  933. package/src/operations/hulls/hull.js +14 -15
  934. package/src/operations/hulls/hull.test.js +101 -58
  935. package/src/operations/hulls/hullChain.d.ts +5 -7
  936. package/src/operations/hulls/hullChain.js +15 -10
  937. package/src/operations/hulls/hullChain.test.js +27 -8
  938. package/src/operations/hulls/hullGeom2.js +7 -13
  939. package/src/operations/hulls/hullGeom3.js +6 -12
  940. package/src/operations/hulls/hullPath2.js +6 -12
  941. package/src/operations/hulls/hullPath2.test.js +4 -4
  942. package/src/operations/hulls/hullPoints2.d.ts +2 -4
  943. package/src/operations/hulls/hullPoints2.js +3 -5
  944. package/src/operations/hulls/hullPoints2.test.js +2 -2
  945. package/src/operations/hulls/hullPoints3.d.ts +3 -5
  946. package/src/operations/hulls/hullPoints3.js +4 -6
  947. package/src/operations/hulls/index.d.ts +4 -6
  948. package/src/operations/hulls/index.js +5 -7
  949. package/src/operations/hulls/quickhull/Face.js +7 -21
  950. package/src/operations/hulls/quickhull/HalfEdge.js +2 -5
  951. package/src/operations/hulls/quickhull/QuickHull.js +14 -16
  952. package/src/operations/hulls/quickhull/Vertex.js +1 -3
  953. package/src/operations/hulls/quickhull/VertexList.js +1 -4
  954. package/src/operations/hulls/quickhull/index.js +2 -4
  955. package/src/operations/hulls/quickhull/point-line-distance.js +2 -6
  956. package/src/operations/hulls/toUniquePoints.js +4 -6
  957. package/src/operations/modifiers/generalize.d.ts +2 -2
  958. package/src/operations/modifiers/generalize.js +15 -21
  959. package/src/operations/modifiers/generalize.test.js +6 -6
  960. package/src/operations/modifiers/index.d.ts +3 -3
  961. package/src/operations/modifiers/index.js +4 -6
  962. package/src/operations/modifiers/insertTjunctions.js +164 -165
  963. package/src/operations/modifiers/insertTjunctions.test.js +5 -5
  964. package/src/operations/modifiers/mergePolygons.js +35 -36
  965. package/src/operations/modifiers/reTesselateCoplanarPolygons.js +235 -236
  966. package/src/operations/modifiers/reTesselateCoplanarPolygons.test.js +4 -4
  967. package/src/operations/modifiers/retessellate.d.ts +2 -2
  968. package/src/operations/modifiers/retessellate.js +7 -7
  969. package/src/operations/modifiers/retessellate.test.js +4 -4
  970. package/src/operations/modifiers/snap.d.ts +2 -2
  971. package/src/operations/modifiers/snap.js +30 -23
  972. package/src/operations/modifiers/snap.test.js +32 -10
  973. package/src/operations/modifiers/snapPolygons.js +14 -16
  974. package/src/operations/modifiers/snapPolygons.test.js +3 -3
  975. package/src/operations/modifiers/triangulatePolygons.js +5 -6
  976. package/src/operations/offsets/extrudePolygon.js +32 -0
  977. package/src/operations/offsets/index.d.ts +2 -0
  978. package/src/operations/offsets/index.js +9 -0
  979. package/src/operations/offsets/offset.d.ts +12 -0
  980. package/src/operations/offsets/offset.js +32 -0
  981. package/src/operations/offsets/offsetFromPoints.d.ts +10 -0
  982. package/src/operations/{expansions → offsets}/offsetFromPoints.js +29 -28
  983. package/src/operations/offsets/offsetFromPoints.test.js +316 -0
  984. package/src/operations/offsets/offsetGeom2.js +55 -0
  985. package/src/operations/offsets/offsetGeom2.test.js +269 -0
  986. package/src/operations/offsets/offsetGeom3.js +31 -0
  987. package/src/operations/{expansions/expandGeom3.test.js → offsets/offsetGeom3.test.js} +71 -5
  988. package/src/operations/{expansions/expandPath2.js → offsets/offsetPath2.js} +27 -33
  989. package/src/operations/offsets/offsetPath2.test.js +103 -0
  990. package/src/operations/{expansions/expandShell.js → offsets/offsetShell.js} +54 -56
  991. package/src/operations/transforms/align.d.ts +5 -7
  992. package/src/operations/transforms/align.js +16 -15
  993. package/src/operations/transforms/align.test.js +9 -8
  994. package/src/operations/transforms/center.d.ts +3 -3
  995. package/src/operations/transforms/center.js +12 -22
  996. package/src/operations/transforms/center.test.js +34 -6
  997. package/src/operations/transforms/index.d.ts +7 -9
  998. package/src/operations/transforms/index.js +8 -29
  999. package/src/operations/transforms/mirror.d.ts +3 -3
  1000. package/src/operations/transforms/mirror.js +12 -22
  1001. package/src/operations/transforms/mirror.test.js +16 -10
  1002. package/src/operations/transforms/rotate.d.ts +6 -6
  1003. package/src/operations/transforms/rotate.js +14 -24
  1004. package/src/operations/transforms/rotate.test.js +18 -7
  1005. package/src/operations/transforms/scale.d.ts +6 -6
  1006. package/src/operations/transforms/scale.js +13 -23
  1007. package/src/operations/transforms/scale.test.js +21 -6
  1008. package/src/operations/transforms/transform.d.ts +3 -3
  1009. package/src/operations/transforms/transform.js +8 -13
  1010. package/src/operations/transforms/transform.test.js +7 -7
  1011. package/src/operations/transforms/translate.d.ts +3 -5
  1012. package/src/operations/transforms/translate.js +14 -24
  1013. package/src/operations/transforms/translate.test.js +18 -6
  1014. package/src/primitives/arc.d.ts +3 -5
  1015. package/src/primitives/arc.js +26 -28
  1016. package/src/primitives/arc.test.js +17 -16
  1017. package/src/primitives/circle.d.ts +3 -5
  1018. package/src/primitives/circle.js +10 -12
  1019. package/src/primitives/circle.test.js +23 -12
  1020. package/src/primitives/commonChecks.js +3 -9
  1021. package/src/primitives/cube.d.ts +3 -5
  1022. package/src/primitives/cube.js +6 -9
  1023. package/src/primitives/cube.test.js +14 -4
  1024. package/src/primitives/cuboid.d.ts +3 -5
  1025. package/src/primitives/cuboid.js +8 -10
  1026. package/src/primitives/cuboid.test.js +14 -4
  1027. package/src/primitives/cylinder.d.ts +3 -5
  1028. package/src/primitives/cylinder.js +11 -15
  1029. package/src/primitives/cylinder.test.js +16 -4
  1030. package/src/primitives/cylinderElliptic.d.ts +3 -5
  1031. package/src/primitives/cylinderElliptic.js +33 -35
  1032. package/src/primitives/cylinderElliptic.test.js +26 -5
  1033. package/src/primitives/ellipse.d.ts +3 -5
  1034. package/src/primitives/ellipse.js +19 -21
  1035. package/src/primitives/ellipse.test.js +23 -12
  1036. package/src/primitives/ellipsoid.d.ts +3 -5
  1037. package/src/primitives/ellipsoid.js +48 -51
  1038. package/src/primitives/ellipsoid.test.js +16 -4
  1039. package/src/primitives/geodesicSphere.d.ts +2 -4
  1040. package/src/primitives/geodesicSphere.js +14 -17
  1041. package/src/primitives/geodesicSphere.test.js +12 -4
  1042. package/src/primitives/index.d.ts +21 -23
  1043. package/src/primitives/index.js +22 -24
  1044. package/src/primitives/line.d.ts +3 -5
  1045. package/src/primitives/line.js +3 -5
  1046. package/src/primitives/line.test.js +5 -5
  1047. package/src/primitives/polygon.d.ts +3 -5
  1048. package/src/primitives/polygon.js +17 -22
  1049. package/src/primitives/polygon.test.js +14 -9
  1050. package/src/primitives/polyhedron.d.ts +4 -6
  1051. package/src/primitives/polyhedron.js +15 -17
  1052. package/src/primitives/polyhedron.test.js +12 -6
  1053. package/src/primitives/rectangle.d.ts +3 -5
  1054. package/src/primitives/rectangle.js +10 -12
  1055. package/src/primitives/rectangle.test.js +13 -7
  1056. package/src/primitives/roundedCuboid.d.ts +3 -5
  1057. package/src/primitives/roundedCuboid.js +57 -58
  1058. package/src/primitives/roundedCuboid.test.js +24 -8
  1059. package/src/primitives/roundedCylinder.d.ts +3 -5
  1060. package/src/primitives/roundedCylinder.js +73 -76
  1061. package/src/primitives/roundedCylinder.test.js +24 -4
  1062. package/src/primitives/roundedRectangle.d.ts +3 -5
  1063. package/src/primitives/roundedRectangle.js +16 -16
  1064. package/src/primitives/roundedRectangle.test.js +19 -10
  1065. package/src/primitives/sphere.d.ts +3 -5
  1066. package/src/primitives/sphere.js +8 -11
  1067. package/src/primitives/sphere.test.js +16 -4
  1068. package/src/primitives/square.d.ts +3 -5
  1069. package/src/primitives/square.js +6 -9
  1070. package/src/primitives/square.test.js +14 -8
  1071. package/src/primitives/star.d.ts +3 -5
  1072. package/src/primitives/star.js +16 -18
  1073. package/src/primitives/star.test.js +18 -10
  1074. package/src/primitives/torus.d.ts +2 -4
  1075. package/src/primitives/torus.js +16 -18
  1076. package/src/primitives/torus.test.js +18 -6
  1077. package/src/primitives/triangle.d.ts +2 -4
  1078. package/src/primitives/triangle.js +9 -11
  1079. package/src/primitives/triangle.test.js +23 -13
  1080. package/src/text/fonts/single-line/hershey/simplex.js +1 -1
  1081. package/src/text/index.d.ts +2 -4
  1082. package/src/text/index.js +3 -5
  1083. package/src/text/vectorChar.d.ts +2 -8
  1084. package/src/text/vectorChar.js +51 -36
  1085. package/src/text/vectorChar.test.js +63 -0
  1086. package/src/text/vectorText.d.ts +2 -8
  1087. package/src/text/vectorText.js +100 -69
  1088. package/src/text/vectorText.test.js +267 -0
  1089. package/src/utils/areAllShapesTheSameType.d.ts +2 -4
  1090. package/src/utils/areAllShapesTheSameType.js +4 -6
  1091. package/src/utils/areAllShapesTheSameType.test.js +3 -3
  1092. package/src/utils/coalesce.d.ts +3 -0
  1093. package/src/utils/coalesce.js +20 -0
  1094. package/src/utils/degToRad.d.ts +1 -3
  1095. package/src/utils/degToRad.js +3 -5
  1096. package/src/utils/degToRad.test.js +3 -3
  1097. package/src/utils/flatten.d.ts +2 -4
  1098. package/src/utils/flatten.js +1 -3
  1099. package/src/utils/fnNumberSort.d.ts +1 -3
  1100. package/src/utils/fnNumberSort.js +1 -3
  1101. package/src/utils/index.d.ts +4 -9
  1102. package/src/utils/index.js +5 -10
  1103. package/src/utils/insertSorted.d.ts +1 -3
  1104. package/src/utils/insertSorted.js +11 -13
  1105. package/src/utils/padArrayToLength.d.ts +1 -3
  1106. package/src/utils/padArrayToLength.js +2 -4
  1107. package/src/utils/padArrayToLength.test.js +2 -2
  1108. package/src/utils/radToDeg.d.ts +1 -3
  1109. package/src/utils/radToDeg.js +3 -5
  1110. package/src/utils/radToDeg.test.js +3 -3
  1111. package/src/utils/radiusToSegments.d.ts +1 -3
  1112. package/src/utils/radiusToSegments.js +6 -8
  1113. package/src/utils/radiusToSegments.test.js +3 -3
  1114. package/src/utils/recursiveArray.d.ts +1 -3
  1115. package/test/helpers/asserts.js +9 -16
  1116. package/test/helpers/comparePoints.js +2 -4
  1117. package/test/helpers/comparePolygonLists.js +2 -4
  1118. package/test/helpers/comparePolygons.js +4 -6
  1119. package/test/helpers/comparePolygonsAsPoints.js +4 -6
  1120. package/test/helpers/compareVectors.js +5 -6
  1121. package/test/helpers/index.js +6 -8
  1122. package/test/helpers/nearlyEqual.js +1 -3
  1123. package/tsconfig.json +17 -0
  1124. package/src/geometries/geom2/fromPoints.d.ts +0 -6
  1125. package/src/geometries/geom2/fromPoints.js +0 -35
  1126. package/src/geometries/geom2/fromPoints.test.js +0 -22
  1127. package/src/geometries/poly2/flip.d.ts +0 -5
  1128. package/src/geometries/poly2/flip.js +0 -15
  1129. package/src/geometries/poly3/fromPoints.d.ts +0 -6
  1130. package/src/geometries/poly3/fromPoints.js +0 -25
  1131. package/src/geometries/poly3/fromPoints.test.js +0 -15
  1132. package/src/geometries/poly3/fromPointsAndPlane.d.ts +0 -7
  1133. package/src/geometries/poly3/toPoints.d.ts +0 -6
  1134. package/src/geometries/poly3/toPoints.js +0 -10
  1135. package/src/maths/OrthoNormalBasis.js +0 -59
  1136. package/src/maths/mat4/leftMultiplyVec2.d.ts +0 -6
  1137. package/src/maths/mat4/leftMultiplyVec2.js +0 -28
  1138. package/src/maths/mat4/leftMultiplyVec3.d.ts +0 -6
  1139. package/src/maths/mat4/leftMultiplyVec3.js +0 -29
  1140. package/src/maths/mat4/mirror.d.ts +0 -6
  1141. package/src/maths/mat4/mirror.js +0 -34
  1142. package/src/maths/mat4/rightMultiplyVec2.d.ts +0 -6
  1143. package/src/maths/mat4/rightMultiplyVec2.js +0 -29
  1144. package/src/maths/mat4/rightMultiplyVec3.d.ts +0 -6
  1145. package/src/maths/mat4/rightMultiplyVec3.js +0 -30
  1146. package/src/maths/plane/fromNoisyPoints.d.ts +0 -6
  1147. package/src/maths/plane/fromNoisyPoints.js +0 -106
  1148. package/src/maths/plane/fromNoisyPoints.test.js +0 -24
  1149. package/src/maths/utils/index.d.ts +0 -8
  1150. package/src/maths/utils/index.js +0 -15
  1151. package/src/operations/booleans/fromFakePolygons.js +0 -52
  1152. package/src/operations/booleans/to3DWalls.js +0 -36
  1153. package/src/operations/expansions/expand.d.ts +0 -18
  1154. package/src/operations/expansions/expand.js +0 -42
  1155. package/src/operations/expansions/expand.test.js +0 -188
  1156. package/src/operations/expansions/expandGeom2.js +0 -43
  1157. package/src/operations/expansions/expandGeom3.js +0 -36
  1158. package/src/operations/expansions/extrudePolygon.js +0 -34
  1159. package/src/operations/expansions/index.d.ts +0 -4
  1160. package/src/operations/expansions/index.js +0 -11
  1161. package/src/operations/expansions/offset.d.ts +0 -15
  1162. package/src/operations/expansions/offset.js +0 -36
  1163. package/src/operations/expansions/offset.test.js +0 -503
  1164. package/src/operations/expansions/offsetGeom2.js +0 -47
  1165. package/src/operations/expansions/offsetPath2.js +0 -32
  1166. package/src/operations/extrusions/earcut/assignHoles.test.js +0 -74
  1167. package/src/operations/extrusions/extrudeRectangular.d.ts +0 -17
  1168. package/src/operations/extrusions/extrudeRectangular.js +0 -45
  1169. package/src/operations/extrusions/extrudeRectangular.test.js +0 -72
  1170. package/src/operations/extrusions/extrudeRectangularGeom2.js +0 -46
  1171. package/src/operations/extrusions/extrudeRectangularPath2.js +0 -33
  1172. package/src/operations/extrusions/slice/calculatePlane.d.ts +0 -7
  1173. package/src/operations/extrusions/slice/calculatePlane.js +0 -41
  1174. package/src/operations/extrusions/slice/calculatePlane.test.js +0 -35
  1175. package/src/operations/extrusions/slice/clone.d.ts +0 -6
  1176. package/src/operations/extrusions/slice/clone.js +0 -28
  1177. package/src/operations/extrusions/slice/clone.test.js +0 -34
  1178. package/src/operations/extrusions/slice/create.d.ts +0 -5
  1179. package/src/operations/extrusions/slice/create.js +0 -20
  1180. package/src/operations/extrusions/slice/equals.d.ts +0 -5
  1181. package/src/operations/extrusions/slice/equals.js +0 -27
  1182. package/src/operations/extrusions/slice/equals.test.js +0 -17
  1183. package/src/operations/extrusions/slice/fromPoints.d.ts +0 -9
  1184. package/src/operations/extrusions/slice/fromPoints.js +0 -35
  1185. package/src/operations/extrusions/slice/fromPoints.test.js +0 -15
  1186. package/src/operations/extrusions/slice/fromSides.d.ts +0 -7
  1187. package/src/operations/extrusions/slice/fromSides.js +0 -27
  1188. package/src/operations/extrusions/slice/fromSides.test.js +0 -15
  1189. package/src/operations/extrusions/slice/index.d.ts +0 -16
  1190. package/src/operations/extrusions/slice/index.js +0 -19
  1191. package/src/operations/extrusions/slice/isA.d.ts +0 -5
  1192. package/src/operations/extrusions/slice/isA.js +0 -18
  1193. package/src/operations/extrusions/slice/repair.js +0 -62
  1194. package/src/operations/extrusions/slice/reverse.d.ts +0 -6
  1195. package/src/operations/extrusions/slice/reverse.js +0 -26
  1196. package/src/operations/extrusions/slice/toEdges.d.ts +0 -5
  1197. package/src/operations/extrusions/slice/toEdges.js +0 -13
  1198. package/src/operations/extrusions/slice/toPolygons.d.ts +0 -7
  1199. package/src/operations/extrusions/slice/toString.d.ts +0 -5
  1200. package/src/operations/extrusions/slice/toString.js +0 -15
  1201. package/src/operations/extrusions/slice/transform.d.ts +0 -7
  1202. package/src/operations/extrusions/slice/transform.js +0 -21
  1203. package/src/operations/extrusions/slice/type.d.ts +0 -7
  1204. package/src/operations/hulls/quickhull/get-plane-normal.js +0 -20
  1205. package/src/text/text.test.js +0 -187
  1206. package/src/text/vectorParams.js +0 -26
@@ -1,1214 +1,7 @@
1
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jscadModeling = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
- const cssColors=require("./cssColors"),colorNameToRgb=o=>cssColors[o.toLowerCase()];module.exports=colorNameToRgb;
3
-
4
- },{"./cssColors":3}],2:[function(require,module,exports){
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
-
7
- },{"../geometries/geom2":25,"../geometries/geom3":41,"../geometries/path2":62,"../geometries/poly3":79,"../utils/flatten":398}],3:[function(require,module,exports){
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
-
10
- },{}],4:[function(require,module,exports){
11
- const hexToRgb=t=>{if((t=t.replace("#","")).length<6)throw new Error("the given notation must contain 3 or more hex values");const e=parseInt(t.substring(0,2),16)/255,n=parseInt(t.substring(2,4),16)/255,r=parseInt(t.substring(4,6),16)/255;if(t.length>=8){return[e,n,r,parseInt(t.substring(6,8),16)/255]}return[e,n,r]};module.exports=hexToRgb;
12
-
13
- },{}],5:[function(require,module,exports){
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
-
16
- },{"../utils/flatten":398,"./hueToColorComponent":7}],6:[function(require,module,exports){
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
-
19
- },{"../utils/flatten":398}],7:[function(require,module,exports){
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
-
22
- },{}],8:[function(require,module,exports){
23
- module.exports={colorize:require("./colorize"),colorNameToRgb:require("./colorNameToRgb"),cssColors:require("./cssColors"),hexToRgb:require("./hexToRgb"),hslToRgb:require("./hslToRgb"),hsvToRgb:require("./hsvToRgb"),hueToColorComponent:require("./hueToColorComponent"),rgbToHex:require("./rgbToHex"),rgbToHsl:require("./rgbToHsl"),rgbToHsv:require("./rgbToHsv")};
24
-
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
- 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
-
28
- },{"../utils/flatten":398}],10:[function(require,module,exports){
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
-
31
- },{"../utils/flatten":398}],11:[function(require,module,exports){
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
-
34
- },{"../utils/flatten":398}],12:[function(require,module,exports){
35
- const lengths=require("./lengths"),arcLengthToT=(e,t)=>{const{distance:s,segments:n}=Object.assign({},{distance:0,segments:100},e),o=lengths(n,t);let r=0,c=n;for(;r<=c;){const e=Math.floor(r+(c-r)/2),t=o[e]-s;if(t<0)r=e+1;else{if(!(t>0)){c=e;break}c=e-1}}const g=c;if(o[g]===s)return g/n;const a=o[g];return(g+(s-a)/(o[g+1]-a))/n};module.exports=arcLengthToT;
36
-
37
- },{"./lengths":16}],13:[function(require,module,exports){
38
- 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;
39
-
40
- },{}],14:[function(require,module,exports){
41
- module.exports={create:require("./create"),valueAt:require("./valueAt"),tangentAt:require("./tangentAt"),lengths:require("./lengths"),length:require("./length"),arcLengthToT:require("./arcLengthToT")};
42
-
43
- },{"./arcLengthToT":12,"./create":13,"./length":15,"./lengths":16,"./tangentAt":17,"./valueAt":18}],15:[function(require,module,exports){
44
- const lengths=require("./lengths"),length=(e,t)=>lengths(e,t)[e];module.exports=length;
45
-
46
- },{"./lengths":16}],16:[function(require,module,exports){
47
- const valueAt=require("./valueAt"),lengths=(e,r)=>{let t=0;const n=[0];let s=valueAt(0,r);for(let a=1;a<=e;a++){const i=valueAt(a/e,r);t+=distanceBetween(i,s),n.push(t),s=i}return n},distanceBetween=(e,r)=>{if(Number.isFinite(e)&&Number.isFinite(r))return Math.abs(e-r);if(Array.isArray(e)&&Array.isArray(r)){if(e.length!==r.length)throw new Error("The operands must have the same number of dimensions.");let t=0;for(let n=0;n<e.length;n++)t+=(r[n]-e[n])*(r[n]-e[n]);return Math.sqrt(t)}throw new Error("The operands must be of the same type, either number or array.")};module.exports=lengths;
48
-
49
- },{"./valueAt":18}],17:[function(require,module,exports){
50
- const tangentAt=(t,n)=>{if(t<0||t>1)throw new Error("Bezier tangentAt() input must be between 0 and 1");if("float_single"===n.pointType)return bezierTangent(n,n.points,t);{const e=[];for(let o=0;o<n.dimensions;o++){const r=[];for(let t=0;t<n.points.length;t++)r.push(n.points[t][o]);e.push(bezierTangent(n,r,t))}return e}},bezierTangent=function(t,n,e){const o=n.length-1;let r=0;for(let i=0;i<o;i++){const s=o*(n[i+1]-n[i]);r+=t.tangentPermutations[i]*Math.pow(1-e,o-1-i)*Math.pow(e,i)*s}return r};module.exports=tangentAt;
51
-
52
- },{}],18:[function(require,module,exports){
53
- const valueAt=(t,e)=>{if(t<0||t>1)throw new Error("Bezier valueAt() input must be between 0 and 1");if("float_single"===e.pointType)return bezierFunction(e,e.points,t);{const n=[];for(let o=0;o<e.dimensions;o++){const i=[];for(let t=0;t<e.points.length;t++)i.push(e.points[t][o]);n.push(bezierFunction(e,i,t))}return n}},bezierFunction=function(t,e,n){const o=e.length-1;let i=0;for(let r=0;r<=o;r++)i+=t.permutations[r]*Math.pow(1-n,o-r)*Math.pow(n,r)*e[r];return i};module.exports=valueAt;
54
-
55
- },{}],19:[function(require,module,exports){
56
- module.exports={bezier:require("./bezier")};
57
-
58
- },{"./bezier":14}],20:[function(require,module,exports){
59
- 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;
60
-
61
- },{"../../maths/mat4":143,"../../maths/vec2":191}],21:[function(require,module,exports){
62
- const clone=e=>Object.assign({},e);module.exports=clone;
63
-
64
- },{}],22:[function(require,module,exports){
65
- const mat4=require("../../maths/mat4"),create=e=>(void 0===e&&(e=[]),{sides:e,transforms:mat4.create()});module.exports=create;
66
-
67
- },{"../../maths/mat4":143}],23:[function(require,module,exports){
68
- const mat4=require("../../maths/mat4"),vec2=require("../../maths/vec2"),create=require("./create"),fromCompactBinary=e=>{if(0!==e[0])throw new Error("invalid compact binary data");const r=create();r.transforms=mat4.clone(e.slice(1,17));for(let t=21;t<e.length;t+=4){const a=vec2.fromValues(e[t+0],e[t+1]),o=vec2.fromValues(e[t+2],e[t+3]);r.sides.push([a,o])}return e[17]>=0&&(r.color=[e[17],e[18],e[19],e[20]]),r};module.exports=fromCompactBinary;
69
-
70
- },{"../../maths/mat4":143,"../../maths/vec2":191,"./create":22}],24:[function(require,module,exports){
71
- const vec2=require("../../maths/vec2"),create=require("./create"),fromPoints=e=>{if(!Array.isArray(e))throw new Error("the given points must be an array");let r=e.length;if(r<3)throw new Error("the given points must define a closed geometry with three or more points");vec2.equals(e[0],e[r-1])&&--r;const t=[];let o=e[r-1];for(let n=0;n<r;n++){const r=e[n];t.push([vec2.clone(o),vec2.clone(r)]),o=r}return create(t)};module.exports=fromPoints;
72
-
73
- },{"../../maths/vec2":191,"./create":22}],25:[function(require,module,exports){
74
- module.exports={clone:require("./clone"),create:require("./create"),fromPoints:require("./fromPoints"),fromCompactBinary:require("./fromCompactBinary"),isA:require("./isA"),reverse:require("./reverse"),toOutlines:require("./toOutlines"),toPoints:require("./toPoints"),toSides:require("./toSides"),toString:require("./toString"),toCompactBinary:require("./toCompactBinary"),transform:require("./transform"),validate:require("./validate")};
75
-
76
- },{"./clone":21,"./create":22,"./fromCompactBinary":23,"./fromPoints":24,"./isA":26,"./reverse":27,"./toCompactBinary":28,"./toOutlines":29,"./toPoints":30,"./toSides":31,"./toString":32,"./transform":33,"./validate":34}],26:[function(require,module,exports){
77
- const isA=s=>!!(s&&"object"==typeof s&&"sides"in s&&"transforms"in s&&Array.isArray(s.sides)&&"length"in s.transforms);module.exports=isA;
78
-
79
- },{}],27:[function(require,module,exports){
80
- const create=require("./create"),toSides=require("./toSides"),reverse=e=>{const r=toSides(e).map(e=>[e[1],e[0]]);return r.reverse(),create(r)};module.exports=reverse;
81
-
82
- },{"./create":22,"./toSides":31}],28:[function(require,module,exports){
83
- 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;
84
-
85
- },{}],29:[function(require,module,exports){
86
- const vec2=require("../../maths/vec2"),toSides=require("./toSides"),toSharedVertices=e=>{const t=new Map,r=e=>{const r=e.toString();return t.has(r)?t.get(r):(t.set(r,e),e)};return e.map(e=>e.map(r))},toVertexMap=e=>{const t=new Map;return toSharedVertices(e).forEach(e=>{t.has(e[0])?t.get(e[0]).push(e):t.set(e[0],[e])}),t},toOutlines=e=>{const t=toVertexMap(toSides(e)),r=[];for(;;){let e;for(const[r,o]of t){if(e=o.shift())break;t.delete(r)}if(void 0===e)break;const o=[],s=e[0];for(;;){o.push(e[0]);const r=e[1];if(r===s)break;const n=t.get(r);if(!n)throw new Error(`geometry is not closed at vertex ${r}`);const c=popNextSide(e,n);0===n.length&&t.delete(r),e=c}o.length>0&&o.push(o.shift()),r.push(o)}return t.clear(),r},popNextSide=(e,t)=>{if(1===t.length)return t.pop();const r=vec2.create(),o=vec2.angleDegrees(vec2.subtract(r,e[1],e[0]));let s,n;t.forEach((e,t)=>{let c=vec2.angleDegrees(vec2.subtract(r,e[1],e[0]))-o;c<-180&&(c+=360),c>=180&&(c-=360),(void 0===n||c>s)&&(n=t,s=c)});const c=t[n];return t.splice(n,1),c};module.exports=toOutlines;
87
-
88
- },{"../../maths/vec2":191,"./toSides":31}],30:[function(require,module,exports){
89
- 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;
90
-
91
- },{"./toSides":31}],31:[function(require,module,exports){
92
- const applyTransforms=require("./applyTransforms"),toSides=s=>applyTransforms(s).sides;module.exports=toSides;
93
-
94
- },{"./applyTransforms":20}],32:[function(require,module,exports){
95
- 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;
96
-
97
- },{"../../maths/vec2":191,"./toSides":31}],33:[function(require,module,exports){
98
- const mat4=require("../../maths/mat4"),reverse=require("./reverse.js"),transform=(r,e)=>{const s=mat4.multiply(mat4.create(),r,e.transforms),t=Object.assign({},e,{transforms:s});return r[0]*r[5]-r[4]*r[1]<0?reverse(t):t};module.exports=transform;
99
-
100
- },{"../../maths/mat4":143,"./reverse.js":27}],34:[function(require,module,exports){
101
- const vec2=require("../../maths/vec2"),isA=require("./isA"),toOutlines=require("./toOutlines"),validate=e=>{if(!isA(e))throw new Error("invalid geom2 structure");if(toOutlines(e),e.sides.forEach(e=>{if(vec2.equals(e[0],e[1]))throw new Error(`geom2 self-edge ${e[0]}`)}),!e.transforms.every(Number.isFinite))throw new Error(`geom2 invalid transforms ${e.transforms}`)};module.exports=validate;
102
-
103
- },{"../../maths/vec2":191,"./isA":26,"./toOutlines":29}],35:[function(require,module,exports){
104
- 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;
105
-
106
- },{"../../maths/mat4":143,"../poly3":79}],36:[function(require,module,exports){
107
- const clone=e=>Object.assign({},e);module.exports=clone;
108
-
109
- },{}],37:[function(require,module,exports){
110
- const mat4=require("../../maths/mat4"),create=e=>(void 0===e&&(e=[]),{polygons:e,transforms:mat4.create()});module.exports=create;
111
-
112
- },{"../../maths/mat4":143}],38:[function(require,module,exports){
113
- 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;
114
-
115
- },{"../../maths/mat4":143,"../../maths/vec3":222,"../poly3":79,"./create":37}],39:[function(require,module,exports){
116
- 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.create(r)});return create(e)};module.exports=fromPoints;
117
-
118
- },{"../poly3":79,"./create":37}],40:[function(require,module,exports){
119
- const quickhull=require("../../operations/hulls/quickhull"),create=require("./create"),poly3=require("../poly3"),fromPointsConvex=r=>{if(!Array.isArray(r))throw new Error("the given points must be an array");const e=quickhull(r,{skipTriangulation:!0}).map(e=>{const o=e.map(e=>r[e]);return poly3.create(o)});return create(e)};module.exports=fromPointsConvex;
120
-
121
- },{"../../operations/hulls/quickhull":348,"../poly3":79,"./create":37}],41:[function(require,module,exports){
122
- module.exports={clone:require("./clone"),create:require("./create"),fromPointsConvex:require("./fromPointsConvex"),fromPoints:require("./fromPoints"),fromCompactBinary:require("./fromCompactBinary"),invert:require("./invert"),isA:require("./isA"),toPoints:require("./toPoints"),toPolygons:require("./toPolygons"),toString:require("./toString"),toCompactBinary:require("./toCompactBinary"),transform:require("./transform"),validate:require("./validate")};
123
-
124
- },{"./clone":36,"./create":37,"./fromCompactBinary":38,"./fromPoints":39,"./fromPointsConvex":40,"./invert":42,"./isA":43,"./toCompactBinary":44,"./toPoints":45,"./toPolygons":46,"./toString":47,"./transform":48,"./validate":49}],42:[function(require,module,exports){
125
- const poly3=require("../poly3"),create=require("./create"),toPolygons=require("./toPolygons"),invert=e=>{const o=toPolygons(e).map(e=>poly3.invert(e));return create(o)};module.exports=invert;
126
-
127
- },{"../poly3":79,"./create":37,"./toPolygons":46}],43:[function(require,module,exports){
128
- const isA=o=>!!(o&&"object"==typeof o&&"polygons"in o&&"transforms"in o&&Array.isArray(o.polygons)&&"length"in o.transforms);module.exports=isA;
129
-
130
- },{}],44:[function(require,module,exports){
131
- 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;
132
-
133
- },{"../poly3":79}],45:[function(require,module,exports){
134
- const poly3=require("../poly3"),toPolygons=require("./toPolygons"),toPoints=o=>{return toPolygons(o).map(o=>poly3.toPoints(o))};module.exports=toPoints;
135
-
136
- },{"../poly3":79,"./toPolygons":46}],46:[function(require,module,exports){
137
- const applyTransforms=require("./applyTransforms"),toPolygons=o=>applyTransforms(o).polygons;module.exports=toPolygons;
138
-
139
- },{"./applyTransforms":35}],47:[function(require,module,exports){
140
- 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;
141
-
142
- },{"../poly3":79,"./toPolygons":46}],48:[function(require,module,exports){
143
- 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;
144
-
145
- },{"../../maths/mat4":143}],49:[function(require,module,exports){
146
- const poly3=require("../poly3"),isA=require("./isA"),validate=e=>{if(!isA(e))throw new Error("invalid geom3 structure");if(e.polygons.forEach(poly3.validate),validateManifold(e),!e.transforms.every(Number.isFinite))throw new Error(`geom3 invalid transforms ${e.transforms}`)},validateManifold=e=>{const o=new Map;e.polygons.forEach(({vertices:e})=>{e.forEach((r,n)=>{const t=`${`${r}`}/${`${e[(n+1)%e.length]}`}`,i=o.has(t)?o.get(t):0;o.set(t,i+1)})});const r=[];if(o.forEach((e,n)=>{const t=n.split("/").reverse().join("/");e!==o.get(t)&&r.push(n.replace("/"," -> "))}),r.length>0)throw new Error(`non-manifold edges ${r.length}\n${r.join("\n")}`)};module.exports=validate;
147
-
148
- },{"../poly3":79,"./isA":43}],50:[function(require,module,exports){
149
- module.exports={geom2:require("./geom2"),geom3:require("./geom3"),path2:require("./path2"),poly2:require("./poly2"),poly3:require("./poly3")};
150
-
151
- },{"./geom2":25,"./geom3":41,"./path2":62,"./poly2":73,"./poly3":79}],51:[function(require,module,exports){
152
- const{TAU:TAU}=require("../../maths/constants"),vec2=require("../../maths/vec2"),fromPoints=require("./fromPoints"),toPoints=require("./toPoints"),appendArc=(e,t)=>{let{endpoint:r,radius:a,xaxisrotation:o,clockwise:n,large:s,segments:c}=Object.assign({},{radius:[0,0],xaxisrotation:0,clockwise:!1,large:!1,segments:16},e);if(!Array.isArray(r))throw new Error("endpoint must be an array of X and Y values");if(r.length<2)throw new Error("endpoint must contain X and Y values");if(r=vec2.clone(r),!Array.isArray(a))throw new Error("radius must be an array of X and Y values");if(a.length<2)throw new Error("radius must contain X and Y values");if(c<4)throw new Error("segments must be four or more");if(t.isClosed)throw new Error("the given path cannot be closed");const i=toPoints(t);if(i.length<1)throw new Error("the given path must contain one or more points (as the starting point for the arc)");let h=a[0],u=a[1];const l=i[i.length-1];h=Math.round(1e5*h)/1e5,u=Math.round(1e5*u)/1e5,r=vec2.fromValues(Math.round(1e5*r[0])/1e5,Math.round(1e5*r[1])/1e5);const d=!n;let v=[];if(0===h||0===u)v.push(r);else{h=Math.abs(h),u=Math.abs(u);const t=o,a=Math.cos(t),n=Math.sin(t),i=vec2.subtract(vec2.create(),l,r);vec2.scale(i,i,.5);const f=Math.round(1e5*(a*i[0]+n*i[1]))/1e5,m=Math.round(1e5*(-n*i[0]+a*i[1]))/1e5,M=vec2.fromValues(f,m),p=M[0]*M[0]/(h*h)+M[1]*M[1]/(u*u);if(p>1){const e=Math.sqrt(p);h*=e,u*=e,h=Math.round(1e5*h)/1e5,u=Math.round(1e5*u)/1e5}let w=Math.sqrt((h*h*u*u-h*h*M[1]*M[1]-u*u*M[0]*M[0])/(h*h*M[1]*M[1]+u*u*M[0]*M[0]));d===s&&(w=-w);const g=vec2.fromValues(h*M[1]/u,-u*M[0]/h);vec2.scale(g,g,w);let A=vec2.fromValues(a*g[0]-n*g[1],n*g[0]+a*g[1]);A=vec2.add(A,A,vec2.scale(vec2.create(),vec2.add(vec2.create(),l,r),.5));const b=vec2.fromValues((M[0]-g[0])/h,(M[1]-g[1])/u),E=vec2.fromValues((-M[0]-g[0])/h,(-M[1]-g[1])/u),V=vec2.angleRadians(b);let q=vec2.angleRadians(E)-V;q%=TAU,!d&&q>0?q-=TAU:d&&q<0&&(q+=TAU);let y=Math.ceil(Math.abs(q)/TAU*c)+1;y<1&&(y=1);for(let e=1;e<y;e++){const t=V+e/y*q,r=Math.cos(t),o=Math.sin(t),s=vec2.fromValues(a*h*r-n*u*o,n*h*r+a*u*o);vec2.add(s,s,A),v.push(s)}y&&v.push(e.endpoint)}return v=i.concat(v),fromPoints({},v)};module.exports=appendArc;
153
-
154
- },{"../../maths/constants":94,"../../maths/vec2":191,"./fromPoints":61,"./toPoints":66}],52:[function(require,module,exports){
155
- const{TAU:TAU}=require("../../maths/constants"),vec2=require("../../maths/vec2"),vec3=require("../../maths/vec2"),appendPoints=require("./appendPoints"),toPoints=require("./toPoints"),appendBezier=(e,t)=>{let{controlPoints:o,segments:r}=Object.assign({},{segments:16},e);if(!Array.isArray(o))throw new Error("controlPoints must be an array of one or more points");if(o.length<1)throw new Error("controlPoints must be an array of one or more points");if(r<4)throw new Error("segments must be four or more");if(t.isClosed)throw new Error("the given geometry cannot be closed");const n=toPoints(t);if(n.length<1)throw new Error("the given path must contain one or more points (as the starting point for the bezier curve)");if(null===(o=o.slice())[0]){if(o.length<2)throw new Error("a null control point must be passed with one more control points");let e=n[n.length-2];if("lastBezierControlPoint"in t&&(e=t.lastBezierControlPoint),!Array.isArray(e))throw new Error("the given path must contain TWO or more points if given a null control point");const r=vec2.scale(vec2.create(),n[n.length-1],2);vec2.subtract(r,r,e),o[0]=r}o.unshift(n[n.length-1]);const s=o.length-1,i=[];let c=1;for(let e=0;e<=s;++e)e>0&&(c*=e),i.push(c);const a=[];for(let e=0;e<=s;++e){const t=i[s]/(i[e]*i[s-e]);a.push(t)}const l=vec2.create(),h=vec2.create(),p=vec3.create(),u=e=>{let t=1,r=Math.pow(1-e,s);const n=1!==e?1/(1-e):1,i=vec2.create();for(let c=0;c<=s;++c){c===s&&(r=1);const h=a[c]*t*r,p=vec2.scale(l,o[c],h);vec2.add(i,i,p),t*=e,r*=n}return i},v=[],m=[],f=s+1;for(let e=0;e<f;++e){const t=e/(f-1),o=u(t);v.push(o),m.push(t)}let g=1;const w=TAU/r,P=Math.sin(w);for(;g<v.length-1;){const e=vec2.subtract(l,v[g],v[g-1]);vec2.normalize(e,e);const t=vec2.subtract(h,v[g+1],v[g]);vec2.normalize(t,t);const o=vec2.cross(p,e,t);if(Math.abs(o[2])>P){const e=m[g-1],t=m[g+1],o=e+1*(t-e)/3,r=e+2*(t-e)/3,n=u(o),s=u(r);v.splice(g,1,n,s),m.splice(g,1,o,r),--g<1&&(g=1)}else++g}v.shift();const b=appendPoints(v,t);return b.lastBezierControlPoint=o[o.length-2],b};module.exports=appendBezier;
156
-
157
- },{"../../maths/constants":94,"../../maths/vec2":191,"./appendPoints":53,"./toPoints":66}],53:[function(require,module,exports){
158
- const concat=require("./concat"),create=require("./create"),appendPoints=(e,c)=>concat(c,create(e));module.exports=appendPoints;
159
-
160
- },{"./concat":57,"./create":58}],54:[function(require,module,exports){
161
- 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;
162
-
163
- },{"../../maths/mat4":143,"../../maths/vec2":191}],55:[function(require,module,exports){
164
- const clone=e=>Object.assign({},e);module.exports=clone;
165
-
166
- },{}],56:[function(require,module,exports){
167
- 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;
168
-
169
- },{"../../maths/constants":94,"../../maths/vec2":191,"./clone":55}],57:[function(require,module,exports){
170
- const fromPoints=require("./fromPoints"),toPoints=require("./toPoints"),{equals:equals}=require("../../maths/vec2"),concat=(...t)=>{let o=!1,e=[];return t.forEach((t,n)=>{const s=toPoints(t).slice();if(e.length>0&&s.length>0&&equals(s[0],e[e.length-1])&&s.shift(),s.length>0&&o)throw new Error(`Cannot concatenate to a closed path; check the ${n}th path`);o=t.isClosed,e=e.concat(s)}),fromPoints({closed:o},e)};module.exports=concat;
171
-
172
- },{"../../maths/vec2":191,"./fromPoints":61,"./toPoints":66}],58:[function(require,module,exports){
173
- const mat4=require("../../maths/mat4"),create=e=>(void 0===e&&(e=[]),{points:e,isClosed:!1,transforms:mat4.create()});module.exports=create;
174
-
175
- },{"../../maths/mat4":143}],59:[function(require,module,exports){
176
- const vec2=require("../../maths/vec2"),toPoints=require("./toPoints"),equals=(e,t)=>{if(e.isClosed!==t.isClosed)return!1;if(e.points.length!==t.points.length)return!1;const o=toPoints(e),s=toPoints(t),i=o.length;let r=0;do{let t=!1;for(let e=0;e<i;e++)if(!vec2.equals(o[e],s[(e+r)%i])){t=!0;break}if(!1===t)return!0;if(!e.isClosed)return!1}while(++r<i);return!1};module.exports=equals;
177
-
178
- },{"../../maths/vec2":191,"./toPoints":66}],60:[function(require,module,exports){
179
- const mat4=require("../../maths/mat4"),vec2=require("../../maths/vec2"),create=require("./create"),fromCompactBinary=r=>{if(2!==r[0])throw new Error("invalid compact binary data");const e=create();e.transforms=mat4.clone(r.slice(1,17)),e.isClosed=!!r[17];for(let t=22;t<r.length;t+=2){const o=vec2.fromValues(r[t],r[t+1]);e.points.push(o)}return r[18]>=0&&(e.color=[r[18],r[19],r[20],r[21]]),e};module.exports=fromCompactBinary;
180
-
181
- },{"../../maths/mat4":143,"../../maths/vec2":191,"./create":58}],61:[function(require,module,exports){
182
- const{EPS:EPS}=require("../../maths/constants"),vec2=require("../../maths/vec2"),close=require("./close"),create=require("./create"),fromPoints=(e,t)=>{let{closed:s}=Object.assign({},{closed:!1},e),o=create();if(o.points=t.map(e=>vec2.clone(e)),o.points.length>1){const e=o.points[0],t=o.points[o.points.length-1];vec2.distance(e,t)<EPS*EPS&&(s=!0)}return!0===s&&(o=close(o)),o};module.exports=fromPoints;
183
-
184
- },{"../../maths/constants":94,"../../maths/vec2":191,"./close":56,"./create":58}],62:[function(require,module,exports){
185
- module.exports={appendArc:require("./appendArc"),appendBezier:require("./appendBezier"),appendPoints:require("./appendPoints"),clone:require("./clone"),close:require("./close"),concat:require("./concat"),create:require("./create"),equals:require("./equals"),fromPoints:require("./fromPoints"),fromCompactBinary:require("./fromCompactBinary"),isA:require("./isA"),reverse:require("./reverse"),toPoints:require("./toPoints"),toString:require("./toString"),toCompactBinary:require("./toCompactBinary"),transform:require("./transform"),validate:require("./validate")};
186
-
187
- },{"./appendArc":51,"./appendBezier":52,"./appendPoints":53,"./clone":55,"./close":56,"./concat":57,"./create":58,"./equals":59,"./fromCompactBinary":60,"./fromPoints":61,"./isA":63,"./reverse":64,"./toCompactBinary":65,"./toPoints":66,"./toString":67,"./transform":68,"./validate":69}],63:[function(require,module,exports){
188
- const isA=s=>!!(s&&"object"==typeof s&&"points"in s&&"transforms"in s&&"isClosed"in s&&Array.isArray(s.points)&&"length"in s.transforms);module.exports=isA;
189
-
190
- },{}],64:[function(require,module,exports){
191
- const clone=require("./clone"),reverse=e=>{const r=clone(e);return r.points=e.points.slice().reverse(),r};module.exports=reverse;
192
-
193
- },{"./clone":55}],65:[function(require,module,exports){
194
- const toCompactBinary=o=>{const t=o.points,n=o.transforms;let r=[-1,-1,-1,-1];o.color&&(r=o.color);const s=new Float32Array(22+2*t.length);s[0]=2,s[1]=n[0],s[2]=n[1],s[3]=n[2],s[4]=n[3],s[5]=n[4],s[6]=n[5],s[7]=n[6],s[8]=n[7],s[9]=n[8],s[10]=n[9],s[11]=n[10],s[12]=n[11],s[13]=n[12],s[14]=n[13],s[15]=n[14],s[16]=n[15],s[17]=o.isClosed?1:0,s[18]=r[0],s[19]=r[1],s[20]=r[2],s[21]=r[3];for(let o=0;o<t.length;o++){const n=2*o+22,r=t[o];s[n]=r[0],s[n+1]=r[1]}return s};module.exports=toCompactBinary;
195
-
196
- },{}],66:[function(require,module,exports){
197
- const applyTransforms=require("./applyTransforms"),toPoints=o=>applyTransforms(o).points;module.exports=toPoints;
198
-
199
- },{"./applyTransforms":54}],67:[function(require,module,exports){
200
- 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;
201
-
202
- },{"../../maths/vec2":191,"./toPoints":66}],68:[function(require,module,exports){
203
- 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;
204
-
205
- },{"../../maths/mat4":143}],69:[function(require,module,exports){
206
- const vec2=require("../../maths/vec2"),isA=require("./isA"),validate=r=>{if(!isA(r))throw new Error("invalid path2 structure");if(r.points.length>1)for(let i=0;i<r.points.length;i++)if(vec2.equals(r.points[i],r.points[(i+1)%r.points.length]))throw new Error(`path2 duplicate points ${r.points[i]}`);if(r.points.forEach(r=>{if(!r.every(Number.isFinite))throw new Error(`path2 invalid point ${r}`)}),!r.transforms.every(Number.isFinite))throw new Error(`path2 invalid transforms ${r.transforms}`)};module.exports=validate;
207
-
208
- },{"../../maths/vec2":191,"./isA":63}],70:[function(require,module,exports){
209
- const measureArea=require("./measureArea"),flip=require("./flip"),arePointsInside=(e,r)=>{if(0===e.length)return 0;const n=r.vertices;return n.length<3?0:(measureArea(r)<0&&(r=flip(r)),e.reduce((e,r)=>e+isPointInside(r,n),0)===e.length?1:0)},isPointInside=(e,r)=>{const n=r.length,t=e[0],i=e[1];let s=r[n-1],o=r[0],l=s[1]>i,u=0,a=0;for(let e=n+1;--e;){const e=o[1]>i;if(l!==e){const e=s[0]>t,r=o[0]>t;e&&r?u=!u:o[0]-(o[1]-i)*(s[0]-o[0])/(s[1]-o[1])>=t&&(u=!u)}l=e,s=o,o=r[++a]}return u};module.exports=arePointsInside;
210
-
211
- },{"./flip":72,"./measureArea":74}],71:[function(require,module,exports){
212
- const create=e=>((void 0===e||e.length<3)&&(e=[]),{vertices:e});module.exports=create;
213
-
214
- },{}],72:[function(require,module,exports){
215
- const create=require("./create"),flip=e=>{const r=e.vertices.slice().reverse();return create(r)};module.exports=flip;
216
-
217
- },{"./create":71}],73:[function(require,module,exports){
218
- module.exports={arePointsInside:require("./arePointsInside"),create:require("./create"),flip:require("./flip"),measureArea:require("./measureArea")};
219
-
220
- },{"./arePointsInside":70,"./create":71,"./flip":72,"./measureArea":74}],74:[function(require,module,exports){
221
- const area=require("../../maths/utils/area"),measureArea=e=>area(e.vertices);module.exports=measureArea;
222
-
223
- },{"../../maths/utils/area":168}],75:[function(require,module,exports){
224
- const create=require("./create"),vec3=require("../../maths/vec3"),clone=(...e)=>{let c,r;return 1===e.length?(c=create(),r=e[0]):(c=e[0],r=e[1]),c.vertices=r.vertices.map(e=>vec3.clone(e)),c};module.exports=clone;
225
-
226
- },{"../../maths/vec3":222,"./create":76}],76:[function(require,module,exports){
227
- const create=e=>((void 0===e||e.length<3)&&(e=[]),{vertices:e});module.exports=create;
228
-
229
- },{}],77:[function(require,module,exports){
230
- const vec3=require("../../maths/vec3"),create=require("./create"),fromPoints=e=>{const r=e.map(e=>vec3.clone(e));return create(r)};module.exports=fromPoints;
231
-
232
- },{"../../maths/vec3":222,"./create":76}],78:[function(require,module,exports){
233
- const create=require("./create"),fromPointsAndPlane=(e,n)=>{const r=create(e);return r.plane=n,r};module.exports=fromPointsAndPlane;
234
-
235
- },{"./create":76}],79:[function(require,module,exports){
236
- module.exports={clone:require("./clone"),create:require("./create"),fromPoints:require("./fromPoints"),fromPointsAndPlane:require("./fromPointsAndPlane"),invert:require("./invert"),isA:require("./isA"),isConvex:require("./isConvex"),measureArea:require("./measureArea"),measureBoundingBox:require("./measureBoundingBox"),measureBoundingSphere:require("./measureBoundingSphere"),measureSignedVolume:require("./measureSignedVolume"),plane:require("./plane"),toPoints:require("./toPoints"),toString:require("./toString"),transform:require("./transform"),validate:require("./validate")};
237
-
238
- },{"./clone":75,"./create":76,"./fromPoints":77,"./fromPointsAndPlane":78,"./invert":80,"./isA":81,"./isConvex":82,"./measureArea":83,"./measureBoundingBox":84,"./measureBoundingSphere":85,"./measureSignedVolume":86,"./plane":87,"./toPoints":88,"./toString":89,"./transform":90,"./validate":91}],80:[function(require,module,exports){
239
- const plane=require("../../maths/plane"),create=require("./create"),invert=e=>{const r=e.vertices.slice().reverse(),a=create(r);return e.plane&&(a.plane=plane.flip(plane.create(),e.plane)),a};module.exports=invert;
240
-
241
- },{"../../maths/plane":163,"./create":76}],81:[function(require,module,exports){
242
- const isA=e=>!!(e&&"object"==typeof e&&"vertices"in e&&Array.isArray(e.vertices));module.exports=isA;
243
-
244
- },{}],82:[function(require,module,exports){
245
- 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;
246
-
247
- },{"../../maths/plane":163,"../../maths/vec3":222}],83:[function(require,module,exports){
248
- 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;
249
-
250
- },{"./plane":87}],84:[function(require,module,exports){
251
- 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;
252
-
253
- },{"../../maths/vec3":222}],85:[function(require,module,exports){
254
- const vec4=require("../../maths/vec4"),cache=new WeakMap,measureBoundingSphere=e=>{const r=cache.get(e);if(r)return r;const t=e.vertices,c=vec4.create();if(0===t.length)return c[0]=0,c[1]=0,c[2]=0,c[3]=0,c;let n=t[0],a=n,s=n,h=n,o=n,u=n;t.forEach(e=>{n[0]>e[0]&&(n=e),a[1]>e[1]&&(a=e),s[2]>e[2]&&(s=e),h[0]<e[0]&&(h=e),o[1]<e[1]&&(o=e),u[2]<e[2]&&(u=e)}),c[0]=.5*(n[0]+h[0]),c[1]=.5*(a[1]+o[1]),c[2]=.5*(s[2]+u[2]);const i=c[0]-h[0],g=c[1]-o[1],m=c[2]-u[2];return c[3]=Math.sqrt(i*i+g*g+m*m),cache.set(e,c),c};module.exports=measureBoundingSphere;
255
-
256
- },{"../../maths/vec4":248}],86:[function(require,module,exports){
257
- 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;
258
-
259
- },{"../../maths/vec3":222}],87:[function(require,module,exports){
260
- const mplane=require("../../maths/plane/"),plane=e=>(e.plane||(e.plane=mplane.fromPoints(mplane.create(),...e.vertices)),e.plane);module.exports=plane;
261
-
262
- },{"../../maths/plane/":163}],88:[function(require,module,exports){
263
- const toPoints=o=>o.vertices;module.exports=toPoints;
264
-
265
- },{}],89:[function(require,module,exports){
266
- const vec3=require("../../maths/vec3/"),toString=e=>{let t="poly3: vertices: [";return e.vertices.forEach(e=>{t+=`${vec3.toString(e)}, `}),t+="]"};module.exports=toString;
267
-
268
- },{"../../maths/vec3/":222}],90:[function(require,module,exports){
269
- const mat4=require("../../maths/mat4"),vec3=require("../../maths/vec3"),create=require("./create"),transform=(e,r)=>{const t=r.vertices.map(r=>vec3.transform(vec3.create(),r,e));return mat4.isMirroring(e)&&t.reverse(),create(t)};module.exports=transform;
270
-
271
- },{"../../maths/mat4":143,"../../maths/vec3":222,"./create":76}],91:[function(require,module,exports){
272
- const signedDistanceToPoint=require("../../maths/plane/signedDistanceToPoint"),{NEPS:NEPS}=require("../../maths/constants"),vec3=require("../../maths/vec3"),isA=require("./isA"),isConvex=require("./isConvex"),measureArea=require("./measureArea"),plane=require("./plane"),validate=e=>{if(!isA(e))throw new Error("invalid poly3 structure");if(e.vertices.length<3)throw new Error(`poly3 not enough vertices ${e.vertices.length}`);if(measureArea(e)<=0)throw new Error("poly3 area must be greater than zero");for(let r=0;r<e.vertices.length;r++)if(vec3.equals(e.vertices[r],e.vertices[(r+1)%e.vertices.length]))throw new Error(`poly3 duplicate vertex ${e.vertices[r]}`);if(!isConvex(e))throw new Error("poly3 must be convex");if(e.vertices.forEach(e=>{if(!e.every(Number.isFinite))throw new Error(`poly3 invalid vertex ${e}`)}),e.vertices.length>3){const r=plane(e);e.vertices.forEach(e=>{const t=Math.abs(signedDistanceToPoint(r,e));if(t>NEPS)throw new Error(`poly3 must be coplanar: vertex ${e} distance ${t}`)})}};module.exports=validate;
273
-
274
- },{"../../maths/constants":94,"../../maths/plane/signedDistanceToPoint":165,"../../maths/vec3":222,"./isA":81,"./isConvex":82,"./measureArea":83,"./plane":87}],92:[function(require,module,exports){
275
- 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")};
276
-
277
- },{"./colors":8,"./curves":19,"./geometries":50,"./maths":95,"./measurements":252,"./operations/booleans":266,"./operations/expansions":295,"./operations/extrusions":318,"./operations/hulls":341,"./operations/modifiers":352,"./operations/transforms":362,"./primitives":378,"./text":392,"./utils":400}],93:[function(require,module,exports){
278
- 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.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]),s=vec3.scale(vec3.create(),this.v,e[1]),i=vec3.add(t,t,this.planeorigin);return vec3.add(s,s,i)}},module.exports=OrthoNormalBasis;
279
-
280
- },{"./mat4":143,"./vec2":191,"./vec3":222}],94:[function(require,module,exports){
281
- const spatialResolution=1e5,EPS=1e-5,NEPS=1e-13,TAU=2*Math.PI;module.exports={EPS:EPS,NEPS:NEPS,TAU:TAU,spatialResolution:1e5};
282
-
283
- },{}],95:[function(require,module,exports){
284
- module.exports={constants:require("./constants"),line2:require("./line2"),line3:require("./line3"),mat4:require("./mat4"),plane:require("./plane"),utils:require("./utils"),vec2:require("./vec2"),vec3:require("./vec3"),vec4:require("./vec4")};
285
-
286
- },{"./constants":94,"./line2":105,"./line3":122,"./mat4":143,"./plane":163,"./utils":169,"./vec2":191,"./vec3":222,"./vec4":248}],96:[function(require,module,exports){
287
- 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;
288
-
289
- },{"./create":99}],97:[function(require,module,exports){
290
- const vec2=require("../vec2"),direction=require("./direction"),origin=require("./origin"),closestPoint=(e,c)=>{const i=origin(e),r=direction(e),o=vec2.subtract(vec2.create(),c,i),t=vec2.dot(o,r);return vec2.scale(o,r,t),vec2.add(o,o,i),o};module.exports=closestPoint;
291
-
292
- },{"../vec2":191,"./direction":100,"./origin":107}],98:[function(require,module,exports){
293
- const copy=(o,c)=>(o[0]=c[0],o[1]=c[1],o[2]=c[2],o);module.exports=copy;
294
-
295
- },{}],99:[function(require,module,exports){
296
- const create=()=>[0,1,0];module.exports=create;
297
-
298
- },{}],100:[function(require,module,exports){
299
- const vec2=require("../vec2"),direction=e=>{const c=vec2.normal(vec2.create(),e);return vec2.negate(c,c),c};module.exports=direction;
300
-
301
- },{"../vec2":191}],101:[function(require,module,exports){
302
- const vec2=require("../vec2"),distanceToPoint=(e,t)=>{let o=vec2.dot(t,e);return o=Math.abs(o-e[2])};module.exports=distanceToPoint;
303
-
304
- },{"../vec2":191}],102:[function(require,module,exports){
305
- const equals=(e,s)=>e[0]===s[0]&&e[1]===s[1]&&e[2]===s[2];module.exports=equals;
306
-
307
- },{}],103:[function(require,module,exports){
308
- const vec2=require("../vec2"),fromPoints=(e,c,o)=>{const r=vec2.subtract(vec2.create(),o,c);vec2.normal(r,r),vec2.normalize(r,r);const t=vec2.dot(c,r);return e[0]=r[0],e[1]=r[1],e[2]=t,e};module.exports=fromPoints;
309
-
310
- },{"../vec2":191}],104:[function(require,module,exports){
311
- const create=require("./create"),fromValues=(e,r,t)=>{const o=create();return o[0]=e,o[1]=r,o[2]=t,o};module.exports=fromValues;
312
-
313
- },{"./create":99}],105:[function(require,module,exports){
314
- module.exports={clone:require("./clone"),closestPoint:require("./closestPoint"),copy:require("./copy"),create:require("./create"),direction:require("./direction"),distanceToPoint:require("./distanceToPoint"),equals:require("./equals"),fromPoints:require("./fromPoints"),fromValues:require("./fromValues"),intersectPointOfLines:require("./intersectPointOfLines"),origin:require("./origin"),reverse:require("./reverse"),toString:require("./toString"),transform:require("./transform"),xAtY:require("./xAtY")};
315
-
316
- },{"./clone":96,"./closestPoint":97,"./copy":98,"./create":99,"./direction":100,"./distanceToPoint":101,"./equals":102,"./fromPoints":103,"./fromValues":104,"./intersectPointOfLines":106,"./origin":107,"./reverse":108,"./toString":109,"./transform":110,"./xAtY":111}],106:[function(require,module,exports){
317
- const vec2=require("../vec2"),{solve2Linear:solve2Linear}=require("../utils"),intersectToLine=(e,r)=>{const n=solve2Linear(e[0],e[1],r[0],r[1],e[2],r[2]);return vec2.clone(n)};module.exports=intersectToLine;
318
-
319
- },{"../utils":169,"../vec2":191}],107:[function(require,module,exports){
320
- const vec2=require("../vec2"),origin=e=>vec2.scale(vec2.create(),e,e[2]);module.exports=origin;
321
-
322
- },{"../vec2":191}],108:[function(require,module,exports){
323
- const vec2=require("../vec2"),copy=require("./copy"),fromValues=require("./fromValues"),reverse=(e,r)=>{const c=vec2.negate(vec2.create(),r),o=-r[2];return copy(e,fromValues(c[0],c[1],o))};module.exports=reverse;
324
-
325
- },{"../vec2":191,"./copy":98,"./fromValues":104}],109:[function(require,module,exports){
326
- const toString=t=>`line2: (${t[0].toFixed(7)}, ${t[1].toFixed(7)}, ${t[2].toFixed(7)})`;module.exports=toString;
327
-
328
- },{}],110:[function(require,module,exports){
329
- const vec2=require("../vec2"),fromPoints=require("./fromPoints"),origin=require("./origin"),direction=require("./direction"),transform=(r,o,i)=>{const e=origin(o),n=direction(o);return vec2.transform(e,e,i),vec2.transform(n,n,i),fromPoints(r,e,n)};module.exports=transform;
330
-
331
- },{"../vec2":191,"./direction":100,"./fromPoints":103,"./origin":107}],111:[function(require,module,exports){
332
- const origin=require("./origin"),xAtY=(i,r)=>{let e=(i[2]-i[1]*r)/i[0];if(Number.isNaN(e)){e=origin(i)[0]}return e};module.exports=xAtY;
333
-
334
- },{"./origin":107}],112:[function(require,module,exports){
335
- const vec3=require("../vec3"),create=require("./create"),clone=e=>{const c=create();return vec3.copy(c[0],e[0]),vec3.copy(c[1],e[1]),c};module.exports=clone;
336
-
337
- },{"../vec3":222,"./create":115}],113:[function(require,module,exports){
338
- const vec3=require("../vec3"),closestPoint=(e,c)=>{const t=e[0],o=e[1],s=vec3.dot(vec3.subtract(vec3.create(),c,t),o)/vec3.dot(o,o),v=vec3.scale(vec3.create(),o,s);return vec3.add(v,v,t),v};module.exports=closestPoint;
339
-
340
- },{"../vec3":222}],114:[function(require,module,exports){
341
- const vec3=require("../vec3"),copy=(c,e)=>(vec3.copy(c[0],e[0]),vec3.copy(c[1],e[1]),c);module.exports=copy;
342
-
343
- },{"../vec3":222}],115:[function(require,module,exports){
344
- const vec3=require("../vec3"),create=()=>[vec3.fromValues(0,0,0),vec3.fromValues(0,0,1)];module.exports=create;
345
-
346
- },{"../vec3":222}],116:[function(require,module,exports){
347
- const direction=o=>o[1];module.exports=direction;
348
-
349
- },{}],117:[function(require,module,exports){
350
- const vec3=require("../vec3"),closestPoint=require("./closestPoint"),distanceToPoint=(e,t)=>{const c=closestPoint(e,t),o=vec3.subtract(vec3.create(),t,c);return vec3.length(o)};module.exports=distanceToPoint;
351
-
352
- },{"../vec3":222,"./closestPoint":113}],118:[function(require,module,exports){
353
- const vec3=require("../vec3"),equals=(e,s)=>!!vec3.equals(e[1],s[1])&&!!vec3.equals(e[0],s[0]);module.exports=equals;
354
-
355
- },{"../vec3":222}],119:[function(require,module,exports){
356
- const vec3=require("../vec3"),{solve2Linear:solve2Linear}=require("../utils"),{EPS:EPS}=require("../constants"),fromPointAndDirection=require("./fromPointAndDirection"),fromPlanes=(e,r,o)=>{let n=vec3.cross(vec3.create(),r,o),s=vec3.length(n);if(s<EPS)throw new Error("parallel planes do not intersect");s=1/s,n=vec3.scale(n,n,s);const t=Math.abs(n[0]),a=Math.abs(n[1]),i=Math.abs(n[2]);let l,c;return t>=a&&t>=i?(c=solve2Linear(r[1],r[2],o[1],o[2],r[3],o[3]),l=vec3.fromValues(0,c[0],c[1])):a>=t&&a>=i?(c=solve2Linear(r[0],r[2],o[0],o[2],r[3],o[3]),l=vec3.fromValues(c[0],0,c[1])):(c=solve2Linear(r[0],r[1],o[0],o[1],r[3],o[3]),l=vec3.fromValues(c[0],c[1],0)),fromPointAndDirection(e,l,n)};module.exports=fromPlanes;
357
-
358
- },{"../constants":94,"../utils":169,"../vec3":222,"./fromPointAndDirection":120}],120:[function(require,module,exports){
359
- const vec3=require("../vec3"),fromPointAndDirection=(e,c,o)=>{const r=vec3.normalize(vec3.create(),o);return vec3.copy(e[0],c),vec3.copy(e[1],r),e};module.exports=fromPointAndDirection;
360
-
361
- },{"../vec3":222}],121:[function(require,module,exports){
362
- const vec3=require("../vec3"),fromPointAndDirection=require("./fromPointAndDirection"),fromPoints=(o,r,e)=>{const t=vec3.subtract(vec3.create(),e,r);return fromPointAndDirection(o,r,t)};module.exports=fromPoints;
363
-
364
- },{"../vec3":222,"./fromPointAndDirection":120}],122:[function(require,module,exports){
365
- module.exports={clone:require("./clone"),closestPoint:require("./closestPoint"),copy:require("./copy"),create:require("./create"),direction:require("./direction"),distanceToPoint:require("./distanceToPoint"),equals:require("./equals"),fromPlanes:require("./fromPlanes"),fromPointAndDirection:require("./fromPointAndDirection"),fromPoints:require("./fromPoints"),intersectPointOfLineAndPlane:require("./intersectPointOfLineAndPlane"),origin:require("./origin"),reverse:require("./reverse"),toString:require("./toString"),transform:require("./transform")};
366
-
367
- },{"./clone":112,"./closestPoint":113,"./copy":114,"./create":115,"./direction":116,"./distanceToPoint":117,"./equals":118,"./fromPlanes":119,"./fromPointAndDirection":120,"./fromPoints":121,"./intersectPointOfLineAndPlane":123,"./origin":124,"./reverse":125,"./toString":126,"./transform":127}],123:[function(require,module,exports){
368
- const vec3=require("../vec3"),intersectToPlane=(e,c)=>{const t=c,r=c[3],o=e[0],v=e[1],n=(r-vec3.dot(t,o))/vec3.dot(t,v);return vec3.add(vec3.create(),o,vec3.scale(vec3.create(),v,n))};module.exports=intersectToPlane;
369
-
370
- },{"../vec3":222}],124:[function(require,module,exports){
371
- const origin=o=>o[0];module.exports=origin;
372
-
373
- },{}],125:[function(require,module,exports){
374
- const vec3=require("../vec3"),fromPointAndDirection=require("./fromPointAndDirection"),reverse=(e,r)=>{const n=vec3.clone(r[0]),o=vec3.negate(vec3.create(),r[1]);return fromPointAndDirection(e,n,o)};module.exports=reverse;
375
-
376
- },{"../vec3":222,"./fromPointAndDirection":120}],126:[function(require,module,exports){
377
- const toString=t=>{const o=t[0],i=t[1];return`line3: point: (${o[0].toFixed(7)}, ${o[1].toFixed(7)}, ${o[2].toFixed(7)}) direction: (${i[0].toFixed(7)}, ${i[1].toFixed(7)}, ${i[2].toFixed(7)})`};module.exports=toString;
378
-
379
- },{}],127:[function(require,module,exports){
380
- const vec3=require("../vec3"),fromPointAndDirection=require("./fromPointAndDirection"),transform=(r,e,t)=>{const o=e[0],c=e[1],n=vec3.add(vec3.create(),o,c),i=vec3.transform(vec3.create(),o,t),a=vec3.transform(n,n,t),m=vec3.subtract(a,a,i);return fromPointAndDirection(r,i,m)};module.exports=transform;
381
-
382
- },{"../vec3":222,"./fromPointAndDirection":120}],128:[function(require,module,exports){
383
- const add=(d,o,a)=>(d[0]=o[0]+a[0],d[1]=o[1]+a[1],d[2]=o[2]+a[2],d[3]=o[3]+a[3],d[4]=o[4]+a[4],d[5]=o[5]+a[5],d[6]=o[6]+a[6],d[7]=o[7]+a[7],d[8]=o[8]+a[8],d[9]=o[9]+a[9],d[10]=o[10]+a[10],d[11]=o[11]+a[11],d[12]=o[12]+a[12],d[13]=o[13]+a[13],d[14]=o[14]+a[14],d[15]=o[15]+a[15],d);module.exports=add;
384
-
385
- },{}],129:[function(require,module,exports){
386
- const create=require("./create"),clone=e=>{const r=create();return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r[4]=e[4],r[5]=e[5],r[6]=e[6],r[7]=e[7],r[8]=e[8],r[9]=e[9],r[10]=e[10],r[11]=e[11],r[12]=e[12],r[13]=e[13],r[14]=e[14],r[15]=e[15],r};module.exports=clone;
387
-
388
- },{"./create":131}],130:[function(require,module,exports){
389
- const copy=(o,c)=>(o[0]=c[0],o[1]=c[1],o[2]=c[2],o[3]=c[3],o[4]=c[4],o[5]=c[5],o[6]=c[6],o[7]=c[7],o[8]=c[8],o[9]=c[9],o[10]=c[10],o[11]=c[11],o[12]=c[12],o[13]=c[13],o[14]=c[14],o[15]=c[15],o);module.exports=copy;
390
-
391
- },{}],131:[function(require,module,exports){
392
- const create=()=>[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];module.exports=create;
393
-
394
- },{}],132:[function(require,module,exports){
395
- 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;
396
-
397
- },{}],133:[function(require,module,exports){
398
- const{EPS:EPS}=require("../constants"),{sin:sin,cos:cos}=require("../utils/trigonometry"),identity=require("./identity"),fromRotation=(t,o,i)=>{let[n,r,s]=i;const e=n*n+r*r+s*s;if(Math.abs(e)<EPS)return identity(t);const c=1/Math.sqrt(e);n*=c,r*=c,s*=c;const u=sin(o),a=cos(o),d=1-a;return t[0]=n*n*d+a,t[1]=r*n*d+s*u,t[2]=s*n*d-r*u,t[3]=0,t[4]=n*r*d-s*u,t[5]=r*r*d+a,t[6]=s*r*d+n*u,t[7]=0,t[8]=n*s*d+r*u,t[9]=r*s*d-n*u,t[10]=s*s*d+a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t};module.exports=fromRotation;
399
-
400
- },{"../constants":94,"../utils/trigonometry":173,"./identity":142}],134:[function(require,module,exports){
401
- 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;
402
-
403
- },{}],135:[function(require,module,exports){
404
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),fromTaitBryanRotation=(o,s,n,t)=>{const i=sin(s),r=cos(s),c=sin(n),a=cos(n),e=sin(t),m=cos(t);return o[0]=a*r,o[1]=a*i,o[2]=-c,o[3]=0,o[4]=e*c*r-m*i,o[5]=m*r+e*c*i,o[6]=e*a,o[7]=0,o[8]=e*i+m*c*r,o[9]=m*c*i-e*r,o[10]=m*a,o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o};module.exports=fromTaitBryanRotation;
405
-
406
- },{"../utils/trigonometry":173}],136:[function(require,module,exports){
407
- const fromTranslation=(o,n)=>(o[0]=1,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=1,o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[10]=1,o[11]=0,o[12]=n[0],o[13]=n[1],o[14]=n[2],o[15]=1,o);module.exports=fromTranslation;
408
-
409
- },{}],137:[function(require,module,exports){
410
- const create=require("./create"),fromValues=(e,r,t,o,a,c,s,u,l,m,n,f,V,d,i,p)=>{const q=create();return q[0]=e,q[1]=r,q[2]=t,q[3]=o,q[4]=a,q[5]=c,q[6]=s,q[7]=u,q[8]=l,q[9]=m,q[10]=n,q[11]=f,q[12]=V,q[13]=d,q[14]=i,q[15]=p,q};module.exports=fromValues;
411
-
412
- },{"./create":131}],138:[function(require,module,exports){
413
- const vec3=require("../vec3"),fromRotation=require("./fromRotation"),fromVectorRotation=(o,e,t)=>{const r=vec3.normalize(vec3.create(),e),c=vec3.normalize(vec3.create(),t),n=vec3.cross(vec3.create(),c,r),a=vec3.dot(c,r);if(-1===a)return fromRotation(o,Math.PI,vec3.orthogonal(n,r));const i=1/(1+a);return o[0]=n[0]*n[0]*i+a,o[1]=n[1]*n[0]*i-n[2],o[2]=n[2]*n[0]*i+n[1],o[3]=0,o[4]=n[0]*n[1]*i+n[2],o[5]=n[1]*n[1]*i+a,o[6]=n[2]*n[1]*i-n[0],o[7]=0,o[8]=n[0]*n[2]*i-n[1],o[9]=n[1]*n[2]*i+n[0],o[10]=n[2]*n[2]*i+a,o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o};module.exports=fromVectorRotation;
414
-
415
- },{"../vec3":222,"./fromRotation":133}],139:[function(require,module,exports){
416
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),fromXRotation=(o,t)=>{const s=sin(t),n=cos(t);return o[0]=1,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=n,o[6]=s,o[7]=0,o[8]=0,o[9]=-s,o[10]=n,o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o};module.exports=fromXRotation;
417
-
418
- },{"../utils/trigonometry":173}],140:[function(require,module,exports){
419
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),fromYRotation=(o,t)=>{const s=sin(t),n=cos(t);return o[0]=n,o[1]=0,o[2]=-s,o[3]=0,o[4]=0,o[5]=1,o[6]=0,o[7]=0,o[8]=s,o[9]=0,o[10]=n,o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o};module.exports=fromYRotation;
420
-
421
- },{"../utils/trigonometry":173}],141:[function(require,module,exports){
422
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),fromZRotation=(o,t)=>{const s=sin(t),n=cos(t);return o[0]=n,o[1]=s,o[2]=0,o[3]=0,o[4]=-s,o[5]=n,o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[10]=1,o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o};module.exports=fromZRotation;
423
-
424
- },{"../utils/trigonometry":173}],142:[function(require,module,exports){
425
- const identity=t=>(t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t);module.exports=identity;
426
-
427
- },{}],143:[function(require,module,exports){
428
- module.exports={add:require("./add"),clone:require("./clone"),copy:require("./copy"),create:require("./create"),invert:require("./invert"),equals:require("./equals"),fromRotation:require("./fromRotation"),fromScaling:require("./fromScaling"),fromTaitBryanRotation:require("./fromTaitBryanRotation"),fromTranslation:require("./fromTranslation"),fromValues:require("./fromValues"),fromVectorRotation:require("./fromVectorRotation"),fromXRotation:require("./fromXRotation"),fromYRotation:require("./fromYRotation"),fromZRotation:require("./fromZRotation"),identity:require("./identity"),isIdentity:require("./isIdentity"),isOnlyTransformScale:require("./isOnlyTransformScale"),isMirroring:require("./isMirroring"),mirrorByPlane:require("./mirrorByPlane"),multiply:require("./multiply"),rotate:require("./rotate"),rotateX:require("./rotateX"),rotateY:require("./rotateY"),rotateZ:require("./rotateZ"),scale:require("./scale"),subtract:require("./subtract"),toString:require("./toString"),translate:require("./translate")};
429
-
430
- },{"./add":128,"./clone":129,"./copy":130,"./create":131,"./equals":132,"./fromRotation":133,"./fromScaling":134,"./fromTaitBryanRotation":135,"./fromTranslation":136,"./fromValues":137,"./fromVectorRotation":138,"./fromXRotation":139,"./fromYRotation":140,"./fromZRotation":141,"./identity":142,"./invert":144,"./isIdentity":145,"./isMirroring":146,"./isOnlyTransformScale":147,"./mirrorByPlane":148,"./multiply":149,"./rotate":150,"./rotateX":151,"./rotateY":152,"./rotateZ":153,"./scale":154,"./subtract":155,"./toString":156,"./translate":157}],144:[function(require,module,exports){
431
- const invert=(t,e)=>{const n=e[0],r=e[1],l=e[2],o=e[3],s=e[4],u=e[5],c=e[6],i=e[7],v=e[8],d=e[9],m=e[10],p=e[11],x=e[12],a=e[13],b=e[14],f=e[15],g=n*u-r*s,h=n*c-l*s,j=n*i-o*s,k=r*c-l*u,q=r*i-o*u,w=l*i-o*c,y=v*a-d*x,z=v*b-m*x,A=v*f-p*x,B=d*b-m*a,C=d*f-p*a,D=m*f-p*b;let E=g*D-h*C+j*B+k*A-q*z+w*y;return E?(E=1/E,t[0]=(u*D-c*C+i*B)*E,t[1]=(l*C-r*D-o*B)*E,t[2]=(a*w-b*q+f*k)*E,t[3]=(m*q-d*w-p*k)*E,t[4]=(c*A-s*D-i*z)*E,t[5]=(n*D-l*A+o*z)*E,t[6]=(b*j-x*w-f*h)*E,t[7]=(v*w-m*j+p*h)*E,t[8]=(s*C-u*A+i*y)*E,t[9]=(r*A-n*C-o*y)*E,t[10]=(x*q-a*j+f*g)*E,t[11]=(d*j-v*q-p*g)*E,t[12]=(u*z-s*B-c*y)*E,t[13]=(n*B-r*z+l*y)*E,t[14]=(a*h-x*k-b*g)*E,t[15]=(v*k-d*h+m*g)*E,t):null};module.exports=invert;
432
-
433
- },{}],145:[function(require,module,exports){
434
- const isIdentity=t=>1===t[0]&&0===t[1]&&0===t[2]&&0===t[3]&&0===t[4]&&1===t[5]&&0===t[6]&&0===t[7]&&0===t[8]&&0===t[9]&&1===t[10]&&0===t[11]&&0===t[12]&&0===t[13]&&0===t[14]&&1===t[15];module.exports=isIdentity;
435
-
436
- },{}],146:[function(require,module,exports){
437
- const isMirroring=r=>{const i=r[4]*r[9]-r[8]*r[5],o=r[8]*r[1]-r[0]*r[9],n=r[0]*r[5]-r[4]*r[1];return i*r[2]+o*r[6]+n*r[10]<0};module.exports=isMirroring;
438
-
439
- },{}],147:[function(require,module,exports){
440
- const isOnlyTransformScale=s=>isZero(s[1])&&isZero(s[2])&&isZero(s[3])&&isZero(s[4])&&isZero(s[6])&&isZero(s[7])&&isZero(s[8])&&isZero(s[9])&&isZero(s[11])&&1===s[15],isZero=s=>Math.abs(s)<Number.EPSILON;module.exports=isOnlyTransformScale;
441
-
442
- },{}],148:[function(require,module,exports){
443
- const mirrorByPlane=(r,o)=>{const[e,n,t,l]=o;return r[0]=1-2*e*e,r[1]=-2*n*e,r[2]=-2*t*e,r[3]=0,r[4]=-2*e*n,r[5]=1-2*n*n,r[6]=-2*t*n,r[7]=0,r[8]=-2*e*t,r[9]=-2*n*t,r[10]=1-2*t*t,r[11]=0,r[12]=2*e*l,r[13]=2*n*l,r[14]=2*t*l,r[15]=1,r};module.exports=mirrorByPlane;
444
-
445
- },{}],149:[function(require,module,exports){
446
- 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;
447
-
448
- },{}],150:[function(require,module,exports){
449
- const{EPS:EPS}=require("../constants"),{sin:sin,cos:cos}=require("../utils/trigonometry"),copy=require("./copy"),rotate=(t,o,r,s)=>{let[e,n,c]=s;const i=e*e+n*n+c*c;if(Math.abs(i)<EPS)return copy(t,o);const u=1/Math.sqrt(i);e*=u,n*=u,c*=u;const a=sin(r),p=cos(r),q=1-p,y=o[0],l=o[1],E=o[2],P=o[3],S=o[4],h=o[5],m=o[6],M=o[7],b=o[8],d=o[9],f=o[10],g=o[11],x=e*e*q+p,j=n*e*q+c*a,k=c*e*q-n*a,v=e*n*q-c*a,w=n*n*q+p,z=c*n*q+e*a,A=e*c*q+n*a,B=n*c*q-e*a,C=c*c*q+p;return t[0]=y*x+S*j+b*k,t[1]=l*x+h*j+d*k,t[2]=E*x+m*j+f*k,t[3]=P*x+M*j+g*k,t[4]=y*v+S*w+b*z,t[5]=l*v+h*w+d*z,t[6]=E*v+m*w+f*z,t[7]=P*v+M*w+g*z,t[8]=y*A+S*B+b*C,t[9]=l*A+h*B+d*C,t[10]=E*A+m*B+f*C,t[11]=P*A+M*B+g*C,o!==t&&(t[12]=o[12],t[13]=o[13],t[14]=o[14],t[15]=o[15]),t};module.exports=rotate;
450
-
451
- },{"../constants":94,"../utils/trigonometry":173,"./copy":130}],151:[function(require,module,exports){
452
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),rotateX=(o,t,s)=>{const r=sin(s),e=cos(s),n=t[4],i=t[5],c=t[6],u=t[7],a=t[8],l=t[9],m=t[10],X=t[11];return t!==o&&(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=t[3],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o[4]=n*e+a*r,o[5]=i*e+l*r,o[6]=c*e+m*r,o[7]=u*e+X*r,o[8]=a*e-n*r,o[9]=l*e-i*r,o[10]=m*e-c*r,o[11]=X*e-u*r,o};module.exports=rotateX;
453
-
454
- },{"../utils/trigonometry":173}],152:[function(require,module,exports){
455
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),rotateY=(o,t,s)=>{const r=sin(s),e=cos(s),n=t[0],i=t[1],c=t[2],u=t[3],a=t[8],l=t[9],m=t[10],Y=t[11];return t!==o&&(o[4]=t[4],o[5]=t[5],o[6]=t[6],o[7]=t[7],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o[0]=n*e-a*r,o[1]=i*e-l*r,o[2]=c*e-m*r,o[3]=u*e-Y*r,o[8]=n*r+a*e,o[9]=i*r+l*e,o[10]=c*r+m*e,o[11]=u*r+Y*e,o};module.exports=rotateY;
456
-
457
- },{"../utils/trigonometry":173}],153:[function(require,module,exports){
458
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),rotateZ=(o,t,s)=>{const r=sin(s),e=cos(s),n=t[0],i=t[1],c=t[2],u=t[3],a=t[4],l=t[5],m=t[6],Z=t[7];return t!==o&&(o[8]=t[8],o[9]=t[9],o[10]=t[10],o[11]=t[11],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o[0]=n*e+a*r,o[1]=i*e+l*r,o[2]=c*e+m*r,o[3]=u*e+Z*r,o[4]=a*e-n*r,o[5]=l*e-i*r,o[6]=m*e-c*r,o[7]=Z*e-u*r,o};module.exports=rotateZ;
459
-
460
- },{"../utils/trigonometry":173}],154:[function(require,module,exports){
461
- const scale=(e,s,c)=>{const o=c[0],t=c[1],l=c[2];return e[0]=s[0]*o,e[1]=s[1]*o,e[2]=s[2]*o,e[3]=s[3]*o,e[4]=s[4]*t,e[5]=s[5]*t,e[6]=s[6]*t,e[7]=s[7]*t,e[8]=s[8]*l,e[9]=s[9]*l,e[10]=s[10]*l,e[11]=s[11]*l,e[12]=s[12],e[13]=s[13],e[14]=s[14],e[15]=s[15],e};module.exports=scale;
462
-
463
- },{}],155:[function(require,module,exports){
464
- const subtract=(t,s,c)=>(t[0]=s[0]-c[0],t[1]=s[1]-c[1],t[2]=s[2]-c[2],t[3]=s[3]-c[3],t[4]=s[4]-c[4],t[5]=s[5]-c[5],t[6]=s[6]-c[6],t[7]=s[7]-c[7],t[8]=s[8]-c[8],t[9]=s[9]-c[9],t[10]=s[10]-c[10],t[11]=s[11]-c[11],t[12]=s[12]-c[12],t[13]=s[13]-c[13],t[14]=s[14]-c[14],t[15]=s[15]-c[15],t);module.exports=subtract;
465
-
466
- },{}],156:[function(require,module,exports){
467
- const toString=t=>t.map(t=>t.toFixed(7)).toString();module.exports=toString;
468
-
469
- },{}],157:[function(require,module,exports){
470
- const translate=(t,e,n)=>{const r=n[0],s=n[1],a=n[2];let l,o,c,u,d,m,p,x,b,f,g,h;return e===t?(t[12]=e[0]*r+e[4]*s+e[8]*a+e[12],t[13]=e[1]*r+e[5]*s+e[9]*a+e[13],t[14]=e[2]*r+e[6]*s+e[10]*a+e[14],t[15]=e[3]*r+e[7]*s+e[11]*a+e[15]):(l=e[0],o=e[1],c=e[2],u=e[3],d=e[4],m=e[5],p=e[6],x=e[7],b=e[8],f=e[9],g=e[10],h=e[11],t[0]=l,t[1]=o,t[2]=c,t[3]=u,t[4]=d,t[5]=m,t[6]=p,t[7]=x,t[8]=b,t[9]=f,t[10]=g,t[11]=h,t[12]=l*r+d*s+b*a+e[12],t[13]=o*r+m*s+f*a+e[13],t[14]=c*r+p*s+g*a+e[14],t[15]=u*r+x*s+h*a+e[15]),t};module.exports=translate;
471
-
472
- },{}],158:[function(require,module,exports){
473
- const flip=(l,o)=>(l[0]=-o[0],l[1]=-o[1],l[2]=-o[2],l[3]=-o[3],l);module.exports=flip;
474
-
475
- },{}],159:[function(require,module,exports){
476
- const vec3=require("../vec3"),fromNormalAndPoint=require("./fromNormalAndPoint"),fromNoisyPoints=(e,...c)=>{e[0]=0,e[1]=0,e[2]=0,e[3]=0;const o=c.length;c.forEach(c=>{vec3.add(e,e,c)}),vec3.scale(e,e,1/o);let t=0,r=0,a=0,v=0,d=0,n=0;const s=vec3.create();c.forEach(c=>{vec3.subtract(s,c,e),t+=s[0]*s[0],r+=s[0]*s[1],a+=s[0]*s[2],v+=s[1]*s[1],d+=s[1]*s[2],n+=s[2]*s[2]}),t/=o,r/=o,a/=o,v/=o,d/=o,n/=o,s[0]=0,s[1]=0,s[2]=0;const l=vec3.create();let i=v*n-d*d;l[0]=i,l[1]=a*d-r*n,l[2]=r*d-a*v;let m=i*i;return vec3.add(s,s,vec3.scale(l,l,m)),i=t*n-a*a,l[0]=a*d-r*n,l[1]=i,l[2]=r*a-d*t,m=i*i,vec3.dot(s,l)<0&&(m=-m),vec3.add(s,s,vec3.scale(l,l,m)),i=t*v-r*r,l[0]=r*d-a*v,l[1]=r*a-d*t,l[2]=i,m=i*i,vec3.dot(s,l)<0&&(m=-m),vec3.add(s,s,vec3.scale(l,l,m)),fromNormalAndPoint(e,s,e)};module.exports=fromNoisyPoints;
477
-
478
- },{"../vec3":222,"./fromNormalAndPoint":160}],160:[function(require,module,exports){
479
- 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;
480
-
481
- },{"../vec3":222}],161:[function(require,module,exports){
482
- 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;
483
-
484
- },{"../vec3":222}],162:[function(require,module,exports){
485
- 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;
486
-
487
- },{"../constants":94,"../vec3":222}],163:[function(require,module,exports){
488
- module.exports={clone:require("../vec4/clone"),copy:require("../vec4/copy"),create:require("../vec4/create"),equals:require("../vec4/equals"),flip:require("./flip"),fromNormalAndPoint:require("./fromNormalAndPoint"),fromValues:require("../vec4/fromValues"),fromNoisyPoints:require("./fromNoisyPoints"),fromPoints:require("./fromPoints"),fromPointsRandom:require("./fromPointsRandom"),projectionOfPoint:require("./projectionOfPoint"),signedDistanceToPoint:require("./signedDistanceToPoint"),toString:require("../vec4/toString"),transform:require("./transform")};
489
-
490
- },{"../vec4/clone":241,"../vec4/copy":242,"../vec4/create":243,"../vec4/equals":245,"../vec4/fromValues":247,"../vec4/toString":249,"./flip":158,"./fromNoisyPoints":159,"./fromNormalAndPoint":160,"./fromPoints":161,"./fromPointsRandom":162,"./projectionOfPoint":164,"./signedDistanceToPoint":165,"./transform":166}],164:[function(require,module,exports){
491
- const vec3=require("../vec3"),projectionOfPoint=(e,o)=>{const r=o[0]*e[0]+o[1]*e[1]+o[2]*e[2]-e[3],t=o[0]-r*e[0],c=o[1]-r*e[1],n=o[2]-r*e[2];return vec3.fromValues(t,c,n)};module.exports=projectionOfPoint;
492
-
493
- },{"../vec3":222}],165:[function(require,module,exports){
494
- const vec3=require("../vec3"),signedDistanceToPoint=(e,o)=>vec3.dot(e,o)-e[3];module.exports=signedDistanceToPoint;
495
-
496
- },{"../vec3":222}],166:[function(require,module,exports){
497
- const mat4=require("../mat4"),vec3=require("../vec3"),fromPoints=require("./fromPoints"),flip=require("./flip"),transform=(e,r,c)=>{const t=mat4.isMirroring(c),o=vec3.orthogonal(vec3.create(),r),a=vec3.cross(o,r,o),v=vec3.cross(vec3.create(),r,a);let s=vec3.fromScalar(vec3.create(),r[3]);vec3.multiply(s,s,r);let i=vec3.add(vec3.create(),s,a),m=vec3.add(vec3.create(),s,v);return s=vec3.transform(s,s,c),i=vec3.transform(i,i,c),m=vec3.transform(m,m,c),fromPoints(e,s,i,m),t&&flip(e,e),e};module.exports=transform;
498
-
499
- },{"../mat4":143,"../vec3":222,"./flip":158,"./fromPoints":161}],167:[function(require,module,exports){
500
- const{NEPS:NEPS}=require("../constants"),aboutEqualNormals=(a,s)=>Math.abs(a[0]-s[0])<=NEPS&&Math.abs(a[1]-s[1])<=NEPS&&Math.abs(a[2]-s[2])<=NEPS;module.exports=aboutEqualNormals;
501
-
502
- },{"../constants":94}],168:[function(require,module,exports){
503
- const area=e=>{let t=0;for(let r=0;r<e.length;r++){const l=(r+1)%e.length;t+=e[r][0]*e[l][1],t-=e[l][0]*e[r][1]}return t/2};module.exports=area;
504
-
505
- },{}],169:[function(require,module,exports){
506
- module.exports={aboutEqualNormals:require("./aboutEqualNormals"),area:require("./area"),cos:require("./trigonometry").cos,interpolateBetween2DPointsForY:require("./interpolateBetween2DPointsForY"),intersect:require("./intersect"),sin:require("./trigonometry").sin,solve2Linear:require("./solve2Linear")};
507
-
508
- },{"./aboutEqualNormals":167,"./area":168,"./interpolateBetween2DPointsForY":170,"./intersect":171,"./solve2Linear":172,"./trigonometry":173}],170:[function(require,module,exports){
509
- const interpolateBetween2DPointsForY=(e,t,o)=>{let n,r=o-e[1],i=t[1]-e[1];return i<0&&(r=-r,i=-i),n=r<=0?0:r>=i?1:i<1e-10?.5:r/i,e[0]+n*(t[0]-e[0])};module.exports=interpolateBetween2DPointsForY;
510
-
511
- },{}],171:[function(require,module,exports){
512
- const intersect=(t,e,r,n)=>{if(t[0]===e[0]&&t[1]===e[1]||r[0]===n[0]&&r[1]===n[1])return;const s=(n[1]-r[1])*(e[0]-t[0])-(n[0]-r[0])*(e[1]-t[1]);if(Math.abs(s)<Number.MIN_VALUE)return;const o=((n[0]-r[0])*(t[1]-r[1])-(n[1]-r[1])*(t[0]-r[0]))/s,c=((e[0]-t[0])*(t[1]-r[1])-(e[1]-t[1])*(t[0]-r[0]))/s;return o<0||o>1||c<0||c>1?void 0:[t[0]+o*(e[0]-t[0]),t[1]+o*(e[1]-t[1])]};module.exports=intersect;
513
-
514
- },{}],172:[function(require,module,exports){
515
- const solve2Linear=(e,o,n,r,s,t)=>{const l=1/(e*r-o*n);let a=s*r-o*t,c=-s*n+e*t;return[a*=l,c*=l]};module.exports=solve2Linear;
516
-
517
- },{}],173:[function(require,module,exports){
518
- const{NEPS:NEPS}=require("../constants"),rezero=s=>Math.abs(s)<NEPS?0:s,sin=s=>rezero(Math.sin(s)),cos=s=>rezero(Math.cos(s));module.exports={sin:sin,cos:cos};
519
-
520
- },{"../constants":94}],174:[function(require,module,exports){
521
- const abs=(a,s)=>(a[0]=Math.abs(s[0]),a[1]=Math.abs(s[1]),a);module.exports=abs;
522
-
523
- },{}],175:[function(require,module,exports){
524
- const add=(d,o,a)=>(d[0]=o[0]+a[0],d[1]=o[1]+a[1],d);module.exports=add;
525
-
526
- },{}],176:[function(require,module,exports){
527
- module.exports=require("./angleRadians");
528
-
529
- },{"./angleRadians":178}],177:[function(require,module,exports){
530
- const angleRadians=require("./angleRadians"),angleDegrees=e=>57.29577951308232*angleRadians(e);module.exports=angleDegrees;
531
-
532
- },{"./angleRadians":178}],178:[function(require,module,exports){
533
- const angleRadians=a=>Math.atan2(a[1],a[0]);module.exports=angleRadians;
534
-
535
- },{}],179:[function(require,module,exports){
536
- const create=require("./create"),clone=e=>{const r=create();return r[0]=e[0],r[1]=e[1],r};module.exports=clone;
537
-
538
- },{"./create":181}],180:[function(require,module,exports){
539
- const copy=(o,c)=>(o[0]=c[0],o[1]=c[1],o);module.exports=copy;
540
-
541
- },{}],181:[function(require,module,exports){
542
- const create=()=>[0,0];module.exports=create;
543
-
544
- },{}],182:[function(require,module,exports){
545
- const cross=(s,o,c)=>(s[0]=0,s[1]=0,s[2]=o[0]*c[1]-o[1]*c[0],s);module.exports=cross;
546
-
547
- },{}],183:[function(require,module,exports){
548
- const distance=(t,s)=>{const e=s[0]-t[0],n=s[1]-t[1];return Math.sqrt(e*e+n*n)};module.exports=distance;
549
-
550
- },{}],184:[function(require,module,exports){
551
- const divide=(d,e,i)=>(d[0]=e[0]/i[0],d[1]=e[1]/i[1],d);module.exports=divide;
552
-
553
- },{}],185:[function(require,module,exports){
554
- const dot=(o,t)=>o[0]*t[0]+o[1]*t[1];module.exports=dot;
555
-
556
- },{}],186:[function(require,module,exports){
557
- const equals=(e,s)=>e[0]===s[0]&&e[1]===s[1];module.exports=equals;
558
-
559
- },{}],187:[function(require,module,exports){
560
- const fromAngleRadians=require("./fromAngleRadians"),fromAngleDegrees=(e,r)=>fromAngleRadians(e,.017453292519943295*r);module.exports=fromAngleDegrees;
561
-
562
- },{"./fromAngleRadians":188}],188:[function(require,module,exports){
563
- const{sin:sin,cos:cos}=require("../utils/trigonometry"),fromAngleRadians=(s,o)=>(s[0]=cos(o),s[1]=sin(o),s);module.exports=fromAngleRadians;
564
-
565
- },{"../utils/trigonometry":173}],189:[function(require,module,exports){
566
- const fromScalar=(o,r)=>(o[0]=r,o[1]=r,o);module.exports=fromScalar;
567
-
568
- },{}],190:[function(require,module,exports){
569
- const create=require("./create"),fromValues=(e,r)=>{const t=create();return t[0]=e,t[1]=r,t};module.exports=fromValues;
570
-
571
- },{"./create":181}],191:[function(require,module,exports){
572
- module.exports={abs:require("./abs"),add:require("./add"),angle:require("./angle"),angleDegrees:require("./angleDegrees"),angleRadians:require("./angleRadians"),clone:require("./clone"),copy:require("./copy"),create:require("./create"),cross:require("./cross"),distance:require("./distance"),divide:require("./divide"),dot:require("./dot"),equals:require("./equals"),fromAngleDegrees:require("./fromAngleDegrees"),fromAngleRadians:require("./fromAngleRadians"),fromScalar:require("./fromScalar"),fromValues:require("./fromValues"),length:require("./length"),lerp:require("./lerp"),max:require("./max"),min:require("./min"),multiply:require("./multiply"),negate:require("./negate"),normal:require("./normal"),normalize:require("./normalize"),rotate:require("./rotate"),scale:require("./scale"),snap:require("./snap"),squaredDistance:require("./squaredDistance"),squaredLength:require("./squaredLength"),subtract:require("./subtract"),toString:require("./toString"),transform:require("./transform")};
573
-
574
- },{"./abs":174,"./add":175,"./angle":176,"./angleDegrees":177,"./angleRadians":178,"./clone":179,"./copy":180,"./create":181,"./cross":182,"./distance":183,"./divide":184,"./dot":185,"./equals":186,"./fromAngleDegrees":187,"./fromAngleRadians":188,"./fromScalar":189,"./fromValues":190,"./length":192,"./lerp":193,"./max":194,"./min":195,"./multiply":196,"./negate":197,"./normal":198,"./normalize":199,"./rotate":200,"./scale":201,"./snap":202,"./squaredDistance":203,"./squaredLength":204,"./subtract":205,"./toString":206,"./transform":207}],192:[function(require,module,exports){
575
- const length=t=>Math.sqrt(t[0]*t[0]+t[1]*t[1]);module.exports=length;
576
-
577
- },{}],193:[function(require,module,exports){
578
- const lerp=(e,r,o,t)=>{const l=r[0],n=r[1];return e[0]=l+t*(o[0]-l),e[1]=n+t*(o[1]-n),e};module.exports=lerp;
579
-
580
- },{}],194:[function(require,module,exports){
581
- const max=(a,m,x)=>(a[0]=Math.max(m[0],x[0]),a[1]=Math.max(m[1],x[1]),a);module.exports=max;
582
-
583
- },{}],195:[function(require,module,exports){
584
- const min=(m,n,i)=>(m[0]=Math.min(n[0],i[0]),m[1]=Math.min(n[1],i[1]),m);module.exports=min;
585
-
586
- },{}],196:[function(require,module,exports){
587
- const multiply=(l,t,m)=>(l[0]=t[0]*m[0],l[1]=t[1]*m[1],l);module.exports=multiply;
588
-
589
- },{}],197:[function(require,module,exports){
590
- const negate=(e,t)=>(e[0]=-t[0],e[1]=-t[1],e);module.exports=negate;
591
-
592
- },{}],198:[function(require,module,exports){
593
- const{TAU:TAU}=require("../constants"),create=require("./create"),rotate=require("./rotate"),normal=(e,r)=>rotate(e,r,create(),TAU/4);module.exports=normal;
594
-
595
- },{"../constants":94,"./create":181,"./rotate":200}],199:[function(require,module,exports){
596
- const normalize=(t,e)=>{const o=e[0],r=e[1];let n=o*o+r*r;return n>0&&(n=1/Math.sqrt(n)),t[0]=o*n,t[1]=r*n,t};module.exports=normalize;
597
-
598
- },{}],200:[function(require,module,exports){
599
- const rotate=(t,o,e,r)=>{const s=o[0]-e[0],a=o[1]-e[1],n=Math.cos(r),c=Math.sin(r);return t[0]=s*n-a*c+e[0],t[1]=s*c+a*n+e[1],t};module.exports=rotate;
600
-
601
- },{}],201:[function(require,module,exports){
602
- const scale=(e,s,c)=>(e[0]=s[0]*c,e[1]=s[1]*c,e);module.exports=scale;
603
-
604
- },{}],202:[function(require,module,exports){
605
- const snap=(n,o,a)=>(n[0]=Math.round(o[0]/a)*a+0,n[1]=Math.round(o[1]/a)*a+0,n);module.exports=snap;
606
-
607
- },{}],203:[function(require,module,exports){
608
- const squaredDistance=(e,s)=>{const t=s[0]-e[0],n=s[1]-e[1];return t*t+n*n};module.exports=squaredDistance;
609
-
610
- },{}],204:[function(require,module,exports){
611
- const squaredLength=e=>{const t=e[0],n=e[1];return t*t+n*n};module.exports=squaredLength;
612
-
613
- },{}],205:[function(require,module,exports){
614
- const subtract=(t,s,c)=>(t[0]=s[0]-c[0],t[1]=s[1]-c[1],t);module.exports=subtract;
615
-
616
- },{}],206:[function(require,module,exports){
617
- const toString=t=>`[${t[0].toFixed(7)}, ${t[1].toFixed(7)}]`;module.exports=toString;
618
-
619
- },{}],207:[function(require,module,exports){
620
- const transform=(r,o,t)=>{const n=o[0],s=o[1];return r[0]=t[0]*n+t[4]*s+t[12],r[1]=t[1]*n+t[5]*s+t[13],r};module.exports=transform;
621
-
622
- },{}],208:[function(require,module,exports){
623
- const abs=(a,s)=>(a[0]=Math.abs(s[0]),a[1]=Math.abs(s[1]),a[2]=Math.abs(s[2]),a);module.exports=abs;
624
-
625
- },{}],209:[function(require,module,exports){
626
- 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;
627
-
628
- },{}],210:[function(require,module,exports){
629
- 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;
630
-
631
- },{"./dot":217}],211:[function(require,module,exports){
632
- 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;
633
-
634
- },{"./create":213}],212:[function(require,module,exports){
635
- const copy=(o,c)=>(o[0]=c[0],o[1]=c[1],o[2]=c[2],o);module.exports=copy;
636
-
637
- },{}],213:[function(require,module,exports){
638
- const create=()=>[0,0,0];module.exports=create;
639
-
640
- },{}],214:[function(require,module,exports){
641
- const cross=(s,o,r)=>{const c=o[0],t=o[1],e=o[2],n=r[0],u=r[1],d=r[2];return s[0]=t*d-e*u,s[1]=e*n-c*d,s[2]=c*u-t*n,s};module.exports=cross;
642
-
643
- },{}],215:[function(require,module,exports){
644
- const distance=(t,s)=>{const e=s[0]-t[0],n=s[1]-t[1],c=s[2]-t[2];return Math.sqrt(e*e+n*n+c*c)};module.exports=distance;
645
-
646
- },{}],216:[function(require,module,exports){
647
- const divide=(d,e,i)=>(d[0]=e[0]/i[0],d[1]=e[1]/i[1],d[2]=e[2]/i[2],d);module.exports=divide;
648
-
649
- },{}],217:[function(require,module,exports){
650
- const dot=(o,t)=>o[0]*t[0]+o[1]*t[1]+o[2]*t[2];module.exports=dot;
651
-
652
- },{}],218:[function(require,module,exports){
653
- const equals=(e,s)=>e[0]===s[0]&&e[1]===s[1]&&e[2]===s[2];module.exports=equals;
654
-
655
- },{}],219:[function(require,module,exports){
656
- const fromScalar=(o,r)=>(o[0]=r,o[1]=r,o[2]=r,o);module.exports=fromScalar;
657
-
658
- },{}],220:[function(require,module,exports){
659
- const create=require("./create"),fromValues=(e,r,t)=>{const o=create();return o[0]=e,o[1]=r,o[2]=t,o};module.exports=fromValues;
660
-
661
- },{"./create":213}],221:[function(require,module,exports){
662
- const fromVector2=(o,r,e=0)=>(o[0]=r[0],o[1]=r[1],o[2]=e,o);module.exports=fromVector2;
663
-
664
- },{}],222:[function(require,module,exports){
665
- module.exports={abs:require("./abs"),add:require("./add"),angle:require("./angle"),clone:require("./clone"),copy:require("./copy"),create:require("./create"),cross:require("./cross"),distance:require("./distance"),divide:require("./divide"),dot:require("./dot"),equals:require("./equals"),fromScalar:require("./fromScalar"),fromValues:require("./fromValues"),fromVec2:require("./fromVec2"),length:require("./length"),lerp:require("./lerp"),max:require("./max"),min:require("./min"),multiply:require("./multiply"),negate:require("./negate"),normalize:require("./normalize"),orthogonal:require("./orthogonal"),rotateX:require("./rotateX"),rotateY:require("./rotateY"),rotateZ:require("./rotateZ"),scale:require("./scale"),snap:require("./snap"),squaredDistance:require("./squaredDistance"),squaredLength:require("./squaredLength"),subtract:require("./subtract"),toString:require("./toString"),transform:require("./transform")};
666
-
667
- },{"./abs":208,"./add":209,"./angle":210,"./clone":211,"./copy":212,"./create":213,"./cross":214,"./distance":215,"./divide":216,"./dot":217,"./equals":218,"./fromScalar":219,"./fromValues":220,"./fromVec2":221,"./length":223,"./lerp":224,"./max":225,"./min":226,"./multiply":227,"./negate":228,"./normalize":229,"./orthogonal":230,"./rotateX":231,"./rotateY":232,"./rotateZ":233,"./scale":234,"./snap":235,"./squaredDistance":236,"./squaredLength":237,"./subtract":238,"./toString":239,"./transform":240}],223:[function(require,module,exports){
668
- const length=t=>{const e=t[0],n=t[1],o=t[2];return Math.sqrt(e*e+n*n+o*o)};module.exports=length;
669
-
670
- },{}],224:[function(require,module,exports){
671
- const lerp=(e,l,o,p)=>(e[0]=l[0]+p*(o[0]-l[0]),e[1]=l[1]+p*(o[1]-l[1]),e[2]=l[2]+p*(o[2]-l[2]),e);module.exports=lerp;
672
-
673
- },{}],225:[function(require,module,exports){
674
- const max=(a,m,x)=>(a[0]=Math.max(m[0],x[0]),a[1]=Math.max(m[1],x[1]),a[2]=Math.max(m[2],x[2]),a);module.exports=max;
675
-
676
- },{}],226:[function(require,module,exports){
677
- const min=(m,n,i)=>(m[0]=Math.min(n[0],i[0]),m[1]=Math.min(n[1],i[1]),m[2]=Math.min(n[2],i[2]),m);module.exports=min;
678
-
679
- },{}],227:[function(require,module,exports){
680
- const multiply=(l,t,m)=>(l[0]=t[0]*m[0],l[1]=t[1]*m[1],l[2]=t[2]*m[2],l);module.exports=multiply;
681
-
682
- },{}],228:[function(require,module,exports){
683
- const negate=(e,t)=>(e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e);module.exports=negate;
684
-
685
- },{}],229:[function(require,module,exports){
686
- const normalize=(t,e)=>{const o=e[0],r=e[1],n=e[2];let l=o*o+r*r+n*n;return l>0&&(l=1/Math.sqrt(l)),t[0]=o*l,t[1]=r*l,t[2]=n*l,t};module.exports=normalize;
687
-
688
- },{}],230:[function(require,module,exports){
689
- const abs=require("./abs"),create=require("./create"),cross=require("./cross"),orthogonal=(r,e)=>{const o=abs(create(),e),s=0+(o[0]<o[1]&&o[0]<o[2]),t=0+(o[1]<=o[0]&&o[1]<o[2]),a=0+(o[2]<=o[0]&&o[2]<=o[1]);return cross(r,e,[s,t,a])};module.exports=orthogonal;
690
-
691
- },{"./abs":208,"./create":213,"./cross":214}],231:[function(require,module,exports){
692
- const rotateX=(t,o,s,a)=>{const e=[],n=[];return e[0]=o[0]-s[0],e[1]=o[1]-s[1],e[2]=o[2]-s[2],n[0]=e[0],n[1]=e[1]*Math.cos(a)-e[2]*Math.sin(a),n[2]=e[1]*Math.sin(a)+e[2]*Math.cos(a),t[0]=n[0]+s[0],t[1]=n[1]+s[1],t[2]=n[2]+s[2],t};module.exports=rotateX;
693
-
694
- },{}],232:[function(require,module,exports){
695
- const rotateY=(t,o,s,a)=>{const e=[],n=[];return e[0]=o[0]-s[0],e[1]=o[1]-s[1],e[2]=o[2]-s[2],n[0]=e[2]*Math.sin(a)+e[0]*Math.cos(a),n[1]=e[1],n[2]=e[2]*Math.cos(a)-e[0]*Math.sin(a),t[0]=n[0]+s[0],t[1]=n[1]+s[1],t[2]=n[2]+s[2],t};module.exports=rotateY;
696
-
697
- },{}],233:[function(require,module,exports){
698
- const rotateZ=(t,o,s,a)=>{const e=[],n=[];return e[0]=o[0]-s[0],e[1]=o[1]-s[1],n[0]=e[0]*Math.cos(a)-e[1]*Math.sin(a),n[1]=e[0]*Math.sin(a)+e[1]*Math.cos(a),t[0]=n[0]+s[0],t[1]=n[1]+s[1],t[2]=o[2],t};module.exports=rotateZ;
699
-
700
- },{}],234:[function(require,module,exports){
701
- const scale=(e,s,c)=>(e[0]=s[0]*c,e[1]=s[1]*c,e[2]=s[2]*c,e);module.exports=scale;
702
-
703
- },{}],235:[function(require,module,exports){
704
- const snap=(n,o,a)=>(n[0]=Math.round(o[0]/a)*a+0,n[1]=Math.round(o[1]/a)*a+0,n[2]=Math.round(o[2]/a)*a+0,n);module.exports=snap;
705
-
706
- },{}],236:[function(require,module,exports){
707
- const squaredDistance=(e,s)=>{const t=s[0]-e[0],n=s[1]-e[1],r=s[2]-e[2];return t*t+n*n+r*r};module.exports=squaredDistance;
708
-
709
- },{}],237:[function(require,module,exports){
710
- const squaredLength=e=>{const t=e[0],n=e[1],r=e[2];return t*t+n*n+r*r};module.exports=squaredLength;
711
-
712
- },{}],238:[function(require,module,exports){
713
- const subtract=(t,s,c)=>(t[0]=s[0]-c[0],t[1]=s[1]-c[1],t[2]=s[2]-c[2],t);module.exports=subtract;
714
-
715
- },{}],239:[function(require,module,exports){
716
- const toString=t=>`[${t[0].toFixed(7)}, ${t[1].toFixed(7)}, ${t[2].toFixed(7)}]`;module.exports=toString;
717
-
718
- },{}],240:[function(require,module,exports){
719
- const transform=(r,t,o)=>{const n=t[0],s=t[1],e=t[2];let m=o[3]*n+o[7]*s+o[11]*e+o[15];return m=m||1,r[0]=(o[0]*n+o[4]*s+o[8]*e+o[12])/m,r[1]=(o[1]*n+o[5]*s+o[9]*e+o[13])/m,r[2]=(o[2]*n+o[6]*s+o[10]*e+o[14])/m,r};module.exports=transform;
720
-
721
- },{}],241:[function(require,module,exports){
722
- const create=require("./create"),clone=e=>{const r=create();return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r};module.exports=clone;
723
-
724
- },{"./create":243}],242:[function(require,module,exports){
725
- const copy=(o,c)=>(o[0]=c[0],o[1]=c[1],o[2]=c[2],o[3]=c[3],o);module.exports=copy;
726
-
727
- },{}],243:[function(require,module,exports){
728
- const create=()=>[0,0,0,0];module.exports=create;
729
-
730
- },{}],244:[function(require,module,exports){
731
- const dot=(o,t)=>o[0]*t[0]+o[1]*t[1]+o[2]*t[2]+o[3]*t[3];module.exports=dot;
732
-
733
- },{}],245:[function(require,module,exports){
734
- const equals=(e,s)=>e[0]===s[0]&&e[1]===s[1]&&e[2]===s[2]&&e[3]===s[3];module.exports=equals;
735
-
736
- },{}],246:[function(require,module,exports){
737
- const fromScalar=(o,r)=>(o[0]=r,o[1]=r,o[2]=r,o[3]=r,o);module.exports=fromScalar;
738
-
739
- },{}],247:[function(require,module,exports){
740
- const create=require("./create"),fromValues=(e,r,t,o)=>{const a=create();return a[0]=e,a[1]=r,a[2]=t,a[3]=o,a};module.exports=fromValues;
741
-
742
- },{"./create":243}],248:[function(require,module,exports){
743
- module.exports={clone:require("./clone"),copy:require("./copy"),create:require("./create"),dot:require("./dot"),equals:require("./equals"),fromScalar:require("./fromScalar"),fromValues:require("./fromValues"),toString:require("./toString"),transform:require("./transform")};
744
-
745
- },{"./clone":241,"./copy":242,"./create":243,"./dot":244,"./equals":245,"./fromScalar":246,"./fromValues":247,"./toString":249,"./transform":250}],249:[function(require,module,exports){
746
- const toString=t=>`(${t[0].toFixed(9)}, ${t[1].toFixed(9)}, ${t[2].toFixed(9)}, ${t[3].toFixed(9)})`;module.exports=toString;
747
-
748
- },{}],250:[function(require,module,exports){
749
- const transform=(r,o,t)=>{const[n,s,e,m]=o;return r[0]=t[0]*n+t[4]*s+t[8]*e+t[12]*m,r[1]=t[1]*n+t[5]*s+t[9]*e+t[13]*m,r[2]=t[2]*n+t[6]*s+t[10]*e+t[14]*m,r[3]=t[3]*n+t[7]*s+t[11]*e+t[15]*m,r};module.exports=transform;
750
-
751
- },{}],251:[function(require,module,exports){
752
- const{EPS:EPS}=require("../maths/constants"),calculateEpsilonFromBounds=(o,t)=>{let e=0;for(let l=0;l<t;l++)e+=o[1][l]-o[0][l];return EPS*e/t};module.exports=calculateEpsilonFromBounds;
753
-
754
- },{"../maths/constants":94}],252:[function(require,module,exports){
755
- module.exports={measureAggregateArea:require("./measureAggregateArea"),measureAggregateBoundingBox:require("./measureAggregateBoundingBox"),measureAggregateEpsilon:require("./measureAggregateEpsilon"),measureAggregateVolume:require("./measureAggregateVolume"),measureArea:require("./measureArea"),measureBoundingBox:require("./measureBoundingBox"),measureBoundingSphere:require("./measureBoundingSphere"),measureCenter:require("./measureCenter"),measureCenterOfMass:require("./measureCenterOfMass"),measureDimensions:require("./measureDimensions"),measureEpsilon:require("./measureEpsilon"),measureVolume:require("./measureVolume")};
756
-
757
- },{"./measureAggregateArea":253,"./measureAggregateBoundingBox":254,"./measureAggregateEpsilon":255,"./measureAggregateVolume":256,"./measureArea":257,"./measureBoundingBox":258,"./measureBoundingSphere":259,"./measureCenter":260,"./measureCenterOfMass":261,"./measureDimensions":262,"./measureEpsilon":263,"./measureVolume":264}],253:[function(require,module,exports){
758
- 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;
759
-
760
- },{"../utils/flatten":398,"./measureArea":257}],254:[function(require,module,exports){
761
- 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;
762
-
763
- },{"../maths/vec3/max":225,"../maths/vec3/min":226,"../utils/flatten":398,"./measureBoundingBox":258}],255:[function(require,module,exports){
764
- 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;
765
-
766
- },{"../geometries":50,"../utils/flatten":398,"./calculateEpsilonFromBounds":251,"./measureAggregateBoundingBox":254}],256:[function(require,module,exports){
767
- 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;
768
-
769
- },{"../utils/flatten":398,"./measureVolume":264}],257:[function(require,module,exports){
770
- 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;
771
-
772
- },{"../geometries/geom2":25,"../geometries/geom3":41,"../geometries/path2":62,"../geometries/poly3":79,"../utils/flatten":398}],258:[function(require,module,exports){
773
- 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;
774
-
775
- },{"../geometries/geom2":25,"../geometries/geom3":41,"../geometries/path2":62,"../geometries/poly3":79,"../maths/vec2":191,"../maths/vec3":222,"../utils/flatten":398}],259:[function(require,module,exports){
776
- 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;
777
-
778
- },{"../geometries/geom2":25,"../geometries/geom3":41,"../geometries/path2":62,"../geometries/poly3":79,"../maths/vec2":191,"../maths/vec3":222,"../utils/flatten":398}],260:[function(require,module,exports){
779
- 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;
780
-
781
- },{"../utils/flatten":398,"./measureBoundingBox":258}],261:[function(require,module,exports){
782
- 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;
783
-
784
- },{"../geometries/geom2":25,"../geometries/geom3":41,"../maths/vec3":222,"../utils/flatten":398}],262:[function(require,module,exports){
785
- 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;
786
-
787
- },{"../utils/flatten":398,"./measureBoundingBox":258}],263:[function(require,module,exports){
788
- 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;
789
-
790
- },{"../geometries":50,"../utils/flatten":398,"./calculateEpsilonFromBounds":251,"./measureBoundingBox":258}],264:[function(require,module,exports){
791
- 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;
792
-
793
- },{"../geometries/geom2":25,"../geometries/geom3":41,"../geometries/path2":62,"../geometries/poly3":79,"../utils/flatten":398}],265:[function(require,module,exports){
794
- 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;
795
-
796
- },{"../../geometries/geom2":25,"../../maths/vec2":191}],266:[function(require,module,exports){
797
- module.exports={intersect:require("./intersect"),scission:require("./scission"),subtract:require("./subtract"),union:require("./union")};
798
-
799
- },{"./intersect":267,"./scission":272,"./subtract":274,"./union":285}],267:[function(require,module,exports){
800
- 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;
801
-
802
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../utils/areAllShapesTheSameType":396,"../../utils/flatten":398,"./intersectGeom2":268,"./intersectGeom3":269}],268:[function(require,module,exports){
803
- 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;
804
-
805
- },{"../../geometries/geom3":41,"../../measurements/measureEpsilon":263,"../../utils/flatten":398,"./fromFakePolygons":265,"./intersectGeom3":269,"./to3DWalls":278}],269:[function(require,module,exports){
806
- const flatten=require("../../utils/flatten"),retessellate=require("../modifiers/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;
807
-
808
- },{"../../utils/flatten":398,"../modifiers/retessellate":356,"./intersectGeom3Sub":270}],270:[function(require,module,exports){
809
- 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;
810
-
811
- },{"../../geometries/geom3":41,"./mayOverlap":271,"./trees":282}],271:[function(require,module,exports){
812
- const{EPS:EPS}=require("../../maths/constants"),measureBoundingBox=require("../../measurements/measureBoundingBox"),mayOverlap=(e,n)=>{if(0===e.polygons.length||0===n.polygons.length)return!1;const o=measureBoundingBox(e),r=o[0],s=o[1],u=measureBoundingBox(n),a=u[0],t=u[1];return!(a[0]-s[0]>EPS)&&(!(r[0]-t[0]>EPS)&&(!(a[1]-s[1]>EPS)&&(!(r[1]-t[1]>EPS)&&(!(a[2]-s[2]>EPS)&&!(r[2]-t[2]>EPS)))))};module.exports=mayOverlap;
813
-
814
- },{"../../maths/constants":94,"../../measurements/measureBoundingBox":258}],272:[function(require,module,exports){
815
- 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;
816
-
817
- },{"../../geometries/geom3":41,"../../utils/flatten":398,"./scissionGeom3":273}],273:[function(require,module,exports){
818
- 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;
819
-
820
- },{"../../geometries/geom3":41,"../../maths/vec3":222,"../../measurements/measureEpsilon":263}],274:[function(require,module,exports){
821
- 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;
822
-
823
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../utils/areAllShapesTheSameType":396,"../../utils/flatten":398,"./subtractGeom2":275,"./subtractGeom3":276}],275:[function(require,module,exports){
824
- 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;
825
-
826
- },{"../../geometries/geom3":41,"../../measurements/measureEpsilon":263,"../../utils/flatten":398,"./fromFakePolygons":265,"./subtractGeom3":276,"./to3DWalls":278}],276:[function(require,module,exports){
827
- const flatten=require("../../utils/flatten"),retessellate=require("../modifiers/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;
828
-
829
- },{"../../utils/flatten":398,"../modifiers/retessellate":356,"./subtractGeom3Sub":277}],277:[function(require,module,exports){
830
- 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;
831
-
832
- },{"../../geometries/geom3":41,"./mayOverlap":271,"./trees":282}],278:[function(require,module,exports){
833
- const vec3=require("../../maths/vec3"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),to3DWall=(e,o,r)=>{const c=[vec3.fromVec2(vec3.create(),r[0],e),vec3.fromVec2(vec3.create(),r[1],e),vec3.fromVec2(vec3.create(),r[1],o),vec3.fromVec2(vec3.create(),r[0],o)];return poly3.create(c)},to3DWalls=(e,o)=>{const r=geom2.toSides(o).map(o=>to3DWall(e.z0,e.z1,o));return geom3.create(r)};module.exports=to3DWalls;
834
-
835
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/poly3":79,"../../maths/vec3":222}],279:[function(require,module,exports){
836
- const plane=require("../../../maths/plane"),poly3=require("../../../geometries/poly3");class Node{constructor(e){this.plane=null,this.front=null,this.back=null,this.polygontreenodes=[],this.parent=e}invert(){const e=[this];let o;for(let n=0;n<e.length;n++){(o=e[n]).plane&&(o.plane=plane.flip(plane.create(),o.plane)),o.front&&e.push(o.front),o.back&&e.push(o.back);const t=o.front;o.front=o.back,o.back=t}}clipPolygons(e,o){let n,t={node:this,polygontreenodes:e};const l=[];do{if(n=t.node,e=t.polygontreenodes,n.plane){const t=n.plane,s=[],p=[],r=o?s:p,d=e.length;for(let o=0;o<d;o++){const n=e[o];n.isRemoved()||n.splitByPlane(t,r,s,p,s)}n.front&&p.length>0&&l.push({node:n.front,polygontreenodes:p});const h=s.length;if(n.back&&h>0)l.push({node:n.back,polygontreenodes:s});else for(let e=0;e<h;e++)s[e].remove()}t=l.pop()}while(void 0!==t)}clipTo(e,o){let n=this;const t=[];do{n.polygontreenodes.length>0&&e.rootnode.clipPolygons(n.polygontreenodes,o),n.front&&t.push(n.front),n.back&&t.push(n.back),n=t.pop()}while(void 0!==n)}addPolygonTreeNodes(e){let o={node:this,polygontreenodes:e};const n=[];do{const e=o.node,t=o.polygontreenodes;if(0===t.length){o=n.pop();continue}if(!e.plane){let o=0;const n=t[o=Math.floor(t.length/2)].getPolygon();e.plane=poly3.plane(n)}const l=[],s=[],p=t.length;for(let o=0;o<p;++o)t[o].splitByPlane(e.plane,e.polygontreenodes,s,l,s);if(l.length>0){e.front||(e.front=new Node(e)),p===l.length&&0===s.length?e.front.polygontreenodes=l:n.push({node:e.front,polygontreenodes:l})}if(s.length>0){e.back||(e.back=new Node(e)),p===s.length&&0===l.length?e.back.polygontreenodes=s:n.push({node:e.back,polygontreenodes:s})}o=n.pop()}while(void 0!==o)}}module.exports=Node;
837
-
838
- },{"../../../geometries/poly3":79,"../../../maths/plane":163}],280:[function(require,module,exports){
839
- const{EPS:EPS}=require("../../../maths/constants"),vec3=require("../../../maths/vec3"),poly3=require("../../../geometries/poly3"),splitPolygonByPlane=require("./splitPolygonByPlane");class PolygonTreeNode{constructor(e,t){this.parent=e,this.children=[],this.polygon=t,this.removed=!1}addPolygons(e){if(!this.isRootNode())throw new Error("Assertion failed");const t=this;e.forEach(e=>{t.addChild(e)})}remove(){if(!this.removed){this.removed=!0,this.polygon=null;const e=this.parent.children,t=e.indexOf(this);if(t<0)throw new Error("Assertion failed");e.splice(t,1),this.parent.recursivelyInvalidatePolygon()}}isRemoved(){return this.removed}isRootNode(){return!this.parent}invert(){if(!this.isRootNode())throw new Error("Assertion failed");this.invertSub()}getPolygon(){if(!this.polygon)throw new Error("Assertion failed");return this.polygon}getPolygons(e){let t=[this];const o=[t];let n,l,s,i;for(n=0;n<o.length;++n)for(l=0,s=(t=o[n]).length;l<s;l++)(i=t[l]).polygon?e.push(i.polygon):i.children.length>0&&o.push(i.children)}splitByPlane(e,t,o,n,l){if(this.children.length){const s=[this.children];let i,r,h,c,d;for(i=0;i<s.length;i++)for(d=s[i],r=0,h=d.length;r<h;r++)(c=d[r]).children.length>0?s.push(c.children):c._splitByPlane(e,t,o,n,l)}else this._splitByPlane(e,t,o,n,l)}_splitByPlane(e,t,o,n,l){const s=this.polygon;if(s){const i=poly3.measureBoundingSphere(s),r=i[3]+EPS,h=i,c=vec3.dot(e,h)-e[3];if(c>r)n.push(this);else if(c<-r)l.push(this);else{const i=splitPolygonByPlane(e,s);switch(i.type){case 0:t.push(this);break;case 1:o.push(this);break;case 2:n.push(this);break;case 3:l.push(this);break;case 4:if(i.front){const e=this.addChild(i.front);n.push(e)}if(i.back){const e=this.addChild(i.back);l.push(e)}}}}}addChild(e){const t=new PolygonTreeNode(this,e);return this.children.push(t),t}invertSub(){let e=[this];const t=[e];let o,n,l,s;for(o=0;o<t.length;o++)for(n=0,l=(e=t[o]).length;n<l;n++)(s=e[n]).polygon&&(s.polygon=poly3.invert(s.polygon)),s.children.length>0&&t.push(s.children)}recursivelyInvalidatePolygon(){this.polygon=null,this.parent&&this.parent.recursivelyInvalidatePolygon()}clear(){let e=[this];const t=[e];for(let o=0;o<t.length;++o){const n=(e=t[o]).length;for(let o=0;o<n;o++){const n=e[o];n.polygon&&(n.polygon=null),n.parent&&(n.parent=null),n.children.length>0&&t.push(n.children),n.children=[]}}}toString(){let e="",t=[this];const o=[t];let n,l,s,i;for(n=0;n<o.length;++n){t=o[n];const r=" ".repeat(n);for(l=0,s=t.length;l<s;l++)e+=`${r}PolygonTreeNode (${(i=t[l]).isRootNode()}): ${i.children.length}`,i.polygon?e+=`\n ${r}polygon: ${i.polygon.vertices}\n`:e+="\n",i.children.length>0&&o.push(i.children)}return e}}module.exports=PolygonTreeNode;
840
-
841
- },{"../../../geometries/poly3":79,"../../../maths/constants":94,"../../../maths/vec3":222,"./splitPolygonByPlane":284}],281:[function(require,module,exports){
842
- const Node=require("./Node"),PolygonTreeNode=require("./PolygonTreeNode");class Tree{constructor(o){this.polygonTree=new PolygonTreeNode,this.rootnode=new Node(null),o&&this.addPolygons(o)}invert(){this.polygonTree.invert(),this.rootnode.invert()}clipTo(o,e=!1){this.rootnode.clipTo(o,e)}allPolygons(){const o=[];return this.polygonTree.getPolygons(o),o}addPolygons(o){const e=new Array(o.length);for(let r=0;r<o.length;r++)e[r]=this.polygonTree.addChild(o[r]);this.rootnode.addPolygonTreeNodes(e)}clear(){this.polygonTree.clear()}toString(){return"Tree: "+this.polygonTree.toString("")}}module.exports=Tree;
843
-
844
- },{"./Node":279,"./PolygonTreeNode":280}],282:[function(require,module,exports){
845
- module.exports={Tree:require("./Tree")};
846
-
847
- },{"./Tree":281}],283:[function(require,module,exports){
848
- const vec3=require("../../../maths/vec3"),splitLineSegmentByPlane=(e,t,c)=>{const n=vec3.subtract(vec3.create(),c,t);let s=(e[3]-vec3.dot(e,t))/vec3.dot(e,n);return Number.isNaN(s)&&(s=0),s>1&&(s=1),s<0&&(s=0),vec3.scale(n,n,s),vec3.add(n,t,n),n};module.exports=splitLineSegmentByPlane;
849
-
850
- },{"../../../maths/vec3":222}],284:[function(require,module,exports){
851
- const{EPS:EPS}=require("../../../maths/constants"),plane=require("../../../maths/plane"),vec3=require("../../../maths/vec3"),poly3=require("../../../geometries/poly3"),splitLineSegmentByPlane=require("./splitLineSegmentByPlane"),splitPolygonByPlane=(e,t)=>{const l={type:null,front:null,back:null},n=t.vertices,s=n.length,o=poly3.plane(t);if(plane.equals(o,e))l.type=0;else{let t=!1,p=!1;const i=[],c=-EPS;for(let l=0;l<s;l++){const s=vec3.dot(e,n[l])-e[3],o=s<c;i.push(o),s>EPS&&(t=!0),s<c&&(p=!0)}if(t||p)if(p)if(t){l.type=4;const t=[],p=[];let c=i[0];for(let l=0;l<s;l++){const o=n[l];let r=l+1;r>=s&&(r=0);const a=i[r];if(c===a)c?p.push(o):t.push(o);else{const l=n[r],s=splitLineSegmentByPlane(e,o,l);c?(p.push(o),p.push(s),t.push(s)):(t.push(o),t.push(s),p.push(s))}c=a}const r=EPS*EPS;if(p.length>=3){let e=p[p.length-1];for(let t=0;t<p.length;t++){const l=p[t];vec3.squaredDistance(l,e)<r&&(p.splice(t,1),t--),e=l}}if(t.length>=3){let e=t[t.length-1];for(let l=0;l<t.length;l++){const n=t[l];vec3.squaredDistance(n,e)<r&&(t.splice(l,1),l--),e=n}}t.length>=3&&(l.front=poly3.fromPointsAndPlane(t,o)),p.length>=3&&(l.back=poly3.fromPointsAndPlane(p,o))}else l.type=3;else l.type=2;else{const t=vec3.dot(e,o);l.type=t>=0?0:1}}return l};module.exports=splitPolygonByPlane;
852
-
853
- },{"../../../geometries/poly3":79,"../../../maths/constants":94,"../../../maths/plane":163,"../../../maths/vec3":222,"./splitLineSegmentByPlane":283}],285:[function(require,module,exports){
854
- 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;
855
-
856
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../utils/areAllShapesTheSameType":396,"../../utils/flatten":398,"./unionGeom2":286,"./unionGeom3":287}],286:[function(require,module,exports){
857
- 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;
858
-
859
- },{"../../geometries/geom3":41,"../../measurements/measureEpsilon":263,"../../utils/flatten":398,"./fromFakePolygons":265,"./to3DWalls":278,"./unionGeom3":287}],287:[function(require,module,exports){
860
- const flatten=require("../../utils/flatten"),retessellate=require("../modifiers/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;
861
-
862
- },{"../../utils/flatten":398,"../modifiers/retessellate":356,"./unionGeom3Sub":288}],288:[function(require,module,exports){
863
- 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;
864
-
865
- },{"../../geometries/geom3":41,"./mayOverlap":271,"./trees":282}],289:[function(require,module,exports){
866
- 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;
867
-
868
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../utils/flatten":398,"./expandGeom2":290,"./expandGeom3":291,"./expandPath2":292}],290:[function(require,module,exports){
869
- 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;
870
-
871
- },{"../../geometries/geom2":25,"./offsetFromPoints":297}],291:[function(require,module,exports){
872
- const geom3=require("../../geometries/geom3"),union=require("../booleans/union"),expandShell=require("./expandShell"),expandGeom3=(e,n)=>{const{delta:o,corners:r,segments:t}=Object.assign({},{delta:1,corners:"round",segments:12},e);if("round"!==r)throw new Error('corners must be "round" for 3D geometries');if(0===geom3.toPolygons(n).length)throw new Error("the given geometry cannot be empty");const s=expandShell(e={delta:o,corners:r,segments:t},n);return union(n,s)};module.exports=expandGeom3;
873
-
874
- },{"../../geometries/geom3":41,"../booleans/union":285,"./expandShell":293}],292:[function(require,module,exports){
875
- const area=require("../../maths/utils/area"),vec2=require("../../maths/vec2"),geom2=require("../../geometries/geom2"),path2=require("../../geometries/path2"),offsetFromPoints=require("./offsetFromPoints"),createGeometryFromClosedOffsets=e=>{let{external:t,internal:r}=e;area(t)<0?t=t.reverse():r=r.reverse();const o=path2.fromPoints({closed:!0},t),s=path2.fromPoints({closed:!0},r),n=geom2.toSides(geom2.fromPoints(path2.toPoints(o))),a=geom2.toSides(geom2.fromPoints(path2.toPoints(s)));return n.push(...a),geom2.create(n)},createGeometryFromExpandedOpenPath=(e,t,r,o)=>{const{points:s,external:n,internal:a}=e,c=Math.floor(t/2),m=[],i=[];if("round"===r&&c>0){const e=Math.PI/c,t=s[s.length-1],r=vec2.angle(vec2.subtract(vec2.create(),n[n.length-1],t)),d=s[0],l=vec2.angle(vec2.subtract(vec2.create(),a[0],d));for(let s=1;s<c;s++){let n=r+e*s,a=vec2.fromAngleRadians(vec2.create(),n);vec2.scale(a,a,o),vec2.add(a,a,t),m.push(a),n=l+e*s,a=vec2.fromAngleRadians(vec2.create(),n),vec2.scale(a,a,o),vec2.add(a,a,d),i.push(a)}}const d=[];return d.push(...n,...m,...a.reverse(),...i),geom2.fromPoints(d)},expandPath2=(e,t)=>{e=Object.assign({},{delta:1,corners:"edge",segments:16},e);const{delta:r,corners:o,segments:s}=e;if(r<=0)throw new Error("the given delta must be positive for paths");if("edge"!==o&&"chamfer"!==o&&"round"!==o)throw new Error('corners must be "edge", "chamfer", or "round"');const n=t.isClosed,a=path2.toPoints(t);if(0===a.length)throw new Error("the given geometry cannot be empty");const c={points:a,external:offsetFromPoints({delta:r,corners:o,segments:s,closed:n},a),internal:offsetFromPoints({delta:-r,corners:o,segments:s,closed:n},a)};return t.isClosed?createGeometryFromClosedOffsets(c):createGeometryFromExpandedOpenPath(c,s,o,r)};module.exports=expandPath2;
876
-
877
- },{"../../geometries/geom2":25,"../../geometries/path2":62,"../../maths/utils/area":168,"../../maths/vec2":191,"./offsetFromPoints":297}],293:[function(require,module,exports){
878
- const{EPS:EPS,TAU:TAU}=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("../modifiers/retessellate"),unionGeom3Sub=require("../booleans/unionGeom3Sub"),extrudePolygon=require("./extrudePolygon"),mapPlaneToVertex=(e,t,o)=>{const n=t.toString();if(e.has(n)){e.get(n)[1].push(o)}else{const s=[t,[o]];e.set(n,s)}},mapPlaneToEdge=(e,t,o)=>{const n=t[0].toString(),s=t[1].toString(),r=n<s?`${n},${s}`:`${s},${n}`;if(e.has(r)){e.get(r)[1].push(o)}else{const n=[t,[o]];e.set(r,n)}},addUniqueAngle=(e,t)=>{e.findIndex(e=>e===t)<0&&e.push(t)},expandShell=(e,t)=>{const{delta:o,segments:n}=Object.assign({},{delta:1,segments:12},e);let s=geom3.create();const r=new Map,c=new Map,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 m=r[0],g=vec3.cross(vec3.create(),m,i);let p=[];for(let e=0;e<n;e++)addUniqueAngle(p,e*TAU/n);for(let e=0,t=r.length;e<t;e++){const t=r[e],o=vec3.dot(g,t),n=vec3.dot(m,t);let s=Math.atan2(o,n);s<0&&(s+=TAU),addUniqueAngle(p,s),(s=Math.atan2(-o,-n))<0&&(s+=TAU),addUniqueAngle(p,s)}const h=(p=p.sort(fnNumberSort)).length;let v,d;const f=[],S=[],q=[];for(let e=-1;e<h;e++){const t=p[e<0?e+h:e],n=Math.sin(t),s=Math.cos(t);vec3.scale(a,m,s*o),vec3.scale(l,g,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,v)<EPS&&(y=!0),!y){if(e>=0){f.push(r),S.push(i);const e=[d,i,r,v],t=poly3.create(e);q.push(t)}v=r,d=i}}S.reverse(),q.push(poly3.create(f)),q.push(poly3.create(S));const y=geom3.create(q);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 m=vec3.cross(a,c,u);vec3.normalize(m,m);const g=vec3.cross(l,m,c),p=sphere({center:[t[0],t[1],t[2]],radius:o,segments:n,axes:[c,m,g]});s=unionGeom3Sub(s,p)}),retessellate(s)};module.exports=expandShell;
879
-
880
- },{"../../geometries/geom3":41,"../../geometries/poly3":79,"../../maths/constants":94,"../../maths/mat4":143,"../../maths/vec3":222,"../../primitives/sphere":386,"../../utils/fnNumberSort":399,"../booleans/unionGeom3Sub":288,"../modifiers/retessellate":356,"./extrudePolygon":294}],294:[function(require,module,exports){
881
- const mat4=require("../../maths/mat4"),vec3=require("../../maths/vec3"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),extrudePolygon=(e,r)=>{vec3.dot(poly3.plane(r),e)>0&&(r=poly3.invert(r));const t=[r],o=poly3.transform(mat4.fromTranslation(mat4.create(),e),r),s=r.vertices.length;for(let e=0;e<s;e++){const c=e<s-1?e+1:0,i=poly3.create([r.vertices[e],o.vertices[e],o.vertices[c],r.vertices[c]]);t.push(i)}return t.push(poly3.invert(o)),geom3.create(t)};module.exports=extrudePolygon;
882
-
883
- },{"../../geometries/geom3":41,"../../geometries/poly3":79,"../../maths/mat4":143,"../../maths/vec3":222}],295:[function(require,module,exports){
884
- module.exports={expand:require("./expand"),offset:require("./offset")};
885
-
886
- },{"./expand":289,"./offset":296}],296:[function(require,module,exports){
887
- 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;
888
-
889
- },{"../../geometries/geom2":25,"../../geometries/path2":62,"../../utils/flatten":398,"./offsetGeom2":298,"./offsetPath2":299}],297:[function(require,module,exports){
890
- const{EPS:EPS,TAU:TAU}=require("../../maths/constants"),intersect=require("../../maths/utils/intersect"),line2=require("../../maths/line2"),vec2=require("../../maths/vec2"),area=require("../../maths/utils/area"),offsetFromPoints=(e,t)=>{let{delta:s,corners:c,closed:n,segments:a}=Object.assign({},{delta:1,corners:"edge",closed:!1,segments:16},e);if(Math.abs(s)<EPS)return t;let r=e.closed?area(t):1;0===r&&(r=1);const o=r>0&&s>=0||r<0&&s<0;s=Math.abs(s);let i=null,l=[];const u=[],v=vec2.create(),f=t.length;for(let e=0;e<f;e++){const c=(e+1)%f,a=t[e],r=t[c];o?vec2.subtract(v,a,r):vec2.subtract(v,r,a),vec2.normal(v,v),vec2.normalize(v,v),vec2.scale(v,v,s);const h=vec2.add(vec2.create(),a,v),d=vec2.add(vec2.create(),r,v),m=[h,d];if(null!=i&&(n||!n&&0!==c)){const e=intersect(i[0],i[1],m[0],m[1]);e?(l.pop(),m[0]=e):u.push({c:a,s0:i,s1:m})}i=[h,d],(0!==c||n)&&(l.push(m[0]),l.push(m[1]))}if(n&&null!=i){const e=l[0],s=l[1],c=intersect(i[0],i[1],e,s);if(c)l[0]=c,l.pop();else{const c=t[0],n=[e,s];u.push({c:c,s0:i,s1:n})}}if("edge"===c){const e=new Map;l.forEach((t,s)=>e.set(t,s));const t=line2.create(),s=line2.create();u.forEach(c=>{line2.fromPoints(t,c.s0[0],c.s0[1]),line2.fromPoints(s,c.s1[0],c.s1[1]);const n=line2.intersectPointOfLines(t,s);if(Number.isFinite(n[0])&&Number.isFinite(n[1])){const t=c.s0[1],s=e.get(t);l[s]=n,l[(s+1)%l.length]=void 0}else{const t=c.s1[0],s=e.get(t);l[s]=void 0}}),l=l.filter(e=>void 0!==e)}if("round"===c){let e=Math.floor(a/4);const t=vec2.create();u.forEach(c=>{let n=vec2.angle(vec2.subtract(t,c.s1[0],c.c));if(n-=vec2.angle(vec2.subtract(t,c.s0[1],c.c)),o&&n<0&&(n+=Math.PI)<0&&(n+=Math.PI),!o&&n>0&&(n-=Math.PI)>0&&(n-=Math.PI),0!==n){const r=n/(e=Math.floor(a*(Math.abs(n)/TAU))),o=vec2.angle(vec2.subtract(t,c.s0[1],c.c)),i=[];for(let t=1;t<e;t++){const e=o+r*t,n=vec2.fromAngleRadians(vec2.create(),e);vec2.scale(n,n,s),vec2.add(n,n,c.c),i.push(n)}if(i.length>0){const e=c.s0[1];let t=l.findIndex(t=>vec2.equals(e,t));t=(t+1)%l.length,l.splice(t,0,...i)}}else{const e=c.s1[0],t=l.findIndex(t=>vec2.equals(e,t));l.splice(t,1)}})}return l};module.exports=offsetFromPoints;
891
-
892
- },{"../../maths/constants":94,"../../maths/line2":105,"../../maths/utils/area":168,"../../maths/utils/intersect":171,"../../maths/vec2":191}],298:[function(require,module,exports){
893
- const geom2=require("../../geometries/geom2"),poly2=require("../../geometries/poly2"),offsetFromPoints=require("./offsetFromPoints"),offsetGeom2=(e,o)=>{const{delta:r,corners:s,segments:t}=Object.assign({},{delta:1,corners:"edge",segments:0},e);if("edge"!==s&&"chamfer"!==s&&"round"!==s)throw new Error('corners must be "edge", "chamfer", or "round"');const n=geom2.toOutlines(o),m=n.map(o=>{const m=n.reduce((e,r)=>e+poly2.arePointsInside(o,poly2.create(r)),0);return offsetFromPoints(e={delta:m%2==0?r:-r,corners:s,closed:!0,segments:t},o)}).reduce((e,o)=>e.concat(geom2.toSides(geom2.fromPoints(o))),[]);return geom2.create(m)};module.exports=offsetGeom2;
894
-
895
- },{"../../geometries/geom2":25,"../../geometries/poly2":73,"./offsetFromPoints":297}],299:[function(require,module,exports){
896
- const path2=require("../../geometries/path2"),offsetFromPoints=require("./offsetFromPoints"),offsetPath2=(e,o)=>{const s={delta:1,corners:"edge",closed:o.isClosed,segments:16},{delta:t,corners:r,closed:n,segments:c}=Object.assign({},s,e);if("edge"!==r&&"chamfer"!==r&&"round"!==r)throw new Error('corners must be "edge", "chamfer", or "round"');const d=offsetFromPoints(e={delta:t,corners:r,closed:n,segments:c},path2.toPoints(o));return path2.fromPoints({closed:n},d)};module.exports=offsetPath2;
897
-
898
- },{"../../geometries/path2":62,"./offsetFromPoints":297}],300:[function(require,module,exports){
899
- const{area:area}=require("../../../maths/utils"),{toOutlines:toOutlines}=require("../../../geometries/geom2"),{arePointsInside:arePointsInside}=require("../../../geometries/poly2"),assignHoles=e=>{const s=toOutlines(e),o=[],t=[];s.forEach((e,s)=>{const n=area(e);n<0?t.push(s):n>0&&o.push(s)});const n=[],r=[];return o.forEach((e,o)=>{const i=s[e];n[o]=[],t.forEach((e,t)=>{const a=s[e];arePointsInside([a[0]],{vertices:i})&&(n[o].push(e),r[t]||(r[t]=[]),r[t].push(o))})}),t.forEach((e,s)=>{if(r[s]&&r[s].length>1){const o=minIndex(r[s],e=>n[e].length);r[s].forEach((s,t)=>{t!==o&&(n[s]=n[s].filter(s=>s!==e))})}}),n.map((e,t)=>({solid:s[o[t]],holes:e.map(e=>s[e])}))},minIndex=(e,s)=>{let o,t;return e.forEach((e,n)=>{const r=s(e);(void 0===t||r<t)&&(o=n,t=r)}),o};module.exports=assignHoles;
900
-
901
- },{"../../../geometries/geom2":25,"../../../geometries/poly2":73,"../../../maths/utils":169}],301:[function(require,module,exports){
902
- const{filterPoints:filterPoints,linkedPolygon:linkedPolygon,locallyInside:locallyInside,splitPolygon:splitPolygon}=require("./linkedPolygon"),{area:area,pointInTriangle:pointInTriangle}=require("./triangle"),eliminateHoles=(e,t,n,l)=>{const i=[];for(let n=0,o=t.length;n<o;n++){const r=t[n]*l,x=n<o-1?t[n+1]*l:e.length,s=linkedPolygon(e,r,x,l,!1);s===s.next&&(s.steiner=!0),i.push(getLeftmost(s))}i.sort((e,t)=>e.x-t.x);for(let e=0;e<i.length;e++)n=eliminateHole(i[e],n),n=filterPoints(n,n.next);return n},eliminateHole=(e,t)=>{const n=findHoleBridge(e,t);if(!n)return t;const l=splitPolygon(n,e),i=filterPoints(n,n.next);return filterPoints(l,l.next),t===n?i:t},findHoleBridge=(e,t)=>{let n=t;const l=e.x,i=e.y;let o,r=-1/0;do{if(i<=n.y&&i>=n.next.y&&n.next.y!==n.y){const e=n.x+(i-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(e<=l&&e>r){if(r=e,e===l){if(i===n.y)return n;if(i===n.next.y)return n.next}o=n.x<n.next.x?n:n.next}}n=n.next}while(n!==t);if(!o)return null;if(l===r)return o;const x=o,s=o.x,y=o.y;let a=1/0;n=o;do{if(l>=n.x&&n.x>=s&&l!==n.x&&pointInTriangle(i<y?l:r,i,s,y,i<y?r:l,i,n.x,n.y)){const t=Math.abs(i-n.y)/(l-n.x);locallyInside(n,e)&&(t<a||t===a&&(n.x>o.x||n.x===o.x&&sectorContainsSector(o,n)))&&(o=n,a=t)}n=n.next}while(n!==x);return o},sectorContainsSector=(e,t)=>area(e.prev,e,t.prev)<0&&area(t.next,e,e.next)<0,getLeftmost=e=>{let t=e,n=e;do{(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next}while(t!==e);return n};module.exports=eliminateHoles;
903
-
904
- },{"./linkedPolygon":305,"./triangle":307}],302:[function(require,module,exports){
905
- const eliminateHoles=require("./eliminateHoles"),{removeNode:removeNode,sortLinked:sortLinked}=require("./linkedList"),{cureLocalIntersections:cureLocalIntersections,filterPoints:filterPoints,isValidDiagonal:isValidDiagonal,linkedPolygon:linkedPolygon,splitPolygon:splitPolygon}=require("./linkedPolygon"),{area:area,pointInTriangle:pointInTriangle}=require("./triangle"),triangulate=(e,r,n=2)=>{const t=r&&r.length,i=t?r[0]*n:e.length;let x=linkedPolygon(e,0,i,n,!0);const l=[];if(!x||x.next===x.prev)return l;let o,a,y,s,p;if(t&&(x=eliminateHoles(e,r,x,n)),e.length>80*n){o=y=e[0],a=s=e[1];for(let r=n;r<i;r+=n){const n=e[r],t=e[r+1];n<o&&(o=n),t<a&&(a=t),n>y&&(y=n),t>s&&(s=t)}p=0!==(p=Math.max(y-o,s-a))?1/p:0}return earcutLinked(x,l,n,o,a,p),l},earcutLinked=(e,r,n,t,i,x,l)=>{if(!e)return;!l&&x&&indexCurve(e,t,i,x);let o,a,y=e;for(;e.prev!==e.next;)if(o=e.prev,a=e.next,x?isEarHashed(e,t,i,x):isEar(e))r.push(o.i/n),r.push(e.i/n),r.push(a.i/n),removeNode(e),e=a.next,y=a.next;else if((e=a)===y){l?1===l?(e=cureLocalIntersections(filterPoints(e),r,n),earcutLinked(e,r,n,t,i,x,2)):2===l&&splitEarcut(e,r,n,t,i,x):earcutLinked(filterPoints(e),r,n,t,i,x,1);break}},isEar=e=>{const r=e.prev,n=e,t=e.next;if(area(r,n,t)>=0)return!1;let i=e.next.next;for(;i!==e.prev;){if(pointInTriangle(r.x,r.y,n.x,n.y,t.x,t.y,i.x,i.y)&&area(i.prev,i,i.next)>=0)return!1;i=i.next}return!0},isEarHashed=(e,r,n,t)=>{const i=e.prev,x=e,l=e.next;if(area(i,x,l)>=0)return!1;const o=i.x<x.x?i.x<l.x?i.x:l.x:x.x<l.x?x.x:l.x,a=i.y<x.y?i.y<l.y?i.y:l.y:x.y<l.y?x.y:l.y,y=i.x>x.x?i.x>l.x?i.x:l.x:x.x>l.x?x.x:l.x,s=i.y>x.y?i.y>l.y?i.y:l.y:x.y>l.y?x.y:l.y,p=zOrder(o,a,r,n,t),u=zOrder(y,s,r,n,t);let d=e.prevZ,v=e.nextZ;for(;d&&d.z>=p&&v&&v.z<=u;){if(d!==e.prev&&d!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,l.x,l.y,d.x,d.y)&&area(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,v!==e.prev&&v!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,l.x,l.y,v.x,v.y)&&area(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;d&&d.z>=p;){if(d!==e.prev&&d!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,l.x,l.y,d.x,d.y)&&area(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;v&&v.z<=u;){if(v!==e.prev&&v!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,l.x,l.y,v.x,v.y)&&area(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0},splitEarcut=(e,r,n,t,i,x)=>{let l=e;do{let e=l.next.next;for(;e!==l.prev;){if(l.i!==e.i&&isValidDiagonal(l,e)){let o=splitPolygon(l,e);return l=filterPoints(l,l.next),o=filterPoints(o,o.next),earcutLinked(l,r,n,t,i,x),void earcutLinked(o,r,n,t,i,x)}e=e.next}l=l.next}while(l!==e)},indexCurve=(e,r,n,t)=>{let i=e;do{null===i.z&&(i.z=zOrder(i.x,i.y,r,n,t)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,sortLinked(i,e=>e.z)},zOrder=(e,r,n,t,i)=>(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))|(r=1431655765&((r=858993459&((r=252645135&((r=16711935&((r=32767*(r-t)*i)|r<<8))|r<<4))|r<<2))|r<<1))<<1;module.exports=triangulate;
906
-
907
- },{"./eliminateHoles":301,"./linkedList":303,"./linkedPolygon":305,"./triangle":307}],303:[function(require,module,exports){
908
- const sortLinked=require("./linkedListSort");class Node{constructor(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}}const insertNode=(e,t,n,r)=>{const o=new Node(e,t,n);return r?(o.next=r.next,o.prev=r,r.next.prev=o,r.next=o):(o.prev=o,o.next=o),o},removeNode=e=>{e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)};module.exports={Node:Node,insertNode:insertNode,removeNode:removeNode,sortLinked:sortLinked};
909
-
910
- },{"./linkedListSort":304}],304:[function(require,module,exports){
911
- const sortLinked=(e,t)=>{let l,n,o,r,x,Z=1;do{n=e,e=null;let u=null;for(x=0;n;){x++,o=n;let d=0;for(l=0;l<Z&&(d++,o=o.nextZ);l++);let s=Z;for(;d>0||s>0&&o;)0!==d&&(0===s||!o||t(n)<=t(o))?(r=n,n=n.nextZ,d--):(r=o,o=o.nextZ,s--),u?u.nextZ=r:e=r,r.prevZ=u,u=r;n=o}u.nextZ=null,Z*=2}while(x>1);return e};module.exports=sortLinked;
912
-
913
- },{}],305:[function(require,module,exports){
914
- const{Node:Node,insertNode:insertNode,removeNode:removeNode}=require("./linkedList"),{area:area}=require("./triangle"),linkedPolygon=(e,n,t,r,i)=>{let o;if(i===signedArea(e,n,t,r)>0)for(let i=n;i<t;i+=r)o=insertNode(i,e[i],e[i+1],o);else for(let i=t-r;i>=n;i-=r)o=insertNode(i,e[i],e[i+1],o);return o&&equals(o,o.next)&&(removeNode(o),o=o.next),o},filterPoints=(e,n)=>{if(!e)return e;n||(n=e);let t,r=e;do{if(t=!1,r.steiner||!equals(r,r.next)&&0!==area(r.prev,r,r.next))r=r.next;else{if(removeNode(r),(r=n=r.prev)===r.next)break;t=!0}}while(t||r!==n);return n},cureLocalIntersections=(e,n,t)=>{let r=e;do{const i=r.prev,o=r.next.next;!equals(i,o)&&intersects(i,r,r.next,o)&&locallyInside(i,o)&&locallyInside(o,i)&&(n.push(i.i/t),n.push(r.i/t),n.push(o.i/t),removeNode(r),removeNode(r.next),r=e=o),r=r.next}while(r!==e);return filterPoints(r)},intersectsPolygon=(e,n)=>{let t=e;do{if(t.i!==e.i&&t.next.i!==e.i&&t.i!==n.i&&t.next.i!==n.i&&intersects(t,t.next,e,n))return!0;t=t.next}while(t!==e);return!1},locallyInside=(e,n)=>area(e.prev,e,e.next)<0?area(e,n,e.next)>=0&&area(e,e.prev,n)>=0:area(e,n,e.prev)<0||area(e,e.next,n)<0,middleInside=(e,n)=>{let t=e,r=!1;const i=(e.x+n.x)/2,o=(e.y+n.y)/2;do{t.y>o!=t.next.y>o&&t.next.y!==t.y&&i<(t.next.x-t.x)*(o-t.y)/(t.next.y-t.y)+t.x&&(r=!r),t=t.next}while(t!==e);return r},splitPolygon=(e,n)=>{const t=new Node(e.i,e.x,e.y),r=new Node(n.i,n.x,n.y),i=e.next,o=n.prev;return e.next=n,n.prev=e,t.next=i,i.prev=t,r.next=t,t.prev=r,o.next=r,r.prev=o,r},isValidDiagonal=(e,n)=>e.next.i!==n.i&&e.prev.i!==n.i&&!intersectsPolygon(e,n)&&(locallyInside(e,n)&&locallyInside(n,e)&&middleInside(e,n)&&(area(e.prev,e,n.prev)||area(e,n.prev,n))||equals(e,n)&&area(e.prev,e,e.next)>0&&area(n.prev,n,n.next)>0),intersects=(e,n,t,r)=>{const i=Math.sign(area(e,n,t)),o=Math.sign(area(e,n,r)),l=Math.sign(area(t,r,e)),a=Math.sign(area(t,r,n));return i!==o&&l!==a||(!(0!==i||!onSegment(e,t,n))||(!(0!==o||!onSegment(e,r,n))||(!(0!==l||!onSegment(t,e,r))||!(0!==a||!onSegment(t,n,r)))))},onSegment=(e,n,t)=>n.x<=Math.max(e.x,t.x)&&n.x>=Math.min(e.x,t.x)&&n.y<=Math.max(e.y,t.y)&&n.y>=Math.min(e.y,t.y),signedArea=(e,n,t,r)=>{let i=0;for(let o=n,l=t-r;o<t;o+=r)i+=(e[l]-e[o])*(e[o+1]+e[l+1]),l=o;return i},equals=(e,n)=>e.x===n.x&&e.y===n.y;module.exports={cureLocalIntersections:cureLocalIntersections,filterPoints:filterPoints,isValidDiagonal:isValidDiagonal,linkedPolygon:linkedPolygon,locallyInside:locallyInside,splitPolygon:splitPolygon};
915
-
916
- },{"./linkedList":303,"./triangle":307}],306:[function(require,module,exports){
917
- const geom2=require("../../../geometries/geom2"),plane=require("../../../maths/plane"),vec2=require("../../../maths/vec2"),vec3=require("../../../maths/vec3"),calculatePlane=require("../slice/calculatePlane"),assignHoles=require("./assignHoles");class PolygonHierarchy{constructor(e){this.plane=calculatePlane(e);const s=vec3.orthogonal(vec3.create(),this.plane),c=vec3.cross(vec3.create(),this.plane,s);this.v=vec3.normalize(c,c),this.u=vec3.cross(vec3.create(),this.v,this.plane),this.basisMap=new Map;const t=e.edges.map(e=>e.map(e=>this.to2D(e))),a=geom2.create(t);this.roots=assignHoles(a)}to2D(e){const s=vec2.fromValues(vec3.dot(e,this.u),vec3.dot(e,this.v));return this.basisMap.set(s,e),s}to3D(e){const s=this.basisMap.get(e);if(s)return s;{console.log("Warning: point not in original slice");const s=vec3.scale(vec3.create(),this.u,e[0]),c=vec3.scale(vec3.create(),this.v,e[1]),t=vec3.scale(vec3.create(),plane,plane[3]),a=vec3.add(s,s,t);return vec3.add(c,c,a)}}}module.exports=PolygonHierarchy;
918
-
919
- },{"../../../geometries/geom2":25,"../../../maths/plane":163,"../../../maths/vec2":191,"../../../maths/vec3":222,"../slice/calculatePlane":320,"./assignHoles":300}],307:[function(require,module,exports){
920
- const pointInTriangle=(n,a,e,r,i,o,t,x)=>(i-t)*(a-x)-(n-t)*(o-x)>=0&&(n-t)*(r-x)-(e-t)*(a-x)>=0&&(e-t)*(o-x)-(i-t)*(r-x)>=0,area=(n,a,e)=>(a.y-n.y)*(e.x-a.x)-(a.x-n.x)*(e.y-a.y);module.exports={area:area,pointInTriangle:pointInTriangle};
921
-
922
- },{}],308:[function(require,module,exports){
923
- const mat4=require("../../maths/mat4"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),slice=require("./slice"),repairSlice=require("./slice/repair"),extrudeWalls=require("./extrudeWalls"),defaultCallback=(e,r,l)=>{let t=null;return geom2.isA(l)&&(t=slice.fromSides(geom2.toSides(l))),poly3.isA(l)&&(t=slice.fromPoints(poly3.toPoints(l))),0===e||1===e?slice.transform(mat4.fromTranslation(mat4.create(),[0,0,e]),t):null},extrudeFromSlices=(e,r)=>{const l={numberOfSlices:2,capStart:!0,capEnd:!0,close:!1,repair:!0,callback:defaultCallback},{numberOfSlices:t,capStart:o,capEnd:c,close:s,repair:i,callback:a}=Object.assign({},l,e);if(t<2)throw new Error("numberOfSlices must be 2 or more");i&&(r=repairSlice(r));const n=t-1;let u=null,m=null,f=null,g=[];for(let e=0;e<t;e++){const l=a(e/n,e,r);if(l){if(!slice.isA(l))throw new Error("the callback function must return slice objects");if(0===slice.toEdges(l).length)throw new Error("the callback function must return slices with one or more edges");f&&(g=g.concat(extrudeWalls(f,l))),0===e&&(u=l),e===t-1&&(m=l),f=l}}if(c){const e=slice.toPolygons(m);g=g.concat(e)}if(o){const e=slice.toPolygons(u).map(poly3.invert);g=g.concat(e)}return o||c||s&&!slice.equals(m,u)&&(g=g.concat(extrudeWalls(m,u))),geom3.create(g)};module.exports=extrudeFromSlices;
924
-
925
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/poly3":79,"../../maths/mat4":143,"./extrudeWalls":317,"./slice":326,"./slice/repair":328}],309:[function(require,module,exports){
926
- const{TAU:TAU}=require("../../maths/constants"),slice=require("./slice"),mat4=require("../../maths/mat4"),extrudeFromSlices=require("./extrudeFromSlices"),geom2=require("../../geometries/geom2"),extrudeHelical=(e,t)=>{const r={angle:TAU,startAngle:0,pitch:10,endOffset:0,segmentsPerRotation:32},{angle:a,endOffset:s,segmentsPerRotation:o,startAngle:i}=Object.assign({},r,e);let n;n=!e.pitch&&e.height?e.height/(a/TAU):e.pitch?e.pitch:r.pitch;if(o<3)throw new Error("The number of segments per rotation needs to be at least 3.");const m=geom2.toSides(t);if(0===m.length)throw new Error("the given geometry cannot be empty");const c=m.filter(e=>e[0][0]>=0);let l=slice.fromSides(m);0===c.length&&(l=slice.reverse(l));const h=Math.round(o/TAU*Math.abs(a)),g=h>=2?h:2,u=mat4.create();let f;return extrudeFromSlices({numberOfSlices:g+1,callback:(e,t,r)=>{const o=i+a/g*t,m=s/g*t,c=(o-i)/TAU*n;return mat4.multiply(u,mat4.fromTranslation(mat4.create(),[m,0,c*Math.sign(a)]),mat4.fromXRotation(mat4.create(),-TAU/4*Math.sign(a))),f=mat4.create(),mat4.multiply(f,mat4.fromZRotation(mat4.create(),o),u),slice.transform(f,r)}},l)};module.exports=extrudeHelical;
927
-
928
- },{"../../geometries/geom2":25,"../../maths/constants":94,"../../maths/mat4":143,"./extrudeFromSlices":308,"./slice":326}],310:[function(require,module,exports){
929
- const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),path2=require("../../geometries/path2"),extrudeLinearGeom2=require("./extrudeLinearGeom2"),extrudeLinearPath2=require("./extrudeLinearPath2"),extrudeLinear=(e,...t)=>{const{height:r,twistAngle:i,twistSteps:n,repair:a}=Object.assign({},{height:1,twistAngle:0,twistSteps:1,repair:!0},e);if(0===(t=flatten(t)).length)throw new Error("wrong number of arguments");e={offset:[0,0,r],twistAngle:i,twistSteps:n,repair:a};const s=t.map(t=>path2.isA(t)?extrudeLinearPath2(e,t):geom2.isA(t)?extrudeLinearGeom2(e,t):t);return 1===s.length?s[0]:s};module.exports=extrudeLinear;
930
-
931
- },{"../../geometries/geom2":25,"../../geometries/path2":62,"../../utils/flatten":398,"./extrudeLinearGeom2":311,"./extrudeLinearPath2":312}],311:[function(require,module,exports){
932
- 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,repair:i}=Object.assign({},{offset:[0,0,1],twistAngle:0,twistSteps:12,repair:!0},e);if(o<1)throw new Error("twistSteps must be 1 or more");0===s&&(o=1);const c=vec3.clone(r),m=geom2.toSides(t);if(0===m.length)throw new Error("the given geometry cannot be empty");const a=slice.fromSides(m);c[2]<0&&slice.reverse(a,a);const n=mat4.create();return extrudeFromSlices(e={numberOfSlices:o+1,capStart:!0,capEnd:!0,repair:i,callback:(e,t,r)=>{const i=t/o*s,m=vec3.scale(vec3.create(),c,t/o);return mat4.multiply(n,mat4.fromZRotation(n,i),mat4.fromTranslation(mat4.create(),m)),slice.transform(n,r)}},a)};module.exports=extrudeGeom2;
933
-
934
- },{"../../geometries/geom2":25,"../../maths/mat4":143,"../../maths/vec3":222,"./extrudeFromSlices":308,"./slice":326}],312:[function(require,module,exports){
935
- const geom2=require("../../geometries/geom2"),path2=require("../../geometries/path2"),extrudeLinearGeom2=require("./extrudeLinearGeom2"),extrudePath2=(e,r)=>{if(!r.isClosed)throw new Error("extruded path must be closed");const t=path2.toPoints(r),o=geom2.fromPoints(t);return extrudeLinearGeom2(e,o)};module.exports=extrudePath2;
936
-
937
- },{"../../geometries/geom2":25,"../../geometries/path2":62,"./extrudeLinearGeom2":311}],313:[function(require,module,exports){
938
- 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;
939
-
940
- },{"../../geometries/geom2":25,"../../geometries/path2":62,"../../utils/flatten":398,"./extrudeRectangularGeom2":314,"./extrudeRectangularPath2":315}],314:[function(require,module,exports){
941
- 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;
942
-
943
- },{"../../geometries/geom2":25,"../../geometries/path2":62,"../../maths/utils":169,"../expansions/expand":289,"./extrudeLinearGeom2":311}],315:[function(require,module,exports){
944
- const path2=require("../../geometries/path2"),expand=require("../expansions/expand"),extrudeLinearGeom2=require("./extrudeLinearGeom2"),extrudeRectangularPath2=(e,t)=>{const{size:r,height:n}=Object.assign({},{size:1,height:1},e);if(e.delta=r,e.offset=[0,0,n],0===path2.toPoints(t).length)throw new Error("the given geometry cannot be empty");const a=expand(e,t);return extrudeLinearGeom2(e,a)};module.exports=extrudeRectangularPath2;
945
-
946
- },{"../../geometries/path2":62,"../expansions/expand":289,"./extrudeLinearGeom2":311}],316:[function(require,module,exports){
947
- const{TAU:TAU}=require("../../maths/constants"),mat4=require("../../maths/mat4"),{mirrorX:mirrorX}=require("../transforms/mirror"),geom2=require("../../geometries/geom2"),slice=require("./slice"),extrudeFromSlices=require("./extrudeFromSlices"),extrudeRotate=(e,t)=>{const r={segments:12,startAngle:0,angle:TAU,overflow:"cap"};let{segments:a,startAngle:o,angle:s,overflow:m}=Object.assign({},r,e);if(a<3)throw new Error("segments must be greater then 3");o=Math.abs(o)>TAU?o%TAU:o,s=Math.abs(s)>TAU?s%TAU:s;let n=o+s;if((n=Math.abs(n)>TAU?n%TAU:n)<o){const e=o;o=n,n=e}let l=n-o;if(l<=0&&(l=TAU),Math.abs(l)<TAU){const e=TAU/a;a=Math.floor(Math.abs(l)/e),Math.abs(l)>a*e&&a++}let i=geom2.toSides(t);if(0===i.length)throw new Error("the given geometry cannot be empty");const c=i.filter(e=>e[0][0]<0),g=i.filter(e=>e[0][0]>=0);c.length>0&&g.length>0&&"cap"===m&&(c.length>g.length?(i=i.map(e=>{let t=e[0],r=e[1];return[t=[Math.min(t[0],0),t[1]],r=[Math.min(r[0],0),r[1]]]}),t=geom2.create(i),t=mirrorX(t)):g.length>=c.length&&(i=i.map(e=>{let t=e[0],r=e[1];return[t=[Math.max(t[0],0),t[1]],r=[Math.max(r[0],0),r[1]]]}),t=geom2.create(i)));const h=l/a,u=Math.abs(l)<TAU,A=slice.fromSides(geom2.toSides(t));slice.reverse(A,A);const f=mat4.create();return extrudeFromSlices(e={numberOfSlices:a+1,capStart:u,capEnd:u,close:!u,callback:(e,t,r)=>{let s=h*t+o;return l===TAU&&t===a&&(s=o),mat4.multiply(f,mat4.fromZRotation(f,s),mat4.fromXRotation(mat4.create(),TAU/4)),slice.transform(f,r)}},A)};module.exports=extrudeRotate;
948
-
949
- },{"../../geometries/geom2":25,"../../maths/constants":94,"../../maths/mat4":143,"../transforms/mirror":363,"./extrudeFromSlices":308,"./slice":326}],317:[function(require,module,exports){
950
- const{EPS:EPS}=require("../../maths/constants"),vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),slice=require("./slice"),gcd=(e,t)=>e===t?e:e<t?gcd(t,e):1===t?1:0===t?e:gcd(t,e%t),lcm=(e,t)=>e*t/gcd(e,t),repartitionEdges=(e,t)=>{const r=e/t.length;if(1===r)return t;const s=vec3.fromValues(r,r,r),c=[];return t.forEach(e=>{const t=vec3.subtract(vec3.create(),e[1],e[0]);vec3.divide(t,t,s);let l=e[0];for(let e=1;e<=r;++e){const e=vec3.add(vec3.create(),l,t);c.push([l,e]),l=e}}),c},EPSAREA=EPS*EPS/2*Math.sin(Math.PI/3),extrudeWalls=(e,t)=>{let r=slice.toEdges(e),s=slice.toEdges(t);if(r.length!==s.length){const e=lcm(r.length,s.length);e!==r.length&&(r=repartitionEdges(e,r)),e!==s.length&&(s=repartitionEdges(e,s))}const c=[];return r.forEach((e,t)=>{const r=s[t],l=poly3.create([e[0],e[1],r[1]]),o=poly3.measureArea(l);Number.isFinite(o)&&o>EPSAREA&&c.push(l);const n=poly3.create([e[0],r[1],r[0]]),i=poly3.measureArea(n);Number.isFinite(i)&&i>EPSAREA&&c.push(n)}),c};module.exports=extrudeWalls;
951
-
952
- },{"../../geometries/poly3":79,"../../maths/constants":94,"../../maths/vec3":222,"./slice":326}],318:[function(require,module,exports){
953
- module.exports={extrudeFromSlices:require("./extrudeFromSlices"),extrudeLinear:require("./extrudeLinear"),extrudeRectangular:require("./extrudeRectangular"),extrudeRotate:require("./extrudeRotate"),extrudeHelical:require("./extrudeHelical"),project:require("./project"),slice:require("./slice")};
954
-
955
- },{"./extrudeFromSlices":308,"./extrudeHelical":309,"./extrudeLinear":310,"./extrudeRectangular":313,"./extrudeRotate":316,"./project":319,"./slice":326}],319:[function(require,module,exports){
956
- 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"),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),a=t*t*Math.sqrt(3)/4;if(0===t)return geom2.create();const n=geom3.toPolygons(o);let s=[];for(let e=0;e<n.length;e++){const o=n[e].vertices.map(e=>plane.projectionOfPoint(r,e)),t=poly3.create(o),i=poly3.plane(t);aboutEqualNormals(r,i)&&(poly3.measureArea(t)<a||s.push(t))}if(!aboutEqualNormals(r,[0,0,1])){const e=mat4.fromVectorRotation(mat4.create(),r,[0,0,1]);s=s.map(o=>poly3.transform(e,o))}const i=(s=s.sort((e,o)=>poly3.measureArea(o)-poly3.measureArea(e))).map(e=>geom2.fromPoints(e.vertices));return unionGeom2(i)},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 a=o.map(o=>geom3.isA(o)?projectGeom3(e,o):o);return 1===a.length?a[0]:a};module.exports=project;
957
-
958
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/poly3":79,"../../maths/mat4":143,"../../maths/plane":163,"../../maths/utils/aboutEqualNormals":167,"../../measurements/measureEpsilon":263,"../../utils/flatten":398,"../booleans/unionGeom2":286}],320:[function(require,module,exports){
959
- 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=>{if(!vec3.equals(e[0],e[1])){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;
960
-
961
- },{"../../../maths/plane":163,"../../../maths/vec3":222}],321:[function(require,module,exports){
962
- const create=require("./create"),vec3=require("../../../maths/vec3"),clone=(...e)=>{let c,r;return 1===e.length?(c=create(),r=e[0]):(c=e[0],r=e[1]),c.edges=r.edges.map(e=>[vec3.clone(e[0]),vec3.clone(e[1])]),c};module.exports=clone;
963
-
964
- },{"../../../maths/vec3":222,"./create":322}],322:[function(require,module,exports){
965
- const create=e=>(e||(e=[]),{edges:e});module.exports=create;
966
-
967
- },{}],323:[function(require,module,exports){
968
- const vec3=require("../../../maths/vec3"),equals=(e,s)=>{const r=e.edges,t=s.edges;return r.length===t.length&&r.reduce((e,s,r)=>{const u=t[r],c=vec3.squaredDistance(s[0],u[0]);return e&&c<Number.EPSILON},!0)};module.exports=equals;
969
-
970
- },{"../../../maths/vec3":222}],324:[function(require,module,exports){
971
- const vec3=require("../../../maths/vec3"),create=require("./create"),fromPoints=e=>{if(!Array.isArray(e))throw new Error("the given points must be an array");if(e.length<3)throw new Error("the given points must contain THREE or more points");const r=[];let t=e[e.length-1];return e.forEach(e=>{2===e.length&&r.push([vec3.fromVec2(vec3.create(),t),vec3.fromVec2(vec3.create(),e)]),3===e.length&&r.push([t,e]),t=e}),create(r)};module.exports=fromPoints;
972
-
973
- },{"../../../maths/vec3":222,"./create":322}],325:[function(require,module,exports){
974
- const vec3=require("../../../maths/vec3"),create=require("./create"),fromSides=e=>{if(!Array.isArray(e))throw new Error("the given sides must be an array");const r=[];return e.forEach(e=>{r.push([vec3.fromVec2(vec3.create(),e[0]),vec3.fromVec2(vec3.create(),e[1])])}),create(r)};module.exports=fromSides;
975
-
976
- },{"../../../maths/vec3":222,"./create":322}],326:[function(require,module,exports){
977
- module.exports={calculatePlane:require("./calculatePlane"),clone:require("./clone"),create:require("./create"),equals:require("./equals"),fromPoints:require("./fromPoints"),fromSides:require("./fromSides"),isA:require("./isA"),reverse:require("./reverse"),toEdges:require("./toEdges"),toPolygons:require("./toPolygons"),toString:require("./toString"),transform:require("./transform")};
978
-
979
- },{"./calculatePlane":320,"./clone":321,"./create":322,"./equals":323,"./fromPoints":324,"./fromSides":325,"./isA":327,"./reverse":329,"./toEdges":330,"./toPolygons":331,"./toString":332,"./transform":333}],327:[function(require,module,exports){
980
- const isA=e=>!!(e&&"object"==typeof e&&"edges"in e&&Array.isArray(e.edges));module.exports=isA;
981
-
982
- },{}],328:[function(require,module,exports){
983
- const vec3=require("../../../maths/vec3"),create=require("./create"),repair=e=>{if(!e.edges)return e;let t=e.edges;const r=new Map,c=new Map;(t=t.filter(e=>!vec3.equals(e[0],e[1]))).forEach(e=>{const t=e[0].toString(),s=e[1].toString();r.set(t,e[0]),r.set(s,e[1]),c.set(t,(c.get(t)||0)+1),c.set(s,(c.get(s)||0)-1)});const s=[],a=[];return c.forEach((e,t)=>{e<0&&s.push(t),e>0&&a.push(t)}),s.forEach(e=>{const c=r.get(e);let s,n=1/0;a.forEach(e=>{const t=r.get(e),a=vec3.distance(c,t);a<n&&(n=a,s=t)}),console.warn(`slice.repair: repairing vertex gap ${c} to ${s} distance ${n}`),t=t.map(t=>t[0].toString()===e?[s,t[1]]:t[1].toString()===e?[t[0],s]:t)}),create(t)};module.exports=repair;
984
-
985
- },{"../../../maths/vec3":222,"./create":322}],329:[function(require,module,exports){
986
- const create=require("./create"),reverse=(...e)=>{let r,t;return 1===e.length?(r=create(),t=e[0]):(r=e[0],t=e[1]),r.edges=t.edges.map(e=>[e[1],e[0]]),r};module.exports=reverse;
987
-
988
- },{"./create":322}],330:[function(require,module,exports){
989
- const toEdges=e=>e.edges;module.exports=toEdges;
990
-
991
- },{}],331:[function(require,module,exports){
992
- const poly3=require("../../../geometries/poly3"),earcut=require("../earcut"),PolygonHierarchy=require("../earcut/polygonHierarchy"),toPolygons=o=>{const e=new PolygonHierarchy(o),r=[];return e.roots.forEach(({solid:o,holes:t})=>{let l=o.length;const n=[];t.forEach((o,e)=>{n.push(l),l+=o.length});const s=[o,...t].flat(),c=s.flat(),a=o=>e.to3D(s[o]),h=earcut(c,n);for(let o=0;o<h.length;o+=3){const t=h.slice(o,o+3).map(a);r.push(poly3.fromPointsAndPlane(t,e.plane))}}),r};module.exports=toPolygons;
993
-
994
- },{"../../../geometries/poly3":79,"../earcut":302,"../earcut/polygonHierarchy":306}],332:[function(require,module,exports){
995
- const vec3=require("../../../maths/vec3"),edgesToString=e=>e.reduce((e,t)=>e+=`[${vec3.toString(t[0])}, ${vec3.toString(t[1])}], `,""),toString=e=>`[${edgesToString(e.edges)}]`;module.exports=toString;
996
-
997
- },{"../../../maths/vec3":222}],333:[function(require,module,exports){
998
- const vec3=require("../../../maths/vec3"),create=require("./create"),transform=(e,r)=>{const t=r.edges.map(r=>[vec3.transform(vec3.create(),r[0],e),vec3.transform(vec3.create(),r[1],e)]);return create(t)};module.exports=transform;
999
-
1000
- },{"../../../maths/vec3":222,"./create":322}],334:[function(require,module,exports){
1001
- 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;
1002
-
1003
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../utils/areAllShapesTheSameType":396,"../../utils/flatten":398,"./hullGeom2":336,"./hullGeom3":337,"./hullPath2":338}],335:[function(require,module,exports){
1004
- 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;
1005
-
1006
- },{"../../utils/flatten":398,"../booleans/union":285,"./hull":334}],336:[function(require,module,exports){
1007
- const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),hullPoints2=require("./hullPoints2"),toUniquePoints=require("./toUniquePoints"),hullGeom2=(...e)=>{e=flatten(e);const t=toUniquePoints(e),o=hullPoints2(t);return o.length<3?geom2.create():geom2.fromPoints(o)};module.exports=hullGeom2;
1008
-
1009
- },{"../../geometries/geom2":25,"../../utils/flatten":398,"./hullPoints2":339,"./toUniquePoints":350}],337:[function(require,module,exports){
1010
- const flatten=require("../../utils/flatten"),geom3=require("../../geometries/geom3"),toUniquePoints=require("./toUniquePoints"),hullPoints3=require("./hullPoints3"),hullGeom3=(...e)=>{e=flatten(e);const t=toUniquePoints(e);return 0===t.length?geom3.create():geom3.create(hullPoints3(t))};module.exports=hullGeom3;
1011
-
1012
- },{"../../geometries/geom3":41,"../../utils/flatten":398,"./hullPoints3":340,"./toUniquePoints":350}],338:[function(require,module,exports){
1013
- const flatten=require("../../utils/flatten"),path2=require("../../geometries/path2"),hullPoints2=require("./hullPoints2"),toUniquePoints=require("./toUniquePoints"),hullPath2=(...t)=>{t=flatten(t);const e=toUniquePoints(t),o=hullPoints2(e);return path2.fromPoints({closed:!0},o)};module.exports=hullPath2;
1014
-
1015
- },{"../../geometries/path2":62,"../../utils/flatten":398,"./hullPoints2":339,"./toUniquePoints":350}],339:[function(require,module,exports){
1016
- const vec2=require("../../maths/vec2"),hullPoints2=e=>{let t=vec2.fromValues(1/0,1/0);e.forEach(e=>{(e[1]<t[1]||e[1]===t[1]&&e[0]<t[0])&&(t=e)});const n=[];e.forEach(e=>{const o=fakeAtan2(e[1]-t[1],e[0]-t[0]),s=vec2.squaredDistance(e,t);n.push({point:e,angle:o,distSq:s})}),n.sort((e,t)=>e.angle!==t.angle?e.angle-t.angle:e.distSq-t.distSq);const o=[];return n.forEach(e=>{let t=o.length;for(;t>1&&ccw(o[t-2],o[t-1],e.point)<=Number.EPSILON;)o.pop(),t=o.length;o.push(e.point)}),o},ccw=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]),fakeAtan2=(e,t)=>0===e&&0===t?-1/0:-t/e;module.exports=hullPoints2;
1017
-
1018
- },{"../../maths/vec2":191}],340:[function(require,module,exports){
1019
- const poly3=require("../../geometries/poly3"),quickhull=require("./quickhull"),hullPoints3=l=>{return quickhull(l,{skipTriangulation:!0}).map(u=>{const e=u.map(u=>l[u]);return poly3.create(e)})};module.exports=hullPoints3;
1020
-
1021
- },{"../../geometries/poly3":79,"./quickhull":348}],341:[function(require,module,exports){
1022
- module.exports={hull:require("./hull"),hullChain:require("./hullChain"),hullPoints2:require("./hullPoints2"),hullPoints3:require("./hullPoints3")};
1023
-
1024
- },{"./hull":334,"./hullChain":335,"./hullPoints2":339,"./hullPoints3":340}],342:[function(require,module,exports){
1025
- const add=require("../../../maths/vec3/add"),copy=require("../../../maths/vec3/copy"),cross=require("../../../maths/vec3/cross"),dot=require("../../../maths/vec3/dot"),length=require("../../../maths/vec3/length"),normalize=require("../../../maths/vec3/normalize"),scale=require("../../../maths/vec3/scale"),subtract=require("../../../maths/vec3/subtract"),HalfEdge=require("./HalfEdge"),VISIBLE=0,NON_CONVEX=1,DELETED=2;class Face{constructor(){this.normal=[],this.centroid=[],this.offset=0,this.outside=null,this.mark=VISIBLE,this.edge=null,this.nVertices=0}getEdge(e){if("number"!=typeof e)throw Error("requires a number");let t=this.edge;for(;e>0;)t=t.next,e-=1;for(;e<0;)t=t.prev,e+=1;return t}computeNormal(){const e=this.edge,t=e.next;let r=t.next;const s=subtract([],t.head().point,e.head().point),o=[],i=[];for(this.nVertices=2,this.normal=[0,0,0];r!==e;)copy(i,s),subtract(s,r.head().point,e.head().point),add(this.normal,this.normal,cross(o,i,s)),r=r.next,this.nVertices+=1;this.area=length(this.normal),this.normal=scale(this.normal,this.normal,1/this.area)}computeNormalMinArea(e){if(this.computeNormal(),this.area<e){let e,t=0,r=this.edge;do{const s=r.lengthSquared();s>t&&(e=r,t=s),r=r.next}while(r!==this.edge);const s=e.tail().point,o=e.head().point,i=subtract([],o,s),n=Math.sqrt(t);scale(i,i,1/n);const a=dot(this.normal,i);scale(i,i,-a),add(this.normal,this.normal,i),normalize(this.normal,this.normal)}}computeCentroid(){this.centroid=[0,0,0];let e=this.edge;do{add(this.centroid,this.centroid,e.head().point),e=e.next}while(e!==this.edge);scale(this.centroid,this.centroid,1/this.nVertices)}computeNormalAndCentroid(e){void 0!==e?this.computeNormalMinArea(e):this.computeNormal(),this.computeCentroid(),this.offset=dot(this.normal,this.centroid)}distanceToPlane(e){return dot(this.normal,e)-this.offset}connectHalfEdges(e,t){let r;if(e.opposite.face===t.opposite.face){const s=t.opposite.face;let o;e===this.edge&&(this.edge=t),3===s.nVertices?(o=t.opposite.prev.opposite,s.mark=DELETED,r=s):(o=t.opposite.next,s.edge===o.prev&&(s.edge=o),o.prev=o.prev.prev,o.prev.next=o),t.prev=e.prev,t.prev.next=t,t.setOpposite(o),s.computeNormalAndCentroid()}else e.next=t,t.prev=e;return r}mergeAdjacentFaces(e,t){const r=e.opposite,s=r.face;t.push(s),s.mark=DELETED;let o,i,n=e.prev,a=e.next,c=r.prev,h=r.next;for(;n.opposite.face===s;)n=n.prev,h=h.next;for(;a.opposite.face===s;)a=a.next,c=c.prev;for(o=h;o!==c.next;o=o.next)o.face=this;return this.edge=a,(i=this.connectHalfEdges(c,a))&&t.push(i),(i=this.connectHalfEdges(n,h))&&t.push(i),this.computeNormalAndCentroid(),t}collectIndices(){const e=[];let t=this.edge;do{e.push(t.head().index),t=t.next}while(t!==this.edge);return e}static createTriangle(e,t,r,s=0){const o=new Face,i=new HalfEdge(e,o),n=new HalfEdge(t,o),a=new HalfEdge(r,o);return i.next=a.prev=n,n.next=i.prev=a,a.next=n.prev=i,o.edge=i,o.computeNormalAndCentroid(s),o}}module.exports={VISIBLE:VISIBLE,NON_CONVEX:1,DELETED:DELETED,Face:Face};
1026
-
1027
- },{"../../../maths/vec3/add":209,"../../../maths/vec3/copy":212,"../../../maths/vec3/cross":214,"../../../maths/vec3/dot":217,"../../../maths/vec3/length":223,"../../../maths/vec3/normalize":229,"../../../maths/vec3/scale":234,"../../../maths/vec3/subtract":238,"./HalfEdge":343}],343:[function(require,module,exports){
1028
- const distance=require("../../../maths/vec3/distance"),squaredDistance=require("../../../maths/vec3/squaredDistance");class HalfEdge{constructor(t,e){this.vertex=t,this.face=e,this.next=null,this.prev=null,this.opposite=null}head(){return this.vertex}tail(){return this.prev?this.prev.vertex:null}length(){return this.tail()?distance(this.tail().point,this.head().point):-1}lengthSquared(){return this.tail()?squaredDistance(this.tail().point,this.head().point):-1}setOpposite(t){this.opposite=t,t.opposite=this}}module.exports=HalfEdge;
1029
-
1030
- },{"../../../maths/vec3/distance":215,"../../../maths/vec3/squaredDistance":236}],344:[function(require,module,exports){
1031
- const dot=require("../../../maths/vec3/dot"),pointLineDistance=require("./point-line-distance"),getPlaneNormal=require("./get-plane-normal"),VertexList=require("./VertexList"),Vertex=require("./Vertex"),{Face:Face,VISIBLE:VISIBLE,NON_CONVEX:NON_CONVEX,DELETED:DELETED}=require("./Face"),MERGE_NON_CONVEX_WRT_LARGER_FACE=1,MERGE_NON_CONVEX=2;class QuickHull{constructor(e){if(!Array.isArray(e))throw TypeError("input is not a valid array");if(e.length<4)throw Error("cannot build a simplex out of <4 points");this.tolerance=-1,this.nFaces=0,this.nPoints=e.length,this.faces=[],this.newFaces=[],this.claimed=new VertexList,this.unclaimed=new VertexList,this.vertices=[];for(let t=0;t<e.length;t+=1)this.vertices.push(new Vertex(e[t],t));this.discardedFaces=[],this.vertexPointIndices=[]}addVertexToFace(e,t){e.face=t,t.outside?this.claimed.insertBefore(t.outside,e):this.claimed.add(e),t.outside=e}removeVertexFromFace(e,t){e===t.outside&&(e.next&&e.next.face===t?t.outside=e.next:t.outside=null),this.claimed.remove(e)}removeAllVerticesFromFace(e){if(e.outside){let t=e.outside;for(;t.next&&t.next.face===e;)t=t.next;return this.claimed.removeChain(e.outside,t),t.next=null,e.outside}}deleteFaceVertices(e,t){const i=this.removeAllVerticesFromFace(e);if(i)if(t){let e;for(let s=i;s;s=e){e=s.next,t.distanceToPlane(s.point)>this.tolerance?this.addVertexToFace(s,t):this.unclaimed.add(s)}}else this.unclaimed.addAll(i)}resolveUnclaimedPoints(e){let t=this.unclaimed.first();for(let i=t;i;i=t){t=i.next;let s,o=this.tolerance;for(let t=0;t<e.length;t+=1){const a=e[t];if(a.mark===VISIBLE){const e=a.distanceToPlane(i.point);if(e>o&&(o=e,s=a),o>1e3*this.tolerance)break}}s&&this.addVertexToFace(i,s)}}computeExtremes(){const e=[],t=[],i=[],s=[];let o,a;for(o=0;o<3;o+=1)i[o]=s[o]=this.vertices[0];for(o=0;o<3;o+=1)e[o]=t[o]=this.vertices[0].point[o];for(o=1;o<this.vertices.length;o+=1){const c=this.vertices[o],n=c.point;for(a=0;a<3;a+=1)n[a]<e[a]&&(e[a]=n[a],i[a]=c);for(a=0;a<3;a+=1)n[a]>t[a]&&(t[a]=n[a],s[a]=c)}return this.tolerance=3*Number.EPSILON*(Math.max(Math.abs(e[0]),Math.abs(t[0]))+Math.max(Math.abs(e[1]),Math.abs(t[1]))+Math.max(Math.abs(e[2]),Math.abs(t[2]))),[i,s]}createInitialSimplex(){const e=this.vertices,[t,i]=this.computeExtremes();let s,o,a,c,n=0,r=0;for(a=0;a<3;a+=1){const e=i[a].point[a]-t[a].point[a];e>n&&(n=e,r=a)}const l=t[r],h=i[r];for(n=0,a=0;a<this.vertices.length;a+=1){const e=this.vertices[a];if(e!==l&&e!==h){const t=pointLineDistance(e.point,l.point,h.point);t>n&&(n=t,s=e)}}const d=getPlaneNormal([],l.point,h.point,s.point),p=dot(l.point,d);for(n=-1,a=0;a<this.vertices.length;a+=1){const e=this.vertices[a];if(e!==l&&e!==h&&e!==s){const t=Math.abs(dot(d,e.point)-p);t>n&&(n=t,o=e)}}const f=[];if(dot(o.point,d)-p<0)for(f.push(Face.createTriangle(l,h,s),Face.createTriangle(o,h,l),Face.createTriangle(o,s,h),Face.createTriangle(o,l,s)),a=0;a<3;a+=1){const e=(a+1)%3;f[a+1].getEdge(2).setOpposite(f[0].getEdge(e)),f[a+1].getEdge(1).setOpposite(f[e+1].getEdge(0))}else for(f.push(Face.createTriangle(l,s,h),Face.createTriangle(o,l,h),Face.createTriangle(o,h,s),Face.createTriangle(o,s,l)),a=0;a<3;a+=1){const e=(a+1)%3;f[a+1].getEdge(2).setOpposite(f[0].getEdge((3-a)%3)),f[a+1].getEdge(0).setOpposite(f[e+1].getEdge(1))}for(a=0;a<4;a+=1)this.faces.push(f[a]);for(a=0;a<e.length;a+=1){const t=e[a];if(t!==l&&t!==h&&t!==s&&t!==o){let e;for(n=this.tolerance,c=0;c<4;c+=1){const i=f[c].distanceToPlane(t.point);i>n&&(n=i,e=f[c])}e&&this.addVertexToFace(t,e)}}}reindexFaceAndVertices(){const e=[];for(let t=0;t<this.faces.length;t+=1){const i=this.faces[t];i.mark===VISIBLE&&e.push(i)}this.faces=e}collectFaces(e){const t=[];for(let i=0;i<this.faces.length;i+=1){if(this.faces[i].mark!==VISIBLE)throw Error("attempt to include a destroyed face in the hull");const s=this.faces[i].collectIndices();if(e)t.push(s);else for(let e=0;e<s.length-2;e+=1)t.push([s[0],s[e+1],s[e+2]])}return t}nextVertexToAdd(){if(!this.claimed.isEmpty()){let e,t,i=0;const s=this.claimed.first().face;for(t=s.outside;t&&t.face===s;t=t.next){const o=s.distanceToPlane(t.point);o>i&&(i=o,e=t)}return e}}computeHorizon(e,t,i,s){let o;this.deleteFaceVertices(i),i.mark=DELETED,o=t?t.next:t=i.getEdge(0);do{const t=o.opposite,i=t.face;i.mark===VISIBLE&&(i.distanceToPlane(e)>this.tolerance?this.computeHorizon(e,t,i,s):s.push(o)),o=o.next}while(o!==t)}addAdjoiningFace(e,t){const i=Face.createTriangle(e,t.tail(),t.head());return this.faces.push(i),i.getEdge(-1).setOpposite(t.opposite),i.getEdge(0)}addNewFaces(e,t){let i,s;this.newFaces=[];for(let o=0;o<t.length;o+=1){const a=t[o],c=this.addAdjoiningFace(e,a);i?c.next.setOpposite(s):i=c,this.newFaces.push(c.face),s=c}i.next.setOpposite(s)}oppositeFaceDistance(e){return e.face.distanceToPlane(e.opposite.face.centroid)}doAdjacentMerge(e,t){let i=e.edge,s=!0,o=0;do{if(o>=e.nVertices)throw Error("merge recursion limit exceeded");const a=i.opposite.face;let c=!1;if(t===MERGE_NON_CONVEX?(this.oppositeFaceDistance(i)>-this.tolerance||this.oppositeFaceDistance(i.opposite)>-this.tolerance)&&(c=!0):e.area>a.area?this.oppositeFaceDistance(i)>-this.tolerance?c=!0:this.oppositeFaceDistance(i.opposite)>-this.tolerance&&(s=!1):this.oppositeFaceDistance(i.opposite)>-this.tolerance?c=!0:this.oppositeFaceDistance(i)>-this.tolerance&&(s=!1),c){const t=e.mergeAdjacentFaces(i,[]);for(let i=0;i<t.length;i+=1)this.deleteFaceVertices(t[i],e);return!0}i=i.next,o+=1}while(i!==e.edge);return s||(e.mark=NON_CONVEX),!1}addVertexToHull(e){const t=[];this.unclaimed.clear(),this.removeVertexFromFace(e,e.face),this.computeHorizon(e.point,null,e.face,t),this.addNewFaces(e,t);for(let e=0;e<this.newFaces.length;e+=1){const t=this.newFaces[e];if(t.mark===VISIBLE)for(;this.doAdjacentMerge(t,MERGE_NON_CONVEX_WRT_LARGER_FACE););}for(let e=0;e<this.newFaces.length;e+=1){const t=this.newFaces[e];if(t.mark===NON_CONVEX)for(t.mark=VISIBLE;this.doAdjacentMerge(t,MERGE_NON_CONVEX););}this.resolveUnclaimedPoints(this.newFaces)}build(){let e;for(this.createInitialSimplex();e=this.nextVertexToAdd();)this.addVertexToHull(e);this.reindexFaceAndVertices()}}module.exports=QuickHull;
1032
-
1033
- },{"../../../maths/vec3/dot":217,"./Face":342,"./Vertex":345,"./VertexList":346,"./get-plane-normal":347,"./point-line-distance":349}],345:[function(require,module,exports){
1034
- class Vertex{constructor(t,e){this.point=t,this.index=e,this.next=null,this.prev=null,this.face=null}}module.exports=Vertex;
1035
-
1036
- },{}],346:[function(require,module,exports){
1037
- class VertexList{constructor(){this.head=null,this.tail=null}clear(){this.head=this.tail=null}insertBefore(e,t){t.prev=e.prev,t.next=e,t.prev?t.prev.next=t:this.head=t,e.prev=t}insertAfter(e,t){t.prev=e,t.next=e.next,t.next?t.next.prev=t:this.tail=t,e.next=t}add(e){this.head?this.tail.next=e:this.head=e,e.prev=this.tail,e.next=null,this.tail=e}addAll(e){for(this.head?this.tail.next=e:this.head=e,e.prev=this.tail;e.next;)e=e.next;this.tail=e}remove(e){e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev}removeChain(e,t){e.prev?e.prev.next=t.next:this.head=t.next,t.next?t.next.prev=e.prev:this.tail=e.prev}first(){return this.head}isEmpty(){return!this.head}}module.exports=VertexList;
1038
-
1039
- },{}],347:[function(require,module,exports){
1040
- const cross=require("../../../maths/vec3/cross"),normalize=require("../../../maths/vec3/normalize"),subtract=require("../../../maths/vec3/subtract"),planeNormal=(r,e,s,t)=>{const a=[0,0,0];return subtract(r,e,s),subtract(a,s,t),cross(r,r,a),normalize(r,r)};module.exports=planeNormal;
1041
-
1042
- },{"../../../maths/vec3/cross":214,"../../../maths/vec3/normalize":229,"../../../maths/vec3/subtract":238}],348:[function(require,module,exports){
1043
- const QuickHull=require("./QuickHull"),runner=(u,l={})=>{const e=new QuickHull(u);return e.build(),e.collectFaces(l.skipTriangulation)};module.exports=runner;
1044
-
1045
- },{"./QuickHull":344}],349:[function(require,module,exports){
1046
- const cross=require("../../../maths/vec3/cross"),subtract=require("../../../maths/vec3/subtract"),squaredLength=require("../../../maths/vec3/squaredLength"),distanceSquared=(e,t,r)=>{const s=[],a=[];subtract(s,r,t),subtract(a,e,t);const n=squaredLength(cross([],a,s)),c=squaredLength(s);if(0===c)throw Error("a and b are the same point");return n/c},pointLineDistance=(e,t,r)=>Math.sqrt(distanceSquared(e,t,r));module.exports=pointLineDistance;
1047
-
1048
- },{"../../../maths/vec3/cross":214,"../../../maths/vec3/squaredLength":237,"../../../maths/vec3/subtract":238}],350:[function(require,module,exports){
1049
- const geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),toUniquePoints=o=>{const e=new Set,t=[],r=o=>{const r=o.toString();e.has(r)||(t.push(o),e.add(r))};return o.forEach(o=>{geom2.isA(o)?geom2.toPoints(o).forEach(r):geom3.isA(o)?geom3.toPoints(o).forEach(o=>o.forEach(r)):path2.isA(o)&&path2.toPoints(o).forEach(r)}),t};module.exports=toUniquePoints;
1050
-
1051
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62}],351:[function(require,module,exports){
1052
- 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"),generalizePath2=(e,r)=>r,generalizeGeom2=(e,r)=>r,generalizeGeom3=(e,r)=>{const{snap:n,simplify:o,triangulate:t}=Object.assign({},{snap:!1,simplify:!1,triangulate:!1},e),i=measureEpsilon(r);let s=geom3.toPolygons(r);n&&(s=snapPolygons(i,s)),o&&(s=mergePolygons(i,s)),t&&(s=insertTjunctions(s),s=triangulatePolygons(i,s));const g=Object.assign({},r);return g.polygons=s,g},generalize=(e,...r)=>{if(0===(r=flatten(r)).length)throw new Error("wrong number of arguments");const n=r.map(r=>{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;
1053
-
1054
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../measurements/measureEpsilon":263,"../../utils/flatten":398,"./insertTjunctions":353,"./mergePolygons":354,"./snapPolygons":358,"./triangulatePolygons":359}],352:[function(require,module,exports){
1055
- module.exports={generalize:require("./generalize"),snap:require("./snap"),retessellate:require("./retessellate")};
1056
-
1057
- },{"./generalize":351,"./retessellate":356,"./snap":357}],353:[function(require,module,exports){
1058
- const constants=require("../../maths/constants"),vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),assert=!1,getTag=e=>`${e}`,addSide=(e,t,s,n,r,c)=>{const o=getTag(n),g=getTag(r);const l=`${o}/${g}`,a=`${g}/${o}`;if(e.has(a))return deleteSide(e,t,s,r,n,null),null;const i={vertex0:n,vertex1:r,polygonindex:c};return e.has(l)?e.get(l).push(i):e.set(l,[i]),t.has(o)?t.get(o).push(l):t.set(o,[l]),s.has(g)?s.get(g).push(l):s.set(g,[l]),l},deleteSide=(e,t,s,n,r,c)=>{const o=getTag(n),g=getTag(r),l=`${o}/${g}`;let a=-1;const i=e.get(l);for(let e=0;e<i.length;e++){const t=i[e];let s=getTag(t.vertex0);if(s===o&&((s=getTag(t.vertex1))===g&&(null===c||t.polygonindex===c))){a=e;break}}i.splice(a,1),0===i.length&&e.delete(l),a=t.get(o).indexOf(l),t.get(o).splice(a,1),0===t.get(o).length&&t.delete(o),a=s.get(g).indexOf(l),s.get(g).splice(a,1),0===s.get(g).length&&s.delete(g)},insertTjunctions=e=>{const t=new Map;for(let s=0;s<e.length;s++){const n=e[s],r=n.vertices.length;if(r>=3){let e=n.vertices[0],c=getTag(e);for(let o=0;o<r;o++){let g=o+1;g===r&&(g=0);const l=n.vertices[g],a=getTag(l),i=`${c}/${a}`,v=`${a}/${c}`;if(t.has(v)){const e=t.get(v);e.splice(-1,1),0===e.length&&t.delete(v)}else{const n={vertex0:e,vertex1:l,polygonindex:s};t.has(i)?t.get(i).push(n):t.set(i,[n])}e=l,c=a}}else console.warn("warning: invalid polygon found during insertTjunctions")}if(t.size>0){const s=new Map,n=new Map,r=new Map;for(const[e,c]of t)r.set(e,!0),c.forEach(t=>{const r=getTag(t.vertex0),c=getTag(t.vertex1);s.has(r)?s.get(r).push(e):s.set(r,[e]),n.has(c)?n.get(c).push(e):n.set(c,[e])});const c=e.slice(0);for(;0!==t.size;){for(const e of t.keys())r.set(e,!0);let e=!1;for(;;){const o=Array.from(r.keys());if(0===o.length)break;const g=o[0];let l=!0;if(t.has(g)){const o=t.get(g);0;const a=o[0];for(let o=0;o<2;o++){const g=0===o?a.vertex0:a.vertex1,i=0===o?a.vertex1:a.vertex0,v=getTag(g),d=getTag(i);let h=[];0===o?n.has(v)&&(h=n.get(v)):s.has(v)&&(h=s.get(v));for(let a=0;a<h.length;a++){const v=h[a],f=t.get(v)[0],u=0===o?f.vertex0:f.vertex1,x=0===o?f.vertex1:f.vertex0,p=getTag(u);getTag(x);if(p===d){deleteSide(t,s,n,g,i,null),deleteSide(t,s,n,i,g,null),l=!1,o=2,e=!0;break}{const a=g,v=i,d=u,h=vec3.subtract(vec3.create(),d,a),x=vec3.dot(vec3.subtract(vec3.create(),v,a),h)/vec3.dot(h,h);if(x>0&&x<1){const g=vec3.scale(vec3.create(),h,x);if(vec3.add(g,g,a),vec3.squaredDistance(g,v)<constants.EPS*constants.EPS){const g=f.polygonindex,a=c[g],v=getTag(f.vertex1);let d=-1;for(let e=0;e<a.vertices.length;e++)if(getTag(a.vertices[e])===v){d=e;break}0;const h=a.vertices.slice(0);h.splice(d,0,i);const u=poly3.create(h);c[g]=u,deleteSide(t,s,n,f.vertex0,f.vertex1,g);const x=addSide(t,s,n,f.vertex0,i,g),p=addSide(t,s,n,i,f.vertex1,g);null!==x&&r.set(x,!0),null!==p&&r.set(p,!0),l=!1,o=2,e=!0;break}}}}}}l&&r.delete(g)}if(!e)break}e=c}return t.clear(),e};module.exports=insertTjunctions;
1059
-
1060
- },{"../../geometries/poly3":79,"../../maths/constants":94,"../../maths/vec3":222}],354:[function(require,module,exports){
1061
- const aboutEqualNormals=require("../../maths/utils/aboutEqualNormals"),vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),createEdges=e=>{const n=poly3.toPoints(e),t=[];for(let e=0;e<n.length;e++){const l=(e+1)%n.length,r={v1:n[e],v2:n[l]};t.push(r)}for(let e=0;e<t.length;e++){const l=(e+1)%n.length;t[e].next=t[l],t[l].prev=t[e]}return t},insertEdge=(e,n)=>{const t=`${n.v1}:${n.v2}`;e.set(t,n)},deleteEdge=(e,n)=>{const t=`${n.v1}:${n.v2}`;e.delete(t)},findOppositeEdge=(e,n)=>{const t=`${n.v2}:${n.v1}`;return e.get(t)},calculateAnglesBetween=(e,n,t)=>{let l=e.prev.v1,r=e.prev.v2,o=n.next.v2;const v=calculateAngle(l,r,o,t);return l=n.prev.v1,r=n.prev.v2,o=e.next.v2,[v,calculateAngle(l,r,o,t)]},v1=vec3.create(),v2=vec3.create(),calculateAngle=(e,n,t,l)=>{const r=vec3.subtract(v1,n,e),o=vec3.subtract(v2,t,n);return vec3.cross(r,r,o),vec3.dot(r,l)},createPolygonAnd=e=>{let n;const t=[];for(;e.next;){const n=e.next;t.push(e.v1),e.v1=null,e.v2=null,e.next=null,e.prev=null,e=n}return t.length>0&&(n=poly3.create(t)),n},mergeCoplanarPolygons=e=>{if(e.length<2)return e;const n=e[0].plane,t=e.slice(),l=new Map;for(;t.length>0;){const e=t.shift(),r=createEdges(e);for(let e=0;e<r.length;e++){const t=r[e],o=findOppositeEdge(l,t);if(o){const e=calculateAnglesBetween(t,o,n);if(e[0]>=0&&e[1]>=0){const n=o.next,r=t.next;t.prev.next=o.next,t.next.prev=o.prev,o.prev.next=t.next,o.next.prev=t.prev,t.v1=null,t.v2=null,t.next=null,t.prev=null,deleteEdge(l,o),o.v1=null,o.v2=null,o.next=null,o.prev=null;const v=(e,n,t)=>{const l={v1:t.v1,v2:n.v2,next:n.next,prev:t.prev};t.prev.next=l,n.next.prev=l,deleteEdge(e,n),n.v1=null,n.v2=null,n.next=null,n.prev=null,deleteEdge(e,t),t.v1=null,t.v2=null,t.next=null,t.prev=null};0===e[0]&&v(l,n,n.prev),0===e[1]&&v(l,r,r.prev)}}else t.next&&insertEdge(l,t)}}const r=[];return l.forEach(e=>{const n=createPolygonAnd(e);n&&r.push(n)}),l.clear(),r},coplanar=(e,n)=>Math.abs(e[3]-n[3])<1.5e-7&&aboutEqualNormals(e,n),mergePolygons=(e,n)=>{const t=[];n.forEach(e=>{const n=t.find(n=>coplanar(n[0],poly3.plane(e)));if(n){n[1].push(e)}else t.push([poly3.plane(e),[e]])});let l=[];return t.forEach(e=>{const n=e[1],t=mergeCoplanarPolygons(n);l=l.concat(t)}),l};module.exports=mergePolygons;
1062
-
1063
- },{"../../geometries/poly3":79,"../../maths/utils/aboutEqualNormals":167,"../../maths/vec3":222}],355:[function(require,module,exports){
1064
- 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=new Map,f=new Map,p=new Map,h=10/EPS;for(let e=0;e<o;e++){const o=t[e];let n=[],g=o.vertices.length,c=-1;if(g>0){let t,i;for(let r=0;r<g;r++){let s=l.to2D(o.vertices[r]);const g=Math.floor(s[1]*h);let a;p.has(g)?a=p.get(g):p.has(g+1)?a=p.get(g+1):p.has(g-1)?a=p.get(g-1):(a=s[1],p.set(g,s[1])),s=vec2.fromValues(s[0],a),n.push(s);const u=s[1];(0===r||u<t)&&(t=u,c=r),(0===r||u>i)&&(i=u);let m=f.get(u);m||(m={},f.set(u,m)),m[e]=!0}if(t>=i)n=[],g=0,c=-1;else{let o=s.get(t);o||(o=[],s.set(t,o)),o.push(e)}}n.reverse(),c=g-c-1,i.push(n),r.push(c)}const g=[];f.forEach((t,e)=>g.push(e)),g.sort(fnNumberSort);let c=[],a=[];for(let t=0;t<g.length;t++){const o=[],p=g[t],h=f.get(p);for(let t=0;t<c.length;++t){const e=c[t],o=e.polygonindex;if(h[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]!==p)break;r=t}let f=s-1;if(f<0&&(f=l-1),n[f][1]===p&&(s=f),r!==e.leftvertexindex&&r===s)c.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 u;if(t>=g.length-1)c=[],u=null;else{const e=.5*(p+(u=Number(g[t+1]))),o=s.get(p);for(const t in o){const n=o[t],l=i[n],s=l.length,f=r[n];let h=f;for(;;){let t=h+1;if(t>=s&&(t=0),l[t][1]!==p)break;if(t===f)break;h=t}let g=f;for(;;){let t=g-1;if(t<0&&(t=s-1),l[t][1]!==p)break;if(t===h)break;g=t}let a=h+1;a>=s&&(a=0);let u=g-1;u<0&&(u=s-1);const m={polygonindex:n,leftvertexindex:h,rightvertexindex:g,topleft:l[h],topright:l[g],bottomleft:l[a],bottomright:l[u]};insertSorted(c,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 c){const e=c[t];let n=interpolateBetween2DPointsForY(e.topleft,e.bottomleft,p);const l=vec2.fromValues(n,p);n=interpolateBetween2DPointsForY(e.topright,e.bottomright,p);const i=vec2.fromValues(n,p);n=interpolateBetween2DPointsForY(e.topleft,e.bottomleft,u);const r=vec2.fromValues(n,u);n=interpolateBetween2DPointsForY(e.topright,e.bottomright,u);const s=vec2.fromValues(n,u),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=new Set,i=new Set;for(let e=0;e<o.length;e++){const n=o[e];for(let e=0;e<a.length;e++)if(!i.has(e)){const o=a[e];if(vec2.distance(o.bottomleft,n.topleft)<EPS&&vec2.distance(o.bottomright,n.topright)<EPS){i.add(e);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],g=Math.abs(s)<EPS,c=Math.abs(h)<EPS,a=c||h>=0;(g||s>=0)&&a&&(n.outpolygon=o.outpolygon,n.leftlinecontinues=g,n.rightlinecontinues=c,t.add(e));break}}}for(let o=0;o<a.length;o++)if(!t.has(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;
1065
-
1066
- },{"../../geometries/poly3":79,"../../maths/OrthoNormalBasis":93,"../../maths/constants":94,"../../maths/line2":105,"../../maths/utils/interpolateBetween2DPointsForY":170,"../../maths/vec2":191,"../../utils":400}],356:[function(require,module,exports){
1067
- const geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),{NEPS:NEPS}=require("../../maths/constants"),reTesselateCoplanarPolygons=require("./reTesselateCoplanarPolygons"),retessellate=e=>{if(e.isRetesselated)return e;const s=geom3.toPolygons(e).map((e,s)=>({vertices:e.vertices,plane:poly3.plane(e),index:s})),o=classifyPolygons(s),l=[];o.forEach(e=>{if(Array.isArray(e)){const s=reTesselateCoplanarPolygons(e);l.push(...s)}else l.push(e)});const n=geom3.create(l);return n.isRetesselated=!0,n},classifyPolygons=e=>{let s=[e];const o=[];for(let e=3;e>=0;e--){const l=[],n=3===e?1.5e-8:NEPS;s.forEach(s=>{s.sort(byPlaneComponent(e,n));let t=0;for(let r=1;r<s.length;r++)s[r].plane[e]-s[t].plane[e]>n&&(r-t==1?o.push(s[t]):l.push(s.slice(t,r)),t=r);s.length-t==1?o.push(s[t]):l.push(s.slice(t))}),s=l}const l=[];return s.forEach(e=>{e[0]&&(l[e[0].index]=e)}),o.forEach(e=>{l[e.index]=e}),l},byPlaneComponent=(e,s)=>(o,l)=>o.plane[e]-l.plane[e]>s?1:l.plane[e]-o.plane[e]>s?-1:0;module.exports=retessellate;
1068
-
1069
- },{"../../geometries/geom3":41,"../../geometries/poly3":79,"../../maths/constants":94,"./reTesselateCoplanarPolygons":355}],357:[function(require,module,exports){
1070
- 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;
1071
-
1072
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../maths/vec2":191,"../../measurements/measureEpsilon":263,"../../utils/flatten":398,"./snapPolygons":358}],358:[function(require,module,exports){
1073
- 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;
1074
-
1075
- },{"../../geometries/poly3":79,"../../maths/vec3":222}],359:[function(require,module,exports){
1076
- const vec3=require("../../maths/vec3"),poly3=require("../../geometries/poly3"),triangulatePolygon=(e,o,r)=>{const t=o.vertices.length;if(t>3){if(t>4){const c=[0,0,0];o.vertices.forEach(e=>vec3.add(c,c,e)),vec3.snap(c,vec3.divide(c,c,[t,t,t]),e);for(let e=0;e<t;e++){const s=poly3.create([c,o.vertices[e],o.vertices[(e+1)%t]]);o.color&&(s.color=o.color),r.push(s)}return}const c=poly3.create([o.vertices[0],o.vertices[1],o.vertices[2]]),s=poly3.create([o.vertices[0],o.vertices[2],o.vertices[3]]);return o.color&&(c.color=o.color,s.color=o.color),void r.push(c,s)}r.push(o)},triangulatePolygons=(e,o)=>{const r=[];return o.forEach(o=>{triangulatePolygon(e,o,r)}),r};module.exports=triangulatePolygons;
1077
-
1078
- },{"../../geometries/poly3":79,"../../maths/vec3":222}],360:[function(require,module,exports){
1079
- 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;
1080
-
1081
- },{"../../measurements/measureAggregateBoundingBox":254,"../../utils/flatten":398,"../../utils/padArrayToLength":402,"./translate":367}],361:[function(require,module,exports){
1082
- 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};
1083
-
1084
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../measurements/measureBoundingBox":258,"../../utils/flatten":398,"./translate":367}],362:[function(require,module,exports){
1085
- 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};
1086
-
1087
- },{"./align":360,"./center":361,"./mirror":363,"./rotate":364,"./scale":365,"./transform":366,"./translate":367}],363:[function(require,module,exports){
1088
- 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};
1089
-
1090
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../maths/mat4":143,"../../maths/plane":163,"../../utils/flatten":398}],364:[function(require,module,exports){
1091
- 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};
1092
-
1093
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../maths/mat4":143,"../../utils/flatten":398}],365:[function(require,module,exports){
1094
- 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};
1095
-
1096
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../maths/mat4":143,"../../utils/flatten":398}],366:[function(require,module,exports){
1097
- 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;
1098
-
1099
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../utils/flatten":398}],367:[function(require,module,exports){
1100
- 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};
1101
-
1102
- },{"../../geometries/geom2":25,"../../geometries/geom3":41,"../../geometries/path2":62,"../../maths/mat4":143,"../../utils/flatten":398}],368:[function(require,module,exports){
1103
- const{EPS:EPS,TAU:TAU}=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:TAU,makeTangent:!1,segments:32};let{center:t,radius:s,startAngle:n,endAngle:a,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(n,0))throw new Error("startAngle must be positive");if(!isGTE(a,0))throw new Error("endAngle must be positive");if(!isGTE(c,4))throw new Error("segments must be four or more");let i=TAU;(n%=TAU)<(a%=TAU)&&(i=a-n),n>a&&(i=a+(TAU-n));const m=Math.acos((s*s+s*s-EPS*EPS)/(2*s*s)),l=vec2.clone(t);let u;const A=[];if(i<m)u=vec2.fromAngleRadians(vec2.create(),n),vec2.scale(u,u,s),vec2.add(u,u,l),A.push(u);else{const e=Math.max(1,Math.floor(c*(i/TAU)))+1;let r=.5*e/i;r>.25&&(r=.25);const t=o?e+2:e;for(let a=0;a<=t;a++){let t=a;o&&((t=(a-1)*(e-2*r)/e+r)<0&&(t=0),t>e&&(t=e));const c=n+t*(i/e);u=vec2.fromAngleRadians(vec2.create(),c),vec2.scale(u,u,s),vec2.add(u,u,l),A.push(u)}}return path2.fromPoints({closed:!1},A)};module.exports=arc;
1104
-
1105
- },{"../geometries/path2":62,"../maths/constants":94,"../maths/vec2":191,"./commonChecks":370}],369:[function(require,module,exports){
1106
- const{TAU:TAU}=require("../maths/constants"),ellipse=require("./ellipse"),{isGTE:isGTE}=require("./commonChecks"),circle=e=>{const s={center:[0,0],radius:1,startAngle:0,endAngle:TAU,segments:32};let{center:r,radius:t,startAngle:n,endAngle:i,segments:l}=Object.assign({},s,e);if(!isGTE(t,0))throw new Error("radius must be positive");return ellipse({center:r,radius:t=[t,t],startAngle:n,endAngle:i,segments:l})};module.exports=circle;
1107
-
1108
- },{"../maths/constants":94,"./commonChecks":370,"./ellipse":375}],370:[function(require,module,exports){
1109
- const isNumberArray=(i,r)=>!!(Array.isArray(i)&&i.length>=r)&&i.every(i=>Number.isFinite(i)),isGT=(i,r)=>Number.isFinite(i)&&i>r,isGTE=(i,r)=>Number.isFinite(i)&&i>=r;module.exports={isNumberArray:isNumberArray,isGT:isGT,isGTE:isGTE};
1110
-
1111
- },{}],371:[function(require,module,exports){
1112
- const cuboid=require("./cuboid"),{isGTE:isGTE}=require("./commonChecks"),cube=e=>{let{center:i,size:r}=Object.assign({},{center:[0,0,0],size:2},e);if(!isGTE(r,0))throw new Error("size must be positive");return cuboid({center:i,size:r=[r,r,r]})};module.exports=cube;
1113
-
1114
- },{"./commonChecks":370,"./cuboid":372}],372:[function(require,module,exports){
1115
- const geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{isNumberArray:isNumberArray}=require("./commonChecks"),cuboid=e=>{const{center:r,size:o}=Object.assign({},{center:[0,0,0],size:[2,2,2]},e);if(!isNumberArray(r,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(o,3))throw new Error("size must be an array of width, depth and height values");if(!o.every(e=>e>=0))throw new Error("size values must be positive");return 0===o[0]||0===o[1]||0===o[2]?geom3.create():geom3.create([[[0,4,6,2],[-1,0,0]],[[1,3,7,5],[1,0,0]],[[0,1,5,4],[0,-1,0]],[[2,6,7,3],[0,1,0]],[[0,2,3,1],[0,0,-1]],[[4,5,7,6],[0,0,1]]].map(e=>{const t=e[0].map(e=>{return[r[0]+o[0]/2*(2*!!(1&e)-1),r[1]+o[1]/2*(2*!!(2&e)-1),r[2]+o[2]/2*(2*!!(4&e)-1)]});return poly3.create(t)}))};module.exports=cuboid;
1116
-
1117
- },{"../geometries/geom3":41,"../geometries/poly3":79,"./commonChecks":370}],373:[function(require,module,exports){
1118
- const geom3=require("../geometries/geom3"),cylinderElliptic=require("./cylinderElliptic"),{isGTE:isGTE}=require("./commonChecks"),cylinder=e=>{const{center:i,height:r,radius:s,segments:t}=Object.assign({},{center:[0,0,0],height:2,radius:1,segments:32},e);if(!isGTE(s,0))throw new Error("radius must be positive");return 0===r||0===s?geom3.create():cylinderElliptic({center:i,height:r,startRadius:[s,s],endRadius:[s,s],segments:t})};module.exports=cylinder;
1119
-
1120
- },{"../geometries/geom3":41,"./commonChecks":370,"./cylinderElliptic":374}],374:[function(require,module,exports){
1121
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),cylinderElliptic=e=>{const r={center:[0,0,0],height:2,startRadius:[1,1],startAngle:0,endRadius:[1,1],endAngle:TAU,segments:32};let{center:s,height:t,startRadius:a,startAngle:i,endRadius:o,endAngle:n,segments:u}=Object.assign({},r,e);if(!isNumberArray(s,3))throw new Error("center must be an array of X, Y and Z values");if(!isGT(t,0))throw new Error("height must be greater then zero");if(!isNumberArray(a,2))throw new Error("startRadius must be an array of X and Y values");if(!a.every(e=>e>=0))throw new Error("startRadius values must be positive");if(!isNumberArray(o,2))throw new Error("endRadius must be an array of X and Y values");if(!o.every(e=>e>=0))throw new Error("endRadius values must be positive");if(o.every(e=>0===e)&&a.every(e=>0===e))throw new Error("at least one radius must be positive");if(!isGTE(i,0))throw new Error("startAngle must be positive");if(!isGTE(n,0))throw new Error("endAngle must be positive");if(!isGTE(u,4))throw new Error("segments must be four or more");let c=TAU;(i%=TAU)<(n%=TAU)&&(c=n-i),i>n&&(c=n+(TAU-i));const l=Math.min(a[0],a[1],o[0],o[1]),m=Math.acos((l*l+l*l-EPS*EPS)/(2*l*l));if(c<m)throw new Error("startAngle and endAngle do not define a significant rotation");const h=Math.floor(u*(c/TAU)),d=vec3.fromValues(0,0,-t/2),v=vec3.fromValues(0,0,t/2),f=vec3.subtract(vec3.create(),v,d),g=vec3.fromValues(1,0,0),p=vec3.fromValues(0,1,0),A=vec3.create(),w=vec3.create(),E=vec3.create(),y=(e,r,s)=>{const t=r*c+i;return vec3.scale(A,g,s[0]*cos(t)),vec3.scale(w,p,s[1]*sin(t)),vec3.add(A,A,w),vec3.scale(E,f,e),vec3.add(E,E,d),vec3.add(vec3.create(),A,E)},T=(...e)=>{const r=e.map(e=>vec3.add(vec3.create(),e,s));return poly3.create(r)},b=[];for(let e=0;e<h;e++){const r=e/h;let s=(e+1)/h;c===TAU&&e===h-1&&(s=0),o[0]===a[0]&&o[1]===a[1]?(b.push(T(d,y(0,s,o),y(0,r,o))),b.push(T(y(0,s,o),y(1,s,o),y(1,r,o),y(0,r,o))),b.push(T(v,y(1,r,o),y(1,s,o)))):(a[0]>0&&a[1]>0&&b.push(T(d,y(0,s,a),y(0,r,a))),(a[0]>0||a[1]>0)&&b.push(T(y(0,r,a),y(0,s,a),y(1,r,o))),o[0]>0&&o[1]>0&&b.push(T(v,y(1,r,o),y(1,s,o))),(o[0]>0||o[1]>0)&&b.push(T(y(1,r,o),y(0,s,a),y(1,s,o))))}return c<TAU&&(b.push(T(d,y(0,0,a),v)),b.push(T(y(0,0,a),y(1,0,o),v)),b.push(T(d,v,y(0,1,a))),b.push(T(y(0,1,a),v,y(1,1,o)))),geom3.create(b)};module.exports=cylinderElliptic;
1122
-
1123
- },{"../geometries/geom3":41,"../geometries/poly3":79,"../maths/constants":94,"../maths/utils/trigonometry":173,"../maths/vec3":222,"./commonChecks":370}],375:[function(require,module,exports){
1124
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),ellipse=e=>{const r={center:[0,0],radius:[1,1],startAngle:0,endAngle:TAU,segments:32};let{center:s,radius:t,startAngle:n,endAngle:o,segments:i}=Object.assign({},r,e);if(!isNumberArray(s,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("radius must be an array of X and Y values");if(!t.every(e=>e>=0))throw new Error("radius values must be positive");if(!isGTE(n,0))throw new Error("startAngle must be positive");if(!isGTE(o,0))throw new Error("endAngle must be positive");if(!isGTE(i,3))throw new Error("segments must be three or more");if(0===t[0]||0===t[1])return geom2.create();let a=TAU;(n%=TAU)<(o%=TAU)&&(a=o-n),n>o&&(a=o+(TAU-n));const m=Math.min(t[0],t[1]);if(a<Math.acos((m*m+m*m-EPS*EPS)/(2*m*m)))throw new Error("startAngle and endAngle do not define a significant rotation");i=Math.floor(i*(a/TAU));const u=vec2.clone(s),c=a/i,l=[];i=a<TAU?i+1:i;for(let e=0;e<i;e++){const r=c*e+n,s=vec2.fromValues(t[0]*cos(r),t[1]*sin(r));vec2.add(s,u,s),l.push(s)}return a<TAU&&l.push(u),geom2.fromPoints(l)};module.exports=ellipse;
1125
-
1126
- },{"../geometries/geom2":25,"../maths/constants":94,"../maths/utils/trigonometry":173,"../maths/vec2":191,"./commonChecks":370}],376:[function(require,module,exports){
1127
- const{TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),ellipsoid=e=>{const{center:c,radius:r,segments:s,axes:a}=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(r,3))throw new Error("radius must be an array of X, Y and Z values");if(!r.every(e=>e>=0))throw new Error("radius values must be positive");if(!isGTE(s,4))throw new Error("segments must be four or more");if(0===r[0]||0===r[1]||0===r[2])return geom3.create();const t=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),a[0]),r[0]),v=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),a[1]),r[1]),o=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),a[2]),r[2]),i=Math.round(s/4);let l;const u=[],d=vec3.create(),n=vec3.create();for(let e=0;e<=s;e++){const r=TAU*e/s,a=vec3.add(vec3.create(),vec3.scale(d,t,cos(r)),vec3.scale(n,v,sin(r)));if(e>0){let e,r;for(let s=0;s<=i;s++){const t=TAU/4*s/i,v=cos(t),m=sin(t);if(s>0){let t,h=[];t=vec3.subtract(vec3.create(),vec3.scale(d,l,e),vec3.scale(n,o,r)),h.push(vec3.add(t,t,c)),t=vec3.subtract(vec3.create(),vec3.scale(d,a,e),vec3.scale(n,o,r)),h.push(vec3.add(t,t,c)),s<i&&(t=vec3.subtract(vec3.create(),vec3.scale(d,a,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c))),t=vec3.subtract(vec3.create(),vec3.scale(d,l,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c)),u.push(poly3.create(h)),h=[],t=vec3.add(vec3.create(),vec3.scale(d,l,e),vec3.scale(n,o,r)),h.push(vec3.add(vec3.create(),c,t)),t=vec3.add(t,vec3.scale(d,a,e),vec3.scale(n,o,r)),h.push(vec3.add(vec3.create(),c,t)),s<i&&(t=vec3.add(t,vec3.scale(d,a,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t))),t=vec3.add(t,vec3.scale(d,l,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t)),h.reverse(),u.push(poly3.create(h))}e=v,r=m}}l=a}return geom3.create(u)};module.exports=ellipsoid;
1128
-
1129
- },{"../geometries/geom3":41,"../geometries/poly3":79,"../maths/constants":94,"../maths/utils/trigonometry":173,"../maths/vec3":222,"./commonChecks":370}],377:[function(require,module,exports){
1130
- const mat4=require("../maths/mat4"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),polyhedron=require("./polyhedron"),{isGTE:isGTE}=require("./commonChecks"),geodesicSphere=e=>{let{radius:r,frequency:t}=Object.assign({},{radius:1,frequency:6},e);if(!isGTE(r,0))throw new Error("radius must be positive");if(!isGTE(t,6))throw new Error("frequency must be six or more");if(0===r)return geom3.create();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 f=[],l=[];for(let e=0;e<r;e++)for(let t=0;t<r-e;t++){const a=e/r,u=(e+1)/r,m=t/(r-e),h=(t+1)/(r-e),g=r-e-1?t/(r-e-1):1,p=[];p[0]=i(i(o,s,m),n,a),p[1]=i(i(o,s,h),n,a),p[2]=i(i(o,s,g),n,u);for(let e=0;e<3;e++){const r=vec3.length(p[e]);for(let t=0;t<3;t++)p[e][t]/=r}if(f.push(p[0],p[1],p[2]),l.push([c,c+1,c+2]),c+=3,t<r-e-1){const m=r-e-1?(t+1)/(r-e-1):1;p[0]=i(i(o,s,h),n,a),p[1]=i(i(o,s,m),n,u),p[2]=i(i(o,s,g),n,u);for(let e=0;e<3;e++){const r=vec3.length(p[e]);for(let t=0;t<3;t++)p[e][t]/=r}f.push(p[0],p[1],p[2]),l.push([c,c+1,c+2]),c+=3}}return{points:f,triangles:l,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=[],f=[],l=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,l);c=c.concat(r.points),f=f.concat(r.triangles),l=r.offset}let a=polyhedron({points:c,faces:f,orientation:"inward"});return 1!==r&&(a=geom3.transform(mat4.fromScaling(mat4.create(),[r,r,r]),a)),a};module.exports=geodesicSphere;
1131
-
1132
- },{"../geometries/geom3":41,"../maths/mat4":143,"../maths/vec3":222,"./commonChecks":370,"./polyhedron":381}],378:[function(require,module,exports){
1133
- 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")};
1134
-
1135
- },{"./arc":368,"./circle":369,"./cube":371,"./cuboid":372,"./cylinder":373,"./cylinderElliptic":374,"./ellipse":375,"./ellipsoid":376,"./geodesicSphere":377,"./line":379,"./polygon":380,"./polyhedron":381,"./rectangle":382,"./roundedCuboid":383,"./roundedCylinder":384,"./roundedRectangle":385,"./sphere":386,"./square":387,"./star":388,"./torus":389,"./triangle":390}],379:[function(require,module,exports){
1136
- 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;
1137
-
1138
- },{"../geometries/path2":62}],380:[function(require,module,exports){
1139
- const geom2=require("../geometries/geom2"),polygon=r=>{const{points:o,paths:t,orientation:e}=Object.assign({},{points:[],paths:[],orientation:"counterclockwise"},r);if(!Array.isArray(o)||!Array.isArray(t))throw new Error("points and paths must be arrays");let s=o;Array.isArray(o[0])&&(Array.isArray(o[0][0])||(s=[o])),s.forEach((r,o)=>{if(!Array.isArray(r))throw new Error("list of points "+o+" must be an array");if(r.length<3)throw new Error("list of points "+o+" must contain three or more points");r.forEach((r,t)=>{if(!Array.isArray(r))throw new Error("list of points "+o+", point "+t+" must be an array");if(r.length<2)throw new Error("list of points "+o+", point "+t+" must contain by X and Y values")})});let a=t;if(0===t.length){let r=0;a=s.map(o=>o.map(o=>r++))}const n=[];s.forEach(r=>r.forEach(r=>n.push(r)));let i=[];a.forEach(r=>{const o=r.map(r=>n[r]),t=geom2.fromPoints(o);i=i.concat(geom2.toSides(t))});let c=geom2.create(i);return"clockwise"===e&&(c=geom2.reverse(c)),c};module.exports=polygon;
1140
-
1141
- },{"../geometries/geom2":25}],381:[function(require,module,exports){
1142
- const geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{isNumberArray:isNumberArray}=require("./commonChecks"),polyhedron=r=>{const e={points:[],faces:[],colors:void 0,orientation:"outward"},{points:o,faces:a,colors:t,orientation:n}=Object.assign({},e,r);if(!Array.isArray(o)||!Array.isArray(a))throw new Error("points and faces must be arrays");if(o.length<3)throw new Error("three or more points are required");if(a.length<1)throw new Error("one or more faces are required");if(t){if(!Array.isArray(t))throw new Error("colors must be an array");if(t.length!==a.length)throw new Error("faces and colors must have the same length")}o.forEach((r,e)=>{if(!isNumberArray(r,3))throw new Error(`point ${e} must be an array of X, Y, Z values`)}),a.forEach((r,e)=>{if(r.length<3)throw new Error(`face ${e} must contain 3 or more indexes`);if(!isNumberArray(r,r.length))throw new Error(`face ${e} must be an array of numbers`)}),"outward"!==n&&a.forEach(r=>r.reverse());const s=a.map((r,e)=>{const a=poly3.create(r.map(r=>o[r]));return t&&t[e]&&(a.color=t[e]),a});return geom3.create(s)};module.exports=polyhedron;
1143
-
1144
- },{"../geometries/geom3":41,"../geometries/poly3":79,"./commonChecks":370}],382:[function(require,module,exports){
1145
- const vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isNumberArray:isNumberArray}=require("./commonChecks"),rectangle=e=>{const{center:r,size:t}=Object.assign({},{center:[0,0],size:[2,2]},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("size must be an array of X and Y values");if(!t.every(e=>e>=0))throw new Error("size values must be positive");if(0===t[0]||0===t[1])return geom2.create();const a=[t[0]/2,t[1]/2],c=[a[0],-a[1]],s=[vec2.subtract(vec2.create(),r,a),vec2.add(vec2.create(),r,c),vec2.add(vec2.create(),r,a),vec2.subtract(vec2.create(),r,c)];return geom2.fromPoints(s)};module.exports=rectangle;
1146
-
1147
- },{"../geometries/geom2":25,"../maths/vec2":191,"./commonChecks":370}],383:[function(require,module,exports){
1148
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),cuboid=require("./cuboid"),createCorners=(e,r,t,s,c,o)=>{const a=TAU/4*c/s,n=cos(a),i=sin(a),u=s-c;let l=t*n,h=r[2]-(t-t*i);o||(h=t-t*i-r[2]),l=l>EPS?l:0;const d=vec3.add(vec3.create(),e,[r[0]-t,r[1]-t,h]),v=vec3.add(vec3.create(),e,[t-r[0],r[1]-t,h]),m=vec3.add(vec3.create(),e,[t-r[0],t-r[1],h]),p=vec3.add(vec3.create(),e,[r[0]-t,t-r[1],h]),f=[],g=[],E=[],b=[];for(let e=0;e<=u;e++){const r=u>0?TAU/4*e/u:0,t=vec2.fromAngleRadians(vec2.create(),r);vec2.scale(t,t,l);const s=vec3.fromVec2(vec3.create(),t);f.push(vec3.add(vec3.create(),d,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),g.push(vec3.add(vec3.create(),v,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),E.push(vec3.add(vec3.create(),m,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),b.push(vec3.add(vec3.create(),p,s))}return o?[f,g,E,b]:(f.reverse(),g.reverse(),E.reverse(),b.reverse(),[b,E,g,f])},stitchCorners=(e,r)=>{const t=[];for(let s=0;s<e.length;s++){const c=e[s],o=r[s];for(let e=0;e<c.length-1;e++)t.push(poly3.create([c[e],c[e+1],o[e]])),e<o.length-1&&t.push(poly3.create([o[e],c[e+1],o[e+1]]))}return t},stitchWalls=(e,r)=>{const t=[];for(let s=0;s<e.length;s++){let c=e[s],o=r[s];const a=c[c.length-1],n=o[o.length-1],i=(s+1)%e.length;c=e[i],o=r[i];const u=c[0],l=o[0];t.push(poly3.create([a,u,l,n]))}return t},stitchSides=(e,r)=>{e=(e=[e[3],e[2],e[1],e[0]]).map(e=>e.slice().reverse());const t=[];e.forEach(e=>{e.forEach(e=>t.push(e))});const s=[];r.forEach(e=>{e.forEach(e=>s.push(e))});const c=[];for(let e=0;e<s.length;e++){const r=(e+1)%s.length;c.push(poly3.create([t[e],t[r],s[r],s[e]]))}return c},roundedCuboid=e=>{let{center:r,size:t,roundRadius:s,segments:c}=Object.assign({},{center:[0,0,0],size:[2,2,2],roundRadius:.2,segments:32},e);if(!isNumberArray(r,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(t,3))throw new Error("size must be an array of X, Y and Z values");if(!t.every(e=>e>=0))throw new Error("size values must be positive");if(!isGTE(s,0))throw new Error("roundRadius must be positive");if(!isGTE(c,4))throw new Error("segments must be four or more");if(0===t[0]||0===t[1]||0===t[2])return geom3.create();if(0===s)return cuboid({center:r,size:t});if(s>(t=t.map(e=>e/2))[0]-EPS||s>t[1]-EPS||s>t[2]-EPS)throw new Error("roundRadius must be smaller than the radius of all dimensions");c=Math.floor(c/4);let o=null,a=null,n=[];for(let e=0;e<=c;e++){const i=createCorners(r,t,s,c,e,!0),u=createCorners(r,t,s,c,e,!1);if(0===e&&(n=n.concat(stitchSides(u,i))),o&&(n=n.concat(stitchCorners(o,i),stitchWalls(o,i))),a&&(n=n.concat(stitchCorners(a,u),stitchWalls(a,u))),e===c){let e=i.map(e=>e[0]);n.push(poly3.create(e)),e=u.map(e=>e[0]),n.push(poly3.create(e))}o=i,a=u}return geom3.create(n)};module.exports=roundedCuboid;
1149
-
1150
- },{"../geometries/geom3":41,"../geometries/poly3":79,"../maths/constants":94,"../maths/utils/trigonometry":173,"../maths/vec2":191,"../maths/vec3":222,"./commonChecks":370,"./cuboid":372}],384:[function(require,module,exports){
1151
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),cylinder=require("./cylinder"),roundedCylinder=e=>{const{center:c,height:r,radius:s,roundRadius:a,segments:t}=Object.assign({},{center:[0,0,0],height:2,radius:1,roundRadius:.2,segments:32},e);if(!isNumberArray(c,3))throw new Error("center must be an array of X, Y and Z values");if(!isGTE(r,0))throw new Error("height must be positive");if(!isGTE(s,0))throw new Error("radius must be positive");if(!isGTE(a,0))throw new Error("roundRadius must be positive");if(a>s)throw new Error("roundRadius must be smaller than the radius");if(!isGTE(t,4))throw new Error("segments must be four or more");if(0===r||0===s)return geom3.create();if(0===a)return cylinder({center:c,height:r,radius:s});const v=[0,0,-r/2],o=[0,0,r/2],i=vec3.subtract(vec3.create(),o,v);if(2*a>vec3.length(i)-EPS)throw new Error("height must be larger than twice roundRadius");let u;u=Math.abs(i[0])>Math.abs(i[1])?vec3.fromValues(0,1,0):vec3.fromValues(1,0,0);const d=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),i),a),n=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),vec3.cross(vec3.create(),d,u)),s),l=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),vec3.cross(vec3.create(),n,d)),s);vec3.add(v,v,d),vec3.subtract(o,o,d);const h=Math.floor(.25*t),m=e=>{const r=e.map(e=>vec3.add(e,e,c));return poly3.create(r)},p=[],b=vec3.create(),f=vec3.create();let g;for(let e=0;e<=t;e++){const c=TAU*e/t,r=vec3.add(vec3.create(),vec3.scale(b,n,cos(c)),vec3.scale(f,l,sin(c)));if(e>0){let e,c,s=[];s.push(vec3.add(vec3.create(),v,r)),s.push(vec3.add(vec3.create(),v,g)),s.push(vec3.add(vec3.create(),o,g)),s.push(vec3.add(vec3.create(),o,r)),p.push(m(s));for(let a=0;a<=h;a++){const t=TAU/4*a/h,i=cos(t),u=sin(t);if(a>0){let t;s=[],t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,g,e),vec3.scale(f,d,c))),s.push(t),t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,r,e),vec3.scale(f,d,c))),s.push(t),a<h&&(t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,r,i),vec3.scale(f,d,u))),s.push(t)),t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,g,i),vec3.scale(f,d,u))),s.push(t),p.push(m(s)),s=[],t=vec3.add(vec3.create(),vec3.scale(b,g,e),vec3.scale(f,d,c)),vec3.add(t,t,o),s.push(t),t=vec3.add(vec3.create(),vec3.scale(b,r,e),vec3.scale(f,d,c)),vec3.add(t,t,o),s.push(t),a<h&&(t=vec3.add(vec3.create(),vec3.scale(b,r,i),vec3.scale(f,d,u)),vec3.add(t,t,o),s.push(t)),t=vec3.add(vec3.create(),vec3.scale(b,g,i),vec3.scale(f,d,u)),vec3.add(t,t,o),s.push(t),s.reverse(),p.push(m(s))}e=i,c=u}}g=r}return geom3.create(p)};module.exports=roundedCylinder;
1152
-
1153
- },{"../geometries/geom3":41,"../geometries/poly3":79,"../maths/constants":94,"../maths/utils/trigonometry":173,"../maths/vec3":222,"./commonChecks":370,"./cylinder":373}],385:[function(require,module,exports){
1154
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),rectangle=require("./rectangle"),roundedRectangle=e=>{let{center:r,size:t,roundRadius:a,segments:c}=Object.assign({},{center:[0,0],size:[2,2],roundRadius:.2,segments:32},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("size must be an array of X and Y values");if(!t.every(e=>e>=0))throw new Error("size values must be positive");if(!isGTE(a,0))throw new Error("roundRadius must be positive");if(!isGTE(c,4))throw new Error("segments must be four or more");if(0===t[0]||0===t[1])return geom2.create();if(0===a)return rectangle({center:r,size:t});if(a>(t=t.map(e=>e/2))[0]-EPS||a>t[1]-EPS)throw new Error("roundRadius must be smaller than the radius of all dimensions");const s=Math.floor(c/4),o=vec2.add(vec2.create(),r,[t[0]-a,t[1]-a]),n=vec2.add(vec2.create(),r,[a-t[0],t[1]-a]),i=vec2.add(vec2.create(),r,[a-t[0],a-t[1]]),u=vec2.add(vec2.create(),r,[t[0]-a,a-t[1]]),d=[],v=[],m=[],l=[];for(let e=0;e<=s;e++){const r=TAU/4*e/s,t=vec2.fromAngleRadians(vec2.create(),r);vec2.scale(t,t,a),d.push(vec2.add(vec2.create(),o,t)),vec2.rotate(t,t,vec2.create(),TAU/4),v.push(vec2.add(vec2.create(),n,t)),vec2.rotate(t,t,vec2.create(),TAU/4),m.push(vec2.add(vec2.create(),i,t)),vec2.rotate(t,t,vec2.create(),TAU/4),l.push(vec2.add(vec2.create(),u,t))}return geom2.fromPoints(d.concat(v,m,l))};module.exports=roundedRectangle;
1155
-
1156
- },{"../geometries/geom2":25,"../maths/constants":94,"../maths/vec2":191,"./commonChecks":370,"./rectangle":382}],386:[function(require,module,exports){
1157
- const ellipsoid=require("./ellipsoid"),{isGTE:isGTE}=require("./commonChecks"),sphere=e=>{let{center:s,radius:r,segments:i,axes:t}=Object.assign({},{center:[0,0,0],radius:1,segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},e);if(!isGTE(r,0))throw new Error("radius must be positive");return ellipsoid({center:s,radius:r=[r,r,r],segments:i,axes:t})};module.exports=sphere;
1158
-
1159
- },{"./commonChecks":370,"./ellipsoid":376}],387:[function(require,module,exports){
1160
- const rectangle=require("./rectangle"),{isGTE:isGTE}=require("./commonChecks"),square=e=>{let{center:r,size:s}=Object.assign({},{center:[0,0],size:2},e);if(!isGTE(s,0))throw new Error("size must be positive");return rectangle({center:r,size:s=[s,s]})};module.exports=square;
1161
-
1162
- },{"./commonChecks":370,"./rectangle":382}],388:[function(require,module,exports){
1163
- const{TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),getRadiusRatio=(e,r)=>e>0&&r>1&&r<e/2?Math.cos(Math.PI*r/e)/Math.cos(Math.PI*(r-1)/e):0,getPoints=(e,r,t,s)=>{const o=TAU/e,i=[];for(let a=0;a<e;a++){const e=vec2.fromAngleRadians(vec2.create(),o*a+t);vec2.scale(e,e,r),vec2.add(e,s,e),i.push(e)}return i},star=e=>{let{center:r,vertices:t,outerRadius:s,innerRadius:o,density:i,startAngle:a}=Object.assign({},{center:[0,0],vertices:5,outerRadius:1,innerRadius:0,density:2,startAngle:0},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isGTE(t,2))throw new Error("vertices must be two or more");if(!isGT(s,0))throw new Error("outerRadius must be greater than zero");if(!isGTE(o,0))throw new Error("innerRadius must be greater than zero");if(!isGTE(a,0))throw new Error("startAngle must be greater than zero");if(t=Math.floor(t),i=Math.floor(i),a%=TAU,0===o){if(!isGTE(i,2))throw new Error("density must be two or more");o=s*getRadiusRatio(t,i)}const n=vec2.clone(r),u=getPoints(t,s,a,n),c=getPoints(t,o,a+Math.PI/t,n),h=[];for(let e=0;e<t;e++)h.push(u[e]),h.push(c[e]);return geom2.fromPoints(h)};module.exports=star;
1164
-
1165
- },{"../geometries/geom2":25,"../maths/constants":94,"../maths/vec2":191,"./commonChecks":370}],389:[function(require,module,exports){
1166
- const{TAU:TAU}=require("../maths/constants"),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:TAU},{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 too 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;
1167
-
1168
- },{"../maths/constants":94,"../operations/extrusions/extrudeRotate":316,"../operations/transforms/rotate":364,"../operations/transforms/translate":367,"./circle":369,"./commonChecks":370}],390:[function(require,module,exports){
1169
- const{NEPS:NEPS}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isNumberArray:isNumberArray}=require("./commonChecks"),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;
1170
-
1171
- },{"../geometries/geom2":25,"../maths/constants":94,"../maths/vec2":191,"./commonChecks":370}],391:[function(require,module,exports){
1172
- 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]};
1173
-
1174
- },{}],392:[function(require,module,exports){
1175
- module.exports={vectorChar:require("./vectorChar"),vectorText:require("./vectorText")};
1176
-
1177
- },{"./vectorChar":393,"./vectorText":395}],393:[function(require,module,exports){
1178
- 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;
1179
-
1180
- },{"./vectorParams":394}],394:[function(require,module,exports){
1181
- 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;
1182
-
1183
- },{"./fonts/single-line/hershey/simplex.js":391}],395:[function(require,module,exports){
1184
- 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,m,x,u,d,[v,w]=[n,s],O={width:0,segments:[]};const p=[];let y=[],C=0;const L=v,P=()=>{p.push(O),C=Math.max(C,O.width),O={width:0,segments:[]}};for(l=0,f=r.length;l<f;l++)m=r[l],x=vectorChar({xOffset:v,yOffset:w,font:h,height:a,extrudeOffset:i},m),"\n"!==m?(u=x.width*g,O.width+=u,v+=u," "!==m&&(O.segments=O.segments.concat(x.segments))):(v=L,w-=x.height*c,P());for(O.segments.length&&P(),l=0,f=p.length;l<f;l++)O=p[l],C>O.width&&(d=C-O.width,"right"===o?O=translateLine({x:d},O):"center"===o&&(O=translateLine({x:d/2},O))),y=y.concat(O.segments);return y};module.exports=vectorText;
1185
-
1186
- },{"./vectorChar":393,"./vectorParams":394}],396:[function(require,module,exports){
1187
- const geom2=require("../geometries/geom2"),geom3=require("../geometries/geom3"),path2=require("../geometries/path2"),areAllShapesTheSameType=e=>{let r;for(const o of e){let e=0;if(geom2.isA(o)&&(e=1),geom3.isA(o)&&(e=2),path2.isA(o)&&(e=3),r&&e!==r)return!1;r=e}return!0};module.exports=areAllShapesTheSameType;
1188
-
1189
- },{"../geometries/geom2":25,"../geometries/geom3":41,"../geometries/path2":62}],397:[function(require,module,exports){
1190
- const degToRad=d=>.017453292519943295*d;module.exports=degToRad;
1191
-
1192
- },{}],398:[function(require,module,exports){
1193
- const flatten=t=>t.reduce((t,a)=>Array.isArray(a)?t.concat(flatten(a)):t.concat(a),[]);module.exports=flatten;
1194
-
1195
- },{}],399:[function(require,module,exports){
1196
- const fnNumberSort=(o,r)=>o-r;module.exports=fnNumberSort;
1197
-
1198
- },{}],400:[function(require,module,exports){
1199
- module.exports={areAllShapesTheSameType:require("./areAllShapesTheSameType"),degToRad:require("./degToRad"),flatten:require("./flatten"),fnNumberSort:require("./fnNumberSort"),insertSorted:require("./insertSorted"),radiusToSegments:require("./radiusToSegments"),radToDeg:require("./radToDeg")};
1200
-
1201
- },{"./areAllShapesTheSameType":396,"./degToRad":397,"./flatten":398,"./fnNumberSort":399,"./insertSorted":401,"./radToDeg":403,"./radiusToSegments":404}],401:[function(require,module,exports){
1202
- 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;
1203
-
1204
- },{}],402:[function(require,module,exports){
1205
- const padArrayToLength=(r,e,o)=>{for(r=r.slice();r.length<o;)r.push(e);return r};module.exports=padArrayToLength;
1206
-
1207
- },{}],403:[function(require,module,exports){
1208
- const radToDeg=o=>57.29577951308232*o;module.exports=radToDeg;
1209
-
1210
- },{}],404:[function(require,module,exports){
1211
- const{TAU:TAU}=require("../maths/constants"),radiusToSegments=(t,e,s)=>{const a=e>0?t*TAU/e:0,n=s>0?TAU/s:0;return Math.ceil(Math.max(a,n,4))};module.exports=radiusToSegments;
1212
-
1213
- },{"../maths/constants":94}]},{},[92])(92)
1214
- });
1
+ /**
2
+ * Constructive Solid Geometry (CSG) Library for JSCAD
3
+ * @module @jscad/modeling
4
+ * @version 3.0.1-alpha.0
5
+ * @license MIT
6
+ */
7
+ var global,factory;global=this,factory=function(exports){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]},clone$b=geometry=>Object.assign({},geometry),create$c=()=>[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],clone$a=matrix=>{const out=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];return out[0]=matrix[0],out[1]=matrix[1],out[2]=matrix[2],out[3]=matrix[3],out[4]=matrix[4],out[5]=matrix[5],out[6]=matrix[6],out[7]=matrix[7],out[8]=matrix[8],out[9]=matrix[9],out[10]=matrix[10],out[11]=matrix[11],out[12]=matrix[12],out[13]=matrix[13],out[14]=matrix[14],out[15]=matrix[15],out},copy$5=(out,matrix)=>(out[0]=matrix[0],out[1]=matrix[1],out[2]=matrix[2],out[3]=matrix[3],out[4]=matrix[4],out[5]=matrix[5],out[6]=matrix[6],out[7]=matrix[7],out[8]=matrix[8],out[9]=matrix[9],out[10]=matrix[10],out[11]=matrix[11],out[12]=matrix[12],out[13]=matrix[13],out[14]=matrix[14],out[15]=matrix[15],out),EPS=1e-5,NEPS=1e-13,TAU=2*Math.PI,rezero=n=>Math.abs(n)<NEPS?0:n,sin=radians=>rezero(Math.sin(radians)),cos=radians=>rezero(Math.cos(radians)),identity=out=>(out[0]=1,out[1]=0,out[2]=0,out[3]=0,out[4]=0,out[5]=1,out[6]=0,out[7]=0,out[8]=0,out[9]=0,out[10]=1,out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out),fromRotation=(out,rad,axis)=>{let[x,y,z]=axis;const lengthSquared=x*x+y*y+z*z;if(Math.abs(lengthSquared)<EPS)return identity(out);const len=1/Math.sqrt(lengthSquared);x*=len,y*=len,z*=len;const s=sin(rad),c=cos(rad),t=1-c;return out[0]=x*x*t+c,out[1]=y*x*t+z*s,out[2]=z*x*t-y*s,out[3]=0,out[4]=x*y*t-z*s,out[5]=y*y*t+c,out[6]=z*y*t+x*s,out[7]=0,out[8]=x*z*t+y*s,out[9]=y*z*t-x*s,out[10]=z*z*t+c,out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out},fromScaling=(out,vector)=>(out[0]=vector[0],out[1]=0,out[2]=0,out[3]=0,out[4]=0,out[5]=vector[1],out[6]=0,out[7]=0,out[8]=0,out[9]=0,out[10]=vector[2],out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out),fromTaitBryanRotation=(out,yaw,pitch,roll)=>{const sy=sin(yaw),cy=cos(yaw),sp=sin(pitch),cp=cos(pitch),sr=sin(roll),cr=cos(roll);return out[0]=cp*cy,out[1]=cp*sy,out[2]=-sp,out[3]=0,out[4]=sr*sp*cy-cr*sy,out[5]=cr*cy+sr*sp*sy,out[6]=sr*cp,out[7]=0,out[8]=sr*sy+cr*sp*cy,out[9]=cr*sp*sy-sr*cy,out[10]=cr*cp,out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out},fromTranslation=(out,vector)=>(out[0]=1,out[1]=0,out[2]=0,out[3]=0,out[4]=0,out[5]=1,out[6]=0,out[7]=0,out[8]=0,out[9]=0,out[10]=1,out[11]=0,out[12]=vector[0],out[13]=vector[1],out[14]=vector[2],out[15]=1,out),fromValues$4=(m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33)=>{const out=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];return out[0]=m00,out[1]=m01,out[2]=m02,out[3]=m03,out[4]=m10,out[5]=m11,out[6]=m12,out[7]=m13,out[8]=m20,out[9]=m21,out[10]=m22,out[11]=m23,out[12]=m30,out[13]=m31,out[14]=m32,out[15]=m33,out},abs$1=(out,vector)=>(out[0]=Math.abs(vector[0]),out[1]=Math.abs(vector[1]),out[2]=Math.abs(vector[2]),out),add$1=(out,a,b)=>(out[0]=a[0]+b[0],out[1]=a[1]+b[1],out[2]=a[2]+b[2],out),dot$2=(a,b)=>a[0]*b[0]+a[1]*b[1]+a[2]*b[2],create$b=()=>[0,0,0],clone$9=vector=>{const out=[0,0,0];return out[0]=vector[0],out[1]=vector[1],out[2]=vector[2],out},copy$4=(out,vector)=>(out[0]=vector[0],out[1]=vector[1],out[2]=vector[2],out),cross$1=(out,a,b)=>{const ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];return out[0]=ay*bz-az*by,out[1]=az*bx-ax*bz,out[2]=ax*by-ay*bx,out},distance$1=(a,b)=>{const x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return Math.sqrt(x*x+y*y+z*z)},divide$1=(out,a,b)=>(out[0]=a[0]/b[0],out[1]=a[1]/b[1],out[2]=a[2]/b[2],out),equals$7=(a,b)=>a[0]===b[0]&&a[1]===b[1]&&a[2]===b[2],fromScalar$2=(out,scalar)=>(out[0]=scalar,out[1]=scalar,out[2]=scalar,out),fromValues$3=(x,y,z)=>{const out=[0,0,0];return out[0]=x,out[1]=y,out[2]=z,out},fromVec2=(out,vector,z=0)=>(out[0]=vector[0],out[1]=vector[1],out[2]=z,out),length$2=vector=>{const x=vector[0],y=vector[1],z=vector[2];return Math.sqrt(x*x+y*y+z*z)},max$2=(out,a,b)=>(out[0]=Math.max(a[0],b[0]),out[1]=Math.max(a[1],b[1]),out[2]=Math.max(a[2],b[2]),out),min$2=(out,a,b)=>(out[0]=Math.min(a[0],b[0]),out[1]=Math.min(a[1],b[1]),out[2]=Math.min(a[2],b[2]),out),multiply$2=(out,a,b)=>(out[0]=a[0]*b[0],out[1]=a[1]*b[1],out[2]=a[2]*b[2],out),negate$1=(out,vector)=>(out[0]=-vector[0],out[1]=-vector[1],out[2]=-vector[2],out),normalize$1=(out,vector)=>{const x=vector[0],y=vector[1],z=vector[2];let len=x*x+y*y+z*z;return len>0&&(len=1/Math.sqrt(len)),out[0]=x*len,out[1]=y*len,out[2]=z*len,out},orthogonal=(out,vector)=>{const bV=abs$1([0,0,0],vector),b0=0+(bV[0]<bV[1]&&bV[0]<bV[2]),b1=0+(bV[1]<=bV[0]&&bV[1]<bV[2]),b2=0+(bV[2]<=bV[0]&&bV[2]<=bV[1]);return cross$1(out,vector,[b0,b1,b2])},rotateZ$2=(out,vector,origin,radians)=>{const p=[],r=[];return p[0]=vector[0]-origin[0],p[1]=vector[1]-origin[1],r[0]=p[0]*Math.cos(radians)-p[1]*Math.sin(radians),r[1]=p[0]*Math.sin(radians)+p[1]*Math.cos(radians),out[0]=r[0]+origin[0],out[1]=r[1]+origin[1],out[2]=vector[2],out},scale$3=(out,vector,amount)=>(out[0]=vector[0]*amount,out[1]=vector[1]*amount,out[2]=vector[2]*amount,out),snap$2=(out,vector,epsilon)=>(out[0]=Math.round(vector[0]/epsilon)*epsilon+0,out[1]=Math.round(vector[1]/epsilon)*epsilon+0,out[2]=Math.round(vector[2]/epsilon)*epsilon+0,out),squaredDistance$1=(a,b)=>{const x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return x*x+y*y+z*z},squaredLength$1=vector=>{const x=vector[0],y=vector[1],z=vector[2];return x*x+y*y+z*z},subtract$3=(out,a,b)=>(out[0]=a[0]-b[0],out[1]=a[1]-b[1],out[2]=a[2]-b[2],out),toString$b=vec=>`[${vec[0].toFixed(7)}, ${vec[1].toFixed(7)}, ${vec[2].toFixed(7)}]`,transform$c=(out,vector,matrix)=>{const x=vector[0],y=vector[1],z=vector[2];let w=matrix[3]*x+matrix[7]*y+matrix[11]*z+matrix[15];return w=w||1,out[0]=(matrix[0]*x+matrix[4]*y+matrix[8]*z+matrix[12])/w,out[1]=(matrix[1]*x+matrix[5]*y+matrix[9]*z+matrix[13])/w,out[2]=(matrix[2]*x+matrix[6]*y+matrix[10]*z+matrix[14])/w,out};var index$d=Object.freeze({__proto__:null,abs:abs$1,add:add$1,angle:(a,b)=>{const ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2],mag=Math.sqrt(ax*ax+ay*ay+az*az)*Math.sqrt(bx*bx+by*by+bz*bz),cosine=mag&&dot$2(a,b)/mag;return Math.acos(Math.min(Math.max(cosine,-1),1))},clone:clone$9,copy:copy$4,create:create$b,cross:cross$1,distance:distance$1,divide:divide$1,dot:dot$2,equals:equals$7,fromScalar:fromScalar$2,fromValues:fromValues$3,fromVec2:fromVec2,length:length$2,lerp:(out,a,b,t)=>(out[0]=a[0]+t*(b[0]-a[0]),out[1]=a[1]+t*(b[1]-a[1]),out[2]=a[2]+t*(b[2]-a[2]),out),max:max$2,min:min$2,multiply:multiply$2,negate:negate$1,normalize:normalize$1,orthogonal:orthogonal,rotateX:(out,vector,origin,radians)=>{const p=[],r=[];return p[0]=vector[0]-origin[0],p[1]=vector[1]-origin[1],p[2]=vector[2]-origin[2],r[0]=p[0],r[1]=p[1]*Math.cos(radians)-p[2]*Math.sin(radians),r[2]=p[1]*Math.sin(radians)+p[2]*Math.cos(radians),out[0]=r[0]+origin[0],out[1]=r[1]+origin[1],out[2]=r[2]+origin[2],out},rotateY:(out,vector,origin,radians)=>{const p=[],r=[];return p[0]=vector[0]-origin[0],p[1]=vector[1]-origin[1],p[2]=vector[2]-origin[2],r[0]=p[2]*Math.sin(radians)+p[0]*Math.cos(radians),r[1]=p[1],r[2]=p[2]*Math.cos(radians)-p[0]*Math.sin(radians),out[0]=r[0]+origin[0],out[1]=r[1]+origin[1],out[2]=r[2]+origin[2],out},rotateZ:rotateZ$2,scale:scale$3,snap:snap$2,squaredDistance:squaredDistance$1,squaredLength:squaredLength$1,subtract:subtract$3,toString:toString$b,transform:transform$c});const fromVectorRotation=(out,source,target)=>{const sourceNormal=normalize$1([0,0,0],source),targetNormal=normalize$1([0,0,0],target),axis=cross$1([0,0,0],targetNormal,sourceNormal),cosA=dot$2(targetNormal,sourceNormal);if(-1===cosA)return fromRotation(out,Math.PI,orthogonal(axis,sourceNormal));const k=1/(1+cosA);return out[0]=axis[0]*axis[0]*k+cosA,out[1]=axis[1]*axis[0]*k-axis[2],out[2]=axis[2]*axis[0]*k+axis[1],out[3]=0,out[4]=axis[0]*axis[1]*k+axis[2],out[5]=axis[1]*axis[1]*k+cosA,out[6]=axis[2]*axis[1]*k-axis[0],out[7]=0,out[8]=axis[0]*axis[2]*k-axis[1],out[9]=axis[1]*axis[2]*k+axis[0],out[10]=axis[2]*axis[2]*k+cosA,out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out},fromXRotation=(out,radians)=>{const s=sin(radians),c=cos(radians);return out[0]=1,out[1]=0,out[2]=0,out[3]=0,out[4]=0,out[5]=c,out[6]=s,out[7]=0,out[8]=0,out[9]=-s,out[10]=c,out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out},fromZRotation=(out,radians)=>{const s=sin(radians),c=cos(radians);return out[0]=c,out[1]=s,out[2]=0,out[3]=0,out[4]=-s,out[5]=c,out[6]=0,out[7]=0,out[8]=0,out[9]=0,out[10]=1,out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out},isIdentity=matrix=>1===matrix[0]&&0===matrix[1]&&0===matrix[2]&&0===matrix[3]&&0===matrix[4]&&1===matrix[5]&&0===matrix[6]&&0===matrix[7]&&0===matrix[8]&&0===matrix[9]&&1===matrix[10]&&0===matrix[11]&&0===matrix[12]&&0===matrix[13]&&0===matrix[14]&&1===matrix[15],isMirroring=matrix=>{const x=matrix[4]*matrix[9]-matrix[8]*matrix[5],y=matrix[8]*matrix[1]-matrix[0]*matrix[9],z=matrix[0]*matrix[5]-matrix[4]*matrix[1];return x*matrix[2]+y*matrix[6]+z*matrix[10]<0},isZero=num=>Math.abs(num)<Number.EPSILON,mirrorByPlane=(out,plane)=>{const[nx,ny,nz,w]=plane;return out[0]=1-2*nx*nx,out[1]=-2*ny*nx,out[2]=-2*nz*nx,out[3]=0,out[4]=-2*nx*ny,out[5]=1-2*ny*ny,out[6]=-2*nz*ny,out[7]=0,out[8]=-2*nx*nz,out[9]=-2*ny*nz,out[10]=1-2*nz*nz,out[11]=0,out[12]=2*nx*w,out[13]=2*ny*w,out[14]=2*nz*w,out[15]=1,out},multiply$1=(out,a,b)=>{const a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];let b0=b[0],b1=b[1],b2=b[2],b3=b[3];return out[0]=b0*a00+b1*a10+b2*a20+b3*a30,out[1]=b0*a01+b1*a11+b2*a21+b3*a31,out[2]=b0*a02+b1*a12+b2*a22+b3*a32,out[3]=b0*a03+b1*a13+b2*a23+b3*a33,b0=b[4],b1=b[5],b2=b[6],b3=b[7],out[4]=b0*a00+b1*a10+b2*a20+b3*a30,out[5]=b0*a01+b1*a11+b2*a21+b3*a31,out[6]=b0*a02+b1*a12+b2*a22+b3*a32,out[7]=b0*a03+b1*a13+b2*a23+b3*a33,b0=b[8],b1=b[9],b2=b[10],b3=b[11],out[8]=b0*a00+b1*a10+b2*a20+b3*a30,out[9]=b0*a01+b1*a11+b2*a21+b3*a31,out[10]=b0*a02+b1*a12+b2*a22+b3*a32,out[11]=b0*a03+b1*a13+b2*a23+b3*a33,b0=b[12],b1=b[13],b2=b[14],b3=b[15],out[12]=b0*a00+b1*a10+b2*a20+b3*a30,out[13]=b0*a01+b1*a11+b2*a21+b3*a31,out[14]=b0*a02+b1*a12+b2*a22+b3*a32,out[15]=b0*a03+b1*a13+b2*a23+b3*a33,out},translate$1=(out,matrix,offsets)=>{const x=offsets[0],y=offsets[1],z=offsets[2];let a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;return matrix===out?(out[12]=matrix[0]*x+matrix[4]*y+matrix[8]*z+matrix[12],out[13]=matrix[1]*x+matrix[5]*y+matrix[9]*z+matrix[13],out[14]=matrix[2]*x+matrix[6]*y+matrix[10]*z+matrix[14],out[15]=matrix[3]*x+matrix[7]*y+matrix[11]*z+matrix[15]):(a00=matrix[0],a01=matrix[1],a02=matrix[2],a03=matrix[3],a10=matrix[4],a11=matrix[5],a12=matrix[6],a13=matrix[7],a20=matrix[8],a21=matrix[9],a22=matrix[10],a23=matrix[11],out[0]=a00,out[1]=a01,out[2]=a02,out[3]=a03,out[4]=a10,out[5]=a11,out[6]=a12,out[7]=a13,out[8]=a20,out[9]=a21,out[10]=a22,out[11]=a23,out[12]=a00*x+a10*y+a20*z+matrix[12],out[13]=a01*x+a11*y+a21*z+matrix[13],out[14]=a02*x+a12*y+a22*z+matrix[14],out[15]=a03*x+a13*y+a23*z+matrix[15]),out};var index$c=Object.freeze({__proto__:null,add:(out,a,b)=>(out[0]=a[0]+b[0],out[1]=a[1]+b[1],out[2]=a[2]+b[2],out[3]=a[3]+b[3],out[4]=a[4]+b[4],out[5]=a[5]+b[5],out[6]=a[6]+b[6],out[7]=a[7]+b[7],out[8]=a[8]+b[8],out[9]=a[9]+b[9],out[10]=a[10]+b[10],out[11]=a[11]+b[11],out[12]=a[12]+b[12],out[13]=a[13]+b[13],out[14]=a[14]+b[14],out[15]=a[15]+b[15],out),clone:clone$a,copy:copy$5,create:create$c,equals:(a,b)=>a[0]===b[0]&&a[1]===b[1]&&a[2]===b[2]&&a[3]===b[3]&&a[4]===b[4]&&a[5]===b[5]&&a[6]===b[6]&&a[7]===b[7]&&a[8]===b[8]&&a[9]===b[9]&&a[10]===b[10]&&a[11]===b[11]&&a[12]===b[12]&&a[13]===b[13]&&a[14]===b[14]&&a[15]===b[15],fromRotation:fromRotation,fromScaling:fromScaling,fromTaitBryanRotation:fromTaitBryanRotation,fromTranslation:fromTranslation,fromValues:fromValues$4,fromVectorRotation:fromVectorRotation,fromXRotation:fromXRotation,fromYRotation:(out,radians)=>{const s=sin(radians),c=cos(radians);return out[0]=c,out[1]=0,out[2]=-s,out[3]=0,out[4]=0,out[5]=1,out[6]=0,out[7]=0,out[8]=s,out[9]=0,out[10]=c,out[11]=0,out[12]=0,out[13]=0,out[14]=0,out[15]=1,out},fromZRotation:fromZRotation,identity:identity,invert:(out,matrix)=>{const a00=matrix[0],a01=matrix[1],a02=matrix[2],a03=matrix[3],a10=matrix[4],a11=matrix[5],a12=matrix[6],a13=matrix[7],a20=matrix[8],a21=matrix[9],a22=matrix[10],a23=matrix[11],a30=matrix[12],a31=matrix[13],a32=matrix[14],a33=matrix[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32;let det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;return det?(det=1/det,out[0]=(a11*b11-a12*b10+a13*b09)*det,out[1]=(a02*b10-a01*b11-a03*b09)*det,out[2]=(a31*b05-a32*b04+a33*b03)*det,out[3]=(a22*b04-a21*b05-a23*b03)*det,out[4]=(a12*b08-a10*b11-a13*b07)*det,out[5]=(a00*b11-a02*b08+a03*b07)*det,out[6]=(a32*b02-a30*b05-a33*b01)*det,out[7]=(a20*b05-a22*b02+a23*b01)*det,out[8]=(a10*b10-a11*b08+a13*b06)*det,out[9]=(a01*b08-a00*b10-a03*b06)*det,out[10]=(a30*b04-a31*b02+a33*b00)*det,out[11]=(a21*b02-a20*b04-a23*b00)*det,out[12]=(a11*b07-a10*b09-a12*b06)*det,out[13]=(a00*b09-a01*b07+a02*b06)*det,out[14]=(a31*b01-a30*b03-a32*b00)*det,out[15]=(a20*b03-a21*b01+a22*b00)*det,out):null},isIdentity:isIdentity,isMirroring:isMirroring,isOnlyTransformScale:matrix=>isZero(matrix[1])&&isZero(matrix[2])&&isZero(matrix[3])&&isZero(matrix[4])&&isZero(matrix[6])&&isZero(matrix[7])&&isZero(matrix[8])&&isZero(matrix[9])&&isZero(matrix[11])&&1===matrix[15],mirrorByPlane:mirrorByPlane,multiply:multiply$1,rotate:(out,matrix,radians,axis)=>{let[x,y,z]=axis;const lengthSquared=x*x+y*y+z*z;if(Math.abs(lengthSquared)<EPS)return copy$5(out,matrix);const len=1/Math.sqrt(lengthSquared);x*=len,y*=len,z*=len;const s=sin(radians),c=cos(radians),t=1-c,a00=matrix[0],a01=matrix[1],a02=matrix[2],a03=matrix[3],a10=matrix[4],a11=matrix[5],a12=matrix[6],a13=matrix[7],a20=matrix[8],a21=matrix[9],a22=matrix[10],a23=matrix[11],b00=x*x*t+c,b01=y*x*t+z*s,b02=z*x*t-y*s,b10=x*y*t-z*s,b11=y*y*t+c,b12=z*y*t+x*s,b20=x*z*t+y*s,b21=y*z*t-x*s,b22=z*z*t+c;return out[0]=a00*b00+a10*b01+a20*b02,out[1]=a01*b00+a11*b01+a21*b02,out[2]=a02*b00+a12*b01+a22*b02,out[3]=a03*b00+a13*b01+a23*b02,out[4]=a00*b10+a10*b11+a20*b12,out[5]=a01*b10+a11*b11+a21*b12,out[6]=a02*b10+a12*b11+a22*b12,out[7]=a03*b10+a13*b11+a23*b12,out[8]=a00*b20+a10*b21+a20*b22,out[9]=a01*b20+a11*b21+a21*b22,out[10]=a02*b20+a12*b21+a22*b22,out[11]=a03*b20+a13*b21+a23*b22,matrix!==out&&(out[12]=matrix[12],out[13]=matrix[13],out[14]=matrix[14],out[15]=matrix[15]),out},rotateX:(out,matrix,radians)=>{const s=sin(radians),c=cos(radians),a10=matrix[4],a11=matrix[5],a12=matrix[6],a13=matrix[7],a20=matrix[8],a21=matrix[9],a22=matrix[10],a23=matrix[11];return matrix!==out&&(out[0]=matrix[0],out[1]=matrix[1],out[2]=matrix[2],out[3]=matrix[3],out[12]=matrix[12],out[13]=matrix[13],out[14]=matrix[14],out[15]=matrix[15]),out[4]=a10*c+a20*s,out[5]=a11*c+a21*s,out[6]=a12*c+a22*s,out[7]=a13*c+a23*s,out[8]=a20*c-a10*s,out[9]=a21*c-a11*s,out[10]=a22*c-a12*s,out[11]=a23*c-a13*s,out},rotateY:(out,matrix,radians)=>{const s=sin(radians),c=cos(radians),a00=matrix[0],a01=matrix[1],a02=matrix[2],a03=matrix[3],a20=matrix[8],a21=matrix[9],a22=matrix[10],a23=matrix[11];return matrix!==out&&(out[4]=matrix[4],out[5]=matrix[5],out[6]=matrix[6],out[7]=matrix[7],out[12]=matrix[12],out[13]=matrix[13],out[14]=matrix[14],out[15]=matrix[15]),out[0]=a00*c-a20*s,out[1]=a01*c-a21*s,out[2]=a02*c-a22*s,out[3]=a03*c-a23*s,out[8]=a00*s+a20*c,out[9]=a01*s+a21*c,out[10]=a02*s+a22*c,out[11]=a03*s+a23*c,out},rotateZ:(out,matrix,radians)=>{const s=sin(radians),c=cos(radians),a00=matrix[0],a01=matrix[1],a02=matrix[2],a03=matrix[3],a10=matrix[4],a11=matrix[5],a12=matrix[6],a13=matrix[7];return matrix!==out&&(out[8]=matrix[8],out[9]=matrix[9],out[10]=matrix[10],out[11]=matrix[11],out[12]=matrix[12],out[13]=matrix[13],out[14]=matrix[14],out[15]=matrix[15]),out[0]=a00*c+a10*s,out[1]=a01*c+a11*s,out[2]=a02*c+a12*s,out[3]=a03*c+a13*s,out[4]=a10*c-a00*s,out[5]=a11*c-a01*s,out[6]=a12*c-a02*s,out[7]=a13*c-a03*s,out},scale:(out,matrix,dimensions)=>{const x=dimensions[0],y=dimensions[1],z=dimensions[2];return out[0]=matrix[0]*x,out[1]=matrix[1]*x,out[2]=matrix[2]*x,out[3]=matrix[3]*x,out[4]=matrix[4]*y,out[5]=matrix[5]*y,out[6]=matrix[6]*y,out[7]=matrix[7]*y,out[8]=matrix[8]*z,out[9]=matrix[9]*z,out[10]=matrix[10]*z,out[11]=matrix[11]*z,out[12]=matrix[12],out[13]=matrix[13],out[14]=matrix[14],out[15]=matrix[15],out},subtract:(out,a,b)=>(out[0]=a[0]-b[0],out[1]=a[1]-b[1],out[2]=a[2]-b[2],out[3]=a[3]-b[3],out[4]=a[4]-b[4],out[5]=a[5]-b[5],out[6]=a[6]-b[6],out[7]=a[7]-b[7],out[8]=a[8]-b[8],out[9]=a[9]-b[9],out[10]=a[10]-b[10],out[11]=a[11]-b[11],out[12]=a[12]-b[12],out[13]=a[13]-b[13],out[14]=a[14]-b[14],out[15]=a[15]-b[15],out),toString:mat=>mat.map((n=>n.toFixed(7))).toString(),translate:translate$1});const create$a=(outlines=[])=>({outlines:outlines,transforms:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}),add=(out,a,b)=>(out[0]=a[0]+b[0],out[1]=a[1]+b[1],out),angleRadians=vector=>Math.atan2(vector[1],vector[0]),angleDegrees=vector=>57.29577951308232*angleRadians(vector),create$9=()=>[0,0],clone$8=vector=>{const out=[0,0];return out[0]=vector[0],out[1]=vector[1],out},cross=(out,a,b)=>(out[0]=0,out[1]=0,out[2]=a[0]*b[1]-a[1]*b[0],out),distance=(a,b)=>{const x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)},dot$1=(a,b)=>a[0]*b[0]+a[1]*b[1],equals$6=(a,b)=>a[0]===b[0]&&a[1]===b[1],fromAngleRadians=(out,radians)=>(out[0]=cos(radians),out[1]=sin(radians),out),fromValues$2=(x,y)=>{const out=[0,0];return out[0]=x,out[1]=y,out},max$1=(out,a,b)=>(out[0]=Math.max(a[0],b[0]),out[1]=Math.max(a[1],b[1]),out),min$1=(out,a,b)=>(out[0]=Math.min(a[0],b[0]),out[1]=Math.min(a[1],b[1]),out),negate=(out,vector)=>(out[0]=-vector[0],out[1]=-vector[1],out),rotate$1=(out,vector,origin,radians)=>{const x=vector[0]-origin[0],y=vector[1]-origin[1],c=Math.cos(radians),s=Math.sin(radians);return out[0]=x*c-y*s+origin[0],out[1]=x*s+y*c+origin[1],out},normal=(out,vector)=>rotate$1(out,vector,[0,0],TAU/4),normalize=(out,vector)=>{const x=vector[0],y=vector[1];let len=x*x+y*y;return len>0&&(len=1/Math.sqrt(len)),out[0]=x*len,out[1]=y*len,out},scale$1=(out,vector,amount)=>(out[0]=vector[0]*amount,out[1]=vector[1]*amount,out),snap$1=(out,vector,epsilon)=>(out[0]=Math.round(vector[0]/epsilon)*epsilon+0,out[1]=Math.round(vector[1]/epsilon)*epsilon+0,out),squaredDistance=(a,b)=>{const x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y},subtract$1=(out,a,b)=>(out[0]=a[0]-b[0],out[1]=a[1]-b[1],out),toString$9=vector=>`[${vector[0].toFixed(7)}, ${vector[1].toFixed(7)}]`,transform$b=(out,vector,matrix)=>{const x=vector[0],y=vector[1];return out[0]=matrix[0]*x+matrix[4]*y+matrix[12],out[1]=matrix[1]*x+matrix[5]*y+matrix[13],out};var index$b=Object.freeze({__proto__:null,abs:(out,vector)=>(out[0]=Math.abs(vector[0]),out[1]=Math.abs(vector[1]),out),add:add,angle:angleRadians,angleDegrees:angleDegrees,angleRadians:angleRadians,clone:clone$8,copy:(out,vector)=>(out[0]=vector[0],out[1]=vector[1],out),create:create$9,cross:cross,distance:distance,divide:(out,a,b)=>(out[0]=a[0]/b[0],out[1]=a[1]/b[1],out),dot:dot$1,equals:equals$6,fromAngleDegrees:(out,degrees)=>fromAngleRadians(out,.017453292519943295*degrees),fromAngleRadians:fromAngleRadians,fromScalar:(out,scalar)=>(out[0]=scalar,out[1]=scalar,out),fromValues:fromValues$2,length:vector=>Math.sqrt(vector[0]*vector[0]+vector[1]*vector[1]),lerp:(out,a,b,t)=>{const ax=a[0],ay=a[1];return out[0]=ax+t*(b[0]-ax),out[1]=ay+t*(b[1]-ay),out},max:max$1,min:min$1,multiply:(out,a,b)=>(out[0]=a[0]*b[0],out[1]=a[1]*b[1],out),negate:negate,normal:normal,normalize:normalize,rotate:rotate$1,scale:scale$1,snap:snap$1,squaredDistance:squaredDistance,squaredLength:vector=>{const x=vector[0],y=vector[1];return x*x+y*y},subtract:subtract$1,toString:toString$9,transform:transform$b});const toPointMap=sides=>{const pointMap=new Map,edges=(sides=>{const unique=new Map,getUniquePoint=point=>{const key=point.toString();return unique.has(key)?unique.get(key):(unique.set(key,point),point)};return sides.map((side=>side.map(getUniquePoint)))})(sides);return edges.forEach((edge=>{pointMap.has(edge[0])?pointMap.get(edge[0]).push(edge):pointMap.set(edge[0],[edge])})),pointMap},fromSides=sides=>{const pointMap=toPointMap(sides),outlines=[];for(;;){let startSide;for(const[point,edges]of pointMap){if(startSide=edges.shift(),startSide)break;pointMap.delete(point)}if(void 0===startSide)break;const connectedPoints=[],startPoint=startSide[0];for(;;){connectedPoints.push(startSide[0]);const nextPoint=startSide[1];if(nextPoint===startPoint)break;const nextPossibleSides=pointMap.get(nextPoint);if(!nextPossibleSides)throw new Error(`geometry is not closed at point ${nextPoint}`);const nextSide=popNextSide(startSide,nextPossibleSides);0===nextPossibleSides.length&&pointMap.delete(nextPoint),startSide=nextSide}connectedPoints.length>0&&connectedPoints.push(connectedPoints.shift()),outlines.push(connectedPoints)}return pointMap.clear(),create$a(outlines)},popNextSide=(startSide,nextSides)=>{if(1===nextSides.length)return nextSides.pop();const v0=[0,0],startAngle=angleDegrees(subtract$1(v0,startSide[1],startSide[0]));let bestAngle,bestIndex;nextSides.forEach(((nextSide,index)=>{let angle=angleDegrees(subtract$1(v0,nextSide[1],nextSide[0]))-startAngle;angle<-180&&(angle+=360),angle>=180&&(angle-=360),(void 0===bestIndex||angle>bestAngle)&&(bestIndex=index,bestAngle=angle)}));const nextSide=nextSides[bestIndex];return nextSides.splice(bestIndex,1),nextSide},isA$5=object=>!!(object&&"object"==typeof object&&"outlines"in object&&"transforms"in object&&Array.isArray(object.outlines)&&"length"in object.transforms),toOutlines=geometry=>(geometry=>(isIdentity(geometry.transforms)||(geometry.outlines=geometry.outlines.map((outline=>outline.map((point=>transform$b([0,0],point,geometry.transforms))))),geometry.transforms=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),geometry))(geometry).outlines,reverse$5=geometry=>{const outlines=toOutlines(geometry).map((outline=>outline.slice().reverse())),reversed=create$a(outlines);return geometry.color&&(reversed.color=geometry.color),reversed},toPoints$3=geometry=>{const points=[];return toOutlines(geometry).forEach((outline=>{outline.forEach((point=>{points.push(point)}))})),points},toSides=geometry=>{const sides=[];return toOutlines(geometry).forEach((outline=>{outline.forEach(((point,i)=>{const j=(i+1)%outline.length;sides.push([point,outline[j]])}))})),sides},transform$a=(matrix,geometry)=>{const transforms=multiply$1([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],matrix,geometry.transforms),transformed=Object.assign({},geometry,{transforms:transforms});return matrix[0]*matrix[5]-matrix[4]*matrix[1]<0?reverse$5(transformed):transformed},intersect$1=(p1,p2,p3,p4,endpointTouch=!0)=>{if(p1[0]===p2[0]&&p1[1]===p2[1]||p3[0]===p4[0]&&p3[1]===p4[1])return;const denominator=(p4[1]-p3[1])*(p2[0]-p1[0])-(p4[0]-p3[0])*(p2[1]-p1[1]);if(Math.abs(denominator)<Number.MIN_VALUE)return;const ua=((p4[0]-p3[0])*(p1[1]-p3[1])-(p4[1]-p3[1])*(p1[0]-p3[0]))/denominator,ub=((p2[0]-p1[0])*(p1[1]-p3[1])-(p2[1]-p1[1])*(p1[0]-p3[0]))/denominator;return ua<0||ua>1||ub<0||ub>1||!(endpointTouch||0!==ua&&1!==ua&&0!==ub&&1!==ub)?void 0:[p1[0]+ua*(p2[0]-p1[0]),p1[1]+ua*(p2[1]-p1[1])]};var index$a=Object.freeze({__proto__:null,clone:clone$b,create:create$a,fromSides:fromSides,fromCompactBinary:data=>{if(0!==data[0])throw new Error("invalid compact binary data");const created=create$a();created.transforms=clone$a(data.slice(1,17));for(let i=21;i<data.length;){const length=data[i++];if(length<0||i+2*length>data.length)throw new Error("invalid compact binary data");const outline=[];for(let j=0;j<length;j++){const x=data[i+2*j],y=data[i+2*j+1];outline.push(fromValues$2(x,y))}created.outlines.push(outline),i+=2*length}return data[17]>=0&&(created.color=[data[17],data[18],data[19],data[20]]),created},isA:isA$5,reverse:reverse$5,toOutlines:toOutlines,toPoints:toPoints$3,toSides:toSides,toString:geometry=>{const outlines=toOutlines(geometry);let result="geom2 ("+outlines.length+" outlines):\n[\n";return outlines.forEach((outline=>{result+=" ["+outline.map(toString$9).join()+"]\n"})),result+="]\n",result},toCompactBinary:geometry=>{const transforms=geometry.transforms;let color=[-1,-1,-1,-1];geometry.color&&(color=geometry.color);let size=21;geometry.outlines.forEach((outline=>{size+=2*outline.length+1}));const compacted=new Float32Array(size);compacted[0]=0,compacted[1]=transforms[0],compacted[2]=transforms[1],compacted[3]=transforms[2],compacted[4]=transforms[3],compacted[5]=transforms[4],compacted[6]=transforms[5],compacted[7]=transforms[6],compacted[8]=transforms[7],compacted[9]=transforms[8],compacted[10]=transforms[9],compacted[11]=transforms[10],compacted[12]=transforms[11],compacted[13]=transforms[12],compacted[14]=transforms[13],compacted[15]=transforms[14],compacted[16]=transforms[15],compacted[17]=color[0],compacted[18]=color[1],compacted[19]=color[2],compacted[20]=color[3];let index=21;return geometry.outlines.forEach((outline=>{compacted[index++]=outline.length,outline.forEach((point=>{compacted[index++]=point[0],compacted[index++]=point[1]}))})),compacted},transform:transform$a,validate:object=>{if(!isA$5(object))throw new Error("invalid geom2 structure");if(object.outlines.forEach(((outline,i)=>{if(outline.length<3)throw new Error(`geom2 outline ${i} must contain at least 3 points`);for(let i=0;i<outline.length;i++){const j=(i+1)%outline.length;if(equals$6(outline[i],outline[j]))throw new Error(`geom2 outline ${i} has duplicate point ${outline[i]}`)}})),toOutlines(object).forEach(((outline,i)=>{for(let a1=0;a1<outline.length;a1++){const a2=(a1+1)%outline.length;for(let b1=0;b1<outline.length;b1++){const b2=(b1+1)%outline.length;if(a1!==b1){const int=intersect$1(outline[a1],outline[a2],outline[b1],outline[b2],!1);if(int)throw new Error(`geom2 outline ${i} self intersection at ${int}`)}}}})),!object.transforms.every(Number.isFinite))throw new Error(`geom2 invalid transforms ${object.transforms}`)}});const clone$7=geometry=>Object.assign({},geometry),create$8=polygons=>(void 0===polygons&&(polygons=[]),{polygons:polygons,transforms:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}),create$7=vertices=>((void 0===vertices||vertices.length<3)&&(vertices=[]),{vertices:vertices}),clone$6=(...params)=>{let out,poly3;return 1===params.length?(out=create$7(),poly3=params[0]):(out=params[0],poly3=params[1]),out.vertices=poly3.vertices.map((vec=>clone$9(vec))),out},fromVerticesAndPlane=(vertices,plane)=>{const poly=create$7(vertices);return poly.plane=plane,poly},create$6=()=>[0,0,0,0],clone$5=vector=>{const out=[0,0,0,0];return out[0]=vector[0],out[1]=vector[1],out[2]=vector[2],out[3]=vector[3],out},copy$2=(out,vector)=>(out[0]=vector[0],out[1]=vector[1],out[2]=vector[2],out[3]=vector[3],out),equals$5=(a,b)=>a[0]===b[0]&&a[1]===b[1]&&a[2]===b[2]&&a[3]===b[3],flip=(out,plane)=>(out[0]=-plane[0],out[1]=-plane[1],out[2]=-plane[2],out[3]=-plane[3],out),fromNormalAndPoint=(out,normal,point)=>{const u=normalize$1([0,0,0],normal),w=dot$2(point,u);return out[0]=u[0],out[1]=u[1],out[2]=u[2],out[3]=w,out},fromValues$1=(x,y,z,w)=>{const out=[0,0,0,0];return out[0]=x,out[1]=y,out[2]=z,out[3]=w,out},fromPoints$4=(out,...vertices)=>{const len=vertices.length,ba=[0,0,0],ca=[0,0,0],vertexNormal=index=>{const a=vertices[index],b=vertices[(index+1)%len],c=vertices[(index+2)%len];return subtract$3(ba,b,a),subtract$3(ca,c,a),cross$1(ba,ba,ca),normalize$1(ba,ba),ba};return out[0]=0,out[1]=0,out[2]=0,3===len?copy$4(out,vertexNormal(0)):(vertices.forEach(((v,i)=>{add$1(out,out,vertexNormal(i))})),normalize$1(out,out)),out[3]=dot$2(out,vertices[0]),out},projectionOfPoint=(plane,point)=>{const a=point[0]*plane[0]+point[1]*plane[1]+point[2]*plane[2]-plane[3],x=point[0]-a*plane[0],y=point[1]-a*plane[1],z=point[2]-a*plane[2];return fromValues$3(x,y,z)},signedDistanceToPoint=(plane,point)=>dot$2(plane,point)-plane[3],toString$7=vec=>`(${vec[0].toFixed(9)}, ${vec[1].toFixed(9)}, ${vec[2].toFixed(9)}, ${vec[3].toFixed(9)})`;var index$9=Object.freeze({__proto__:null,clone:clone$5,copy:copy$2,create:create$6,equals:equals$5,flip:flip,fromNormalAndPoint:fromNormalAndPoint,fromValues:fromValues$1,fromPoints:fromPoints$4,fromPointsRandom:(out,a,b,c)=>{let ba=subtract$3([0,0,0],b,a),ca=subtract$3([0,0,0],c,a);length$2(ba)<EPS&&(ba=orthogonal(ba,ca)),length$2(ca)<EPS&&(ca=orthogonal(ca,ba));let normal=cross$1([0,0,0],ba,ca);length$2(normal)<EPS&&(ca=orthogonal(ca,ba),normal=cross$1(normal,ba,ca)),normal=normalize$1(normal,normal);const w=dot$2(normal,a);return out[0]=normal[0],out[1]=normal[1],out[2]=normal[2],out[3]=w,out},projectionOfPoint:projectionOfPoint,signedDistanceToPoint:signedDistanceToPoint,toString:toString$7,transform:(out,plane,matrix)=>{const isMirror=isMirroring(matrix),r=orthogonal([0,0,0],plane),u=cross$1(r,plane,r),v=cross$1([0,0,0],plane,u);let point1=fromScalar$2([0,0,0],plane[3]);multiply$2(point1,point1,plane);let point2=add$1([0,0,0],point1,u),point3=add$1([0,0,0],point1,v);return point1=transform$c(point1,point1,matrix),point2=transform$c(point2,point2,matrix),point3=transform$c(point3,point3,matrix),fromPoints$4(out,point1,point2,point3),isMirror&&flip(out,out),out}});const invert$1=polygon=>{const vertices=polygon.vertices.slice().reverse(),inverted=create$7(vertices);return polygon.plane&&(inverted.plane=flip([0,0,0,0],polygon.plane)),inverted},isA$4=object=>!!(object&&"object"==typeof object&&"vertices"in object&&Array.isArray(object.vertices)),isConvex$1=polygon=>areVerticesConvex(polygon.vertices),areVerticesConvex=vertices=>{const numVertices=vertices.length;if(numVertices>2){const normal=fromPoints$4([0,0,0,0],...vertices);let prevPrevPos=vertices[numVertices-2],prevPos=vertices[numVertices-1];for(let i=0;i<numVertices;i++){const pos=vertices[i];if(!isConvexVertex(prevPrevPos,prevPos,pos,normal))return!1;prevPrevPos=prevPos,prevPos=pos}}return!0},isConvexVertex=(prevVertex,vertex,nextVertex,normal)=>{const crossProduct=cross$1([0,0,0],subtract$3([0,0,0],vertex,prevVertex),subtract$3([0,0,0],nextVertex,vertex));return dot$2(crossProduct,normal)>=0},plane=polygon=>(polygon.plane||(polygon.plane=fromPoints$4([0,0,0,0],...polygon.vertices)),polygon.plane),measureArea$2=polygon=>{const n=polygon.vertices.length;if(n<3)return 0;const vertices=polygon.vertices,normal=plane(polygon),ax=Math.abs(normal[0]),ay=Math.abs(normal[1]),az=Math.abs(normal[2]);if(ax+ay+az===0)return 0;let coord=3;ax>ay&&ax>az?coord=1:ay>az&&(coord=2);let area=0,h=0,i=1,j=2;switch(coord){case 1:for(i=1;i<n;i++)h=i-1,j=(i+1)%n,area+=vertices[i][1]*(vertices[j][2]-vertices[h][2]);area+=vertices[0][1]*(vertices[1][2]-vertices[n-1][2]),area/=2*normal[0];break;case 2:for(i=1;i<n;i++)h=i-1,j=(i+1)%n,area+=vertices[i][2]*(vertices[j][0]-vertices[h][0]);area+=vertices[0][2]*(vertices[1][0]-vertices[n-1][0]),area/=2*normal[1];break;default:for(i=1;i<n;i++)h=i-1,j=(i+1)%n,area+=vertices[i][0]*(vertices[j][1]-vertices[h][1]);area+=vertices[0][0]*(vertices[1][1]-vertices[n-1][1]),area/=2*normal[2]}return area};var index$8=Object.freeze({__proto__:null,clone:clone$5,copy:copy$2,create:create$6,dot:(a,b)=>a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3],equals:equals$5,fromScalar:(out,scalar)=>(out[0]=scalar,out[1]=scalar,out[2]=scalar,out[3]=scalar,out),fromValues:fromValues$1,toString:toString$7,transform:(out,vector,matrix)=>{const[x,y,z,w]=vector;return out[0]=matrix[0]*x+matrix[4]*y+matrix[8]*z+matrix[12]*w,out[1]=matrix[1]*x+matrix[5]*y+matrix[9]*z+matrix[13]*w,out[2]=matrix[2]*x+matrix[6]*y+matrix[10]*z+matrix[14]*w,out[3]=matrix[3]*x+matrix[7]*y+matrix[11]*z+matrix[15]*w,out}});const cache$4=new WeakMap,measureBoundingSphere$1=polygon=>{const boundingSphere=cache$4.get(polygon);if(boundingSphere)return boundingSphere;const vertices=polygon.vertices,out=[0,0,0,0];if(0===vertices.length)return out[0]=0,out[1]=0,out[2]=0,out[3]=0,out;let minx=vertices[0],miny=minx,minz=minx,maxx=minx,maxy=minx,maxz=minx;vertices.forEach((v=>{minx[0]>v[0]&&(minx=v),miny[1]>v[1]&&(miny=v),minz[2]>v[2]&&(minz=v),maxx[0]<v[0]&&(maxx=v),maxy[1]<v[1]&&(maxy=v),maxz[2]<v[2]&&(maxz=v)})),out[0]=.5*(minx[0]+maxx[0]),out[1]=.5*(miny[1]+maxy[1]),out[2]=.5*(minz[2]+maxz[2]);const x=out[0]-maxx[0],y=out[1]-maxy[1],z=out[2]-maxz[2];return out[3]=Math.sqrt(x*x+y*y+z*z),cache$4.set(polygon,out),out},measureSignedVolume=polygon=>{let signedVolume=0;const vertices=polygon.vertices,cross=[0,0,0];for(let i=0;i<vertices.length-2;i++)cross$1(cross,vertices[i+1],vertices[i+2]),signedVolume+=dot$2(vertices[0],cross);return signedVolume/=6,signedVolume},toVertices$1=polygon=>polygon.vertices,toString$6=polygon=>`poly3: [${polygon.vertices.map(toString$b).join(", ")}]`,transform$7=(matrix,polygon)=>{const vertices=polygon.vertices.map((vertex=>transform$c([0,0,0],vertex,matrix)));return isMirroring(matrix)&&vertices.reverse(),create$7(vertices)},validate$4=object=>{if(!isA$4(object))throw new Error("invalid poly3 structure");if(object.vertices.length<3)throw new Error(`poly3 not enough vertices ${object.vertices.length}`);if(measureArea$2(object)<=0)throw new Error("poly3 area must be greater than zero");for(let i=0;i<object.vertices.length;i++)if(equals$7(object.vertices[i],object.vertices[(i+1)%object.vertices.length]))throw new Error(`poly3 has duplicate vertex ${object.vertices[i]}`);if(!isConvex$1(object))throw new Error("poly3 must be convex");if(object.vertices.forEach((vertex=>{if(!vertex.every(Number.isFinite))throw new Error(`poly3 invalid vertex ${vertex}`)})),object.vertices.length>3){const normal=plane(object);object.vertices.forEach((vertex=>{const dist=Math.abs(signedDistanceToPoint(normal,vertex));if(dist>NEPS)throw new Error(`poly3 must be coplanar: vertex ${vertex} distance ${dist}`)}))}};var index$7=Object.freeze({__proto__:null,clone:clone$6,create:create$7,fromVerticesAndPlane:fromVerticesAndPlane,invert:invert$1,isA:isA$4,isConvex:isConvex$1,measureArea:measureArea$2,measureBoundingBox:polygon=>{const vertices=polygon.vertices,numVertices=vertices.length,min=0===numVertices?[0,0,0]:clone$9(vertices[0]),max=clone$9(min);for(let i=1;i<numVertices;i++)min$2(min,min,vertices[i]),max$2(max,max,vertices[i]);return[min,max]},measureBoundingSphere:measureBoundingSphere$1,measureSignedVolume:measureSignedVolume,plane:plane,toVertices:toVertices$1,toString:toString$6,transform:transform$7,validate:validate$4});const pointLineDistance=(point,a,b)=>Math.sqrt(((p,a,b)=>{const ab=[],ap=[];subtract$3(ab,b,a),subtract$3(ap,p,a);const area=squaredLength$1(cross$1([],ap,ab)),s=squaredLength$1(ab);if(0===s)throw Error("a and b are the same point");return area/s})(point,a,b));class VertexList{constructor(){this.head=null,this.tail=null}clear(){this.head=this.tail=null}insertBefore(target,node){node.prev=target.prev,node.next=target,node.prev?node.prev.next=node:this.head=node,target.prev=node}insertAfter(target,node){node.prev=target,node.next=target.next,node.next?node.next.prev=node:this.tail=node,target.next=node}add(node){this.head?this.tail.next=node:this.head=node,node.prev=this.tail,node.next=null,this.tail=node}addAll(node){for(this.head?this.tail.next=node:this.head=node,node.prev=this.tail;node.next;)node=node.next;this.tail=node}remove(node){node.prev?node.prev.next=node.next:this.head=node.next,node.next?node.next.prev=node.prev:this.tail=node.prev}removeChain(a,b){a.prev?a.prev.next=b.next:this.head=b.next,b.next?b.next.prev=a.prev:this.tail=a.prev}first(){return this.head}isEmpty(){return!this.head}}class Vertex{constructor(point,index){this.point=point,this.index=index,this.next=null,this.prev=null,this.face=null}}class HalfEdge{constructor(vertex,face){this.vertex=vertex,this.face=face,this.next=null,this.prev=null,this.opposite=null}head(){return this.vertex}tail(){return this.prev?this.prev.vertex:null}length(){return this.tail()?distance$1(this.tail().point,this.head().point):-1}lengthSquared(){return this.tail()?squaredDistance$1(this.tail().point,this.head().point):-1}setOpposite(edge){this.opposite=edge,edge.opposite=this}}class Face{constructor(){this.normal=[],this.centroid=[],this.offset=0,this.outside=null,this.mark=0,this.edge=null,this.nVertices=0}getEdge(i){if("number"!=typeof i)throw Error("requires a number");let it=this.edge;for(;i>0;)it=it.next,i-=1;for(;i<0;)it=it.prev,i+=1;return it}computeNormal(){const e0=this.edge,e1=e0.next;let e2=e1.next;const v2=subtract$3([],e1.head().point,e0.head().point),t=[],v1=[];for(this.nVertices=2,this.normal=[0,0,0];e2!==e0;)copy$4(v1,v2),subtract$3(v2,e2.head().point,e0.head().point),add$1(this.normal,this.normal,cross$1(t,v1,v2)),e2=e2.next,this.nVertices+=1;this.area=length$2(this.normal),this.normal=scale$3(this.normal,this.normal,1/this.area)}computeNormalMinArea(minArea){if(this.computeNormal(),this.area<minArea){let maxEdge,maxSquaredLength=0,edge=this.edge;do{const lengthSquared=edge.lengthSquared();lengthSquared>maxSquaredLength&&(maxEdge=edge,maxSquaredLength=lengthSquared),edge=edge.next}while(edge!==this.edge);const p1=maxEdge.tail().point,p2=maxEdge.head().point,maxVector=subtract$3([],p2,p1),maxLength=Math.sqrt(maxSquaredLength);scale$3(maxVector,maxVector,1/maxLength);const maxProjection=dot$2(this.normal,maxVector);scale$3(maxVector,maxVector,-maxProjection),add$1(this.normal,this.normal,maxVector),normalize$1(this.normal,this.normal)}}computeCentroid(){this.centroid=[0,0,0];let edge=this.edge;do{add$1(this.centroid,this.centroid,edge.head().point),edge=edge.next}while(edge!==this.edge);scale$3(this.centroid,this.centroid,1/this.nVertices)}computeNormalAndCentroid(minArea){void 0!==minArea?this.computeNormalMinArea(minArea):this.computeNormal(),this.computeCentroid(),this.offset=dot$2(this.normal,this.centroid)}distanceToPlane(point){return dot$2(this.normal,point)-this.offset}connectHalfEdges(prev,next){let discardedFace;if(prev.opposite.face===next.opposite.face){const oppositeFace=next.opposite.face;let oppositeEdge;prev===this.edge&&(this.edge=next),3===oppositeFace.nVertices?(oppositeEdge=next.opposite.prev.opposite,oppositeFace.mark=2,discardedFace=oppositeFace):(oppositeEdge=next.opposite.next,oppositeFace.edge===oppositeEdge.prev&&(oppositeFace.edge=oppositeEdge),oppositeEdge.prev=oppositeEdge.prev.prev,oppositeEdge.prev.next=oppositeEdge),next.prev=prev.prev,next.prev.next=next,next.setOpposite(oppositeEdge),oppositeFace.computeNormalAndCentroid()}else prev.next=next,next.prev=prev;return discardedFace}mergeAdjacentFaces(adjacentEdge,discardedFaces){const oppositeEdge=adjacentEdge.opposite,oppositeFace=oppositeEdge.face;discardedFaces.push(oppositeFace),oppositeFace.mark=2;let edge,discardedFace,adjacentEdgePrev=adjacentEdge.prev,adjacentEdgeNext=adjacentEdge.next,oppositeEdgePrev=oppositeEdge.prev,oppositeEdgeNext=oppositeEdge.next;for(;adjacentEdgePrev.opposite.face===oppositeFace;)adjacentEdgePrev=adjacentEdgePrev.prev,oppositeEdgeNext=oppositeEdgeNext.next;for(;adjacentEdgeNext.opposite.face===oppositeFace;)adjacentEdgeNext=adjacentEdgeNext.next,oppositeEdgePrev=oppositeEdgePrev.prev;for(edge=oppositeEdgeNext;edge!==oppositeEdgePrev.next;edge=edge.next)edge.face=this;return this.edge=adjacentEdgeNext,discardedFace=this.connectHalfEdges(oppositeEdgePrev,adjacentEdgeNext),discardedFace&&discardedFaces.push(discardedFace),discardedFace=this.connectHalfEdges(adjacentEdgePrev,oppositeEdgeNext),discardedFace&&discardedFaces.push(discardedFace),this.computeNormalAndCentroid(),discardedFaces}collectIndices(){const indices=[];let edge=this.edge;do{indices.push(edge.head().index),edge=edge.next}while(edge!==this.edge);return indices}static createTriangle(v0,v1,v2,minArea=0){const face=new Face,e0=new HalfEdge(v0,face),e1=new HalfEdge(v1,face),e2=new HalfEdge(v2,face);return e0.next=e2.prev=e1,e1.next=e0.prev=e2,e2.next=e1.prev=e0,face.edge=e0,face.computeNormalAndCentroid(minArea),face}}class QuickHull{constructor(points){if(!Array.isArray(points))throw TypeError("input is not a valid array");if(points.length<4)throw Error("cannot build a simplex out of <4 points");this.tolerance=-1,this.nFaces=0,this.nPoints=points.length,this.faces=[],this.newFaces=[],this.claimed=new VertexList,this.unclaimed=new VertexList,this.vertices=[];for(let i=0;i<points.length;i+=1)this.vertices.push(new Vertex(points[i],i));this.discardedFaces=[],this.vertexPointIndices=[]}addVertexToFace(vertex,face){vertex.face=face,face.outside?this.claimed.insertBefore(face.outside,vertex):this.claimed.add(vertex),face.outside=vertex}removeVertexFromFace(vertex,face){vertex===face.outside&&(vertex.next&&vertex.next.face===face?face.outside=vertex.next:face.outside=null),this.claimed.remove(vertex)}removeAllVerticesFromFace(face){if(face.outside){let end=face.outside;for(;end.next&&end.next.face===face;)end=end.next;return this.claimed.removeChain(face.outside,end),end.next=null,face.outside}}deleteFaceVertices(face,absorbingFace){const faceVertices=this.removeAllVerticesFromFace(face);if(faceVertices)if(absorbingFace){let nextVertex;for(let vertex=faceVertices;vertex;vertex=nextVertex)nextVertex=vertex.next,absorbingFace.distanceToPlane(vertex.point)>this.tolerance?this.addVertexToFace(vertex,absorbingFace):this.unclaimed.add(vertex)}else this.unclaimed.addAll(faceVertices)}resolveUnclaimedPoints(newFaces){let vertexNext=this.unclaimed.first();for(let vertex=vertexNext;vertex;vertex=vertexNext){vertexNext=vertex.next;let maxFace,maxDistance=this.tolerance;for(let i=0;i<newFaces.length;i+=1){const face=newFaces[i];if(0===face.mark){const dist=face.distanceToPlane(vertex.point);if(dist>maxDistance&&(maxDistance=dist,maxFace=face),maxDistance>1e3*this.tolerance)break}}maxFace&&this.addVertexToFace(vertex,maxFace)}}computeExtremes(){const min=[],max=[],minVertices=[],maxVertices=[];let i,j;for(i=0;i<3;i+=1)minVertices[i]=maxVertices[i]=this.vertices[0];for(i=0;i<3;i+=1)min[i]=max[i]=this.vertices[0].point[i];for(i=1;i<this.vertices.length;i+=1){const vertex=this.vertices[i],point=vertex.point;for(j=0;j<3;j+=1)point[j]<min[j]&&(min[j]=point[j],minVertices[j]=vertex);for(j=0;j<3;j+=1)point[j]>max[j]&&(max[j]=point[j],maxVertices[j]=vertex)}return this.tolerance=3*Number.EPSILON*(Math.max(Math.abs(min[0]),Math.abs(max[0]))+Math.max(Math.abs(min[1]),Math.abs(max[1]))+Math.max(Math.abs(min[2]),Math.abs(max[2]))),[minVertices,maxVertices]}createInitialSimplex(){const vertices=this.vertices,[min,max]=this.computeExtremes();let v2,v3,i,j,maxDistance=0,indexMax=0;for(i=0;i<3;i+=1){const distance=max[i].point[i]-min[i].point[i];distance>maxDistance&&(maxDistance=distance,indexMax=i)}const v0=min[indexMax],v1=max[indexMax];for(maxDistance=0,i=0;i<this.vertices.length;i+=1){const vertex=this.vertices[i];if(vertex!==v0&&vertex!==v1){const distance=pointLineDistance(vertex.point,v0.point,v1.point);distance>maxDistance&&(maxDistance=distance,v2=vertex)}}const normal=fromPoints$4([],v0.point,v1.point,v2.point),distPO=dot$2(v0.point,normal);for(maxDistance=-1,i=0;i<this.vertices.length;i+=1){const vertex=this.vertices[i];if(vertex!==v0&&vertex!==v1&&vertex!==v2){const distance=Math.abs(dot$2(normal,vertex.point)-distPO);distance>maxDistance&&(maxDistance=distance,v3=vertex)}}const faces=[];if(dot$2(v3.point,normal)-distPO<0)for(faces.push(Face.createTriangle(v0,v1,v2),Face.createTriangle(v3,v1,v0),Face.createTriangle(v3,v2,v1),Face.createTriangle(v3,v0,v2)),i=0;i<3;i+=1){const j=(i+1)%3;faces[i+1].getEdge(2).setOpposite(faces[0].getEdge(j)),faces[i+1].getEdge(1).setOpposite(faces[j+1].getEdge(0))}else for(faces.push(Face.createTriangle(v0,v2,v1),Face.createTriangle(v3,v0,v1),Face.createTriangle(v3,v1,v2),Face.createTriangle(v3,v2,v0)),i=0;i<3;i+=1){const j=(i+1)%3;faces[i+1].getEdge(2).setOpposite(faces[0].getEdge((3-i)%3)),faces[i+1].getEdge(0).setOpposite(faces[j+1].getEdge(1))}for(i=0;i<4;i+=1)this.faces.push(faces[i]);for(i=0;i<vertices.length;i+=1){const vertex=vertices[i];if(vertex!==v0&&vertex!==v1&&vertex!==v2&&vertex!==v3){let maxFace;for(maxDistance=this.tolerance,j=0;j<4;j+=1){const distance=faces[j].distanceToPlane(vertex.point);distance>maxDistance&&(maxDistance=distance,maxFace=faces[j])}maxFace&&this.addVertexToFace(vertex,maxFace)}}}reindexFaceAndVertices(){const activeFaces=[];for(let i=0;i<this.faces.length;i+=1){const face=this.faces[i];0===face.mark&&activeFaces.push(face)}this.faces=activeFaces}collectFaces(skipTriangulation){const faceIndices=[];for(let i=0;i<this.faces.length;i+=1){if(0!==this.faces[i].mark)throw Error("attempt to include a destroyed face in the hull");const indices=this.faces[i].collectIndices();if(skipTriangulation)faceIndices.push(indices);else for(let j=0;j<indices.length-2;j+=1)faceIndices.push([indices[0],indices[j+1],indices[j+2]])}return faceIndices}nextVertexToAdd(){if(!this.claimed.isEmpty()){let eyeVertex,vertex,maxDistance=0;const eyeFace=this.claimed.first().face;for(vertex=eyeFace.outside;vertex&&vertex.face===eyeFace;vertex=vertex.next){const distance=eyeFace.distanceToPlane(vertex.point);distance>maxDistance&&(maxDistance=distance,eyeVertex=vertex)}return eyeVertex}}computeHorizon(eyePoint,crossEdge,face,horizon){let edge;this.deleteFaceVertices(face),face.mark=2,edge=crossEdge?crossEdge.next:crossEdge=face.getEdge(0);do{const oppositeEdge=edge.opposite,oppositeFace=oppositeEdge.face;0===oppositeFace.mark&&(oppositeFace.distanceToPlane(eyePoint)>this.tolerance?this.computeHorizon(eyePoint,oppositeEdge,oppositeFace,horizon):horizon.push(edge)),edge=edge.next}while(edge!==crossEdge)}addAdjoiningFace(eyeVertex,horizonEdge){const face=Face.createTriangle(eyeVertex,horizonEdge.tail(),horizonEdge.head());return this.faces.push(face),face.getEdge(-1).setOpposite(horizonEdge.opposite),face.getEdge(0)}addNewFaces(eyeVertex,horizon){let firstSideEdge,previousSideEdge;this.newFaces=[];for(let i=0;i<horizon.length;i+=1){const horizonEdge=horizon[i],sideEdge=this.addAdjoiningFace(eyeVertex,horizonEdge);firstSideEdge?sideEdge.next.setOpposite(previousSideEdge):firstSideEdge=sideEdge,this.newFaces.push(sideEdge.face),previousSideEdge=sideEdge}firstSideEdge.next.setOpposite(previousSideEdge)}oppositeFaceDistance(edge){return edge.face.distanceToPlane(edge.opposite.face.centroid)}doAdjacentMerge(face,mergeType){let edge=face.edge,convex=!0,it=0;do{if(it>=face.nVertices)throw Error("merge recursion limit exceeded");const oppositeFace=edge.opposite.face;let merge=!1;if(2===mergeType?(this.oppositeFaceDistance(edge)>-this.tolerance||this.oppositeFaceDistance(edge.opposite)>-this.tolerance)&&(merge=!0):face.area>oppositeFace.area?this.oppositeFaceDistance(edge)>-this.tolerance?merge=!0:this.oppositeFaceDistance(edge.opposite)>-this.tolerance&&(convex=!1):this.oppositeFaceDistance(edge.opposite)>-this.tolerance?merge=!0:this.oppositeFaceDistance(edge)>-this.tolerance&&(convex=!1),merge){const discardedFaces=face.mergeAdjacentFaces(edge,[]);for(let i=0;i<discardedFaces.length;i+=1)this.deleteFaceVertices(discardedFaces[i],face);return!0}edge=edge.next,it+=1}while(edge!==face.edge);return convex||(face.mark=1),!1}addVertexToHull(eyeVertex){const horizon=[];this.unclaimed.clear(),this.removeVertexFromFace(eyeVertex,eyeVertex.face),this.computeHorizon(eyeVertex.point,null,eyeVertex.face,horizon),this.addNewFaces(eyeVertex,horizon);for(let i=0;i<this.newFaces.length;i+=1){const face=this.newFaces[i];if(0===face.mark)for(;this.doAdjacentMerge(face,1););}for(let i=0;i<this.newFaces.length;i+=1){const face=this.newFaces[i];if(1===face.mark)for(face.mark=0;this.doAdjacentMerge(face,2););}this.resolveUnclaimedPoints(this.newFaces)}build(){let eyeVertex;for(this.createInitialSimplex();eyeVertex=this.nextVertexToAdd();)this.addVertexToHull(eyeVertex);this.reindexFaceAndVertices()}}const runner=(points,options={})=>{const instance=new QuickHull(points);return instance.build(),instance.collectFaces(options.skipTriangulation)},toPolygons$1=geometry=>(geometry=>(isIdentity(geometry.transforms)||(geometry.polygons=geometry.polygons.map((polygon=>transform$7(geometry.transforms,polygon))),geometry.transforms=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),geometry))(geometry).polygons,isA$3=object=>!!(object&&"object"==typeof object&&"polygons"in object&&"transforms"in object&&Array.isArray(object.polygons)&&"length"in object.transforms),toPoints$2=geometry=>toPolygons$1(geometry).map((polygon=>toVertices$1(polygon))),transform$6=(matrix,geometry)=>{const transforms=multiply$1([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],matrix,geometry.transforms);return Object.assign({},geometry,{transforms:transforms})},validateManifold=object=>{const edgeCount=new Map;object.polygons.forEach((({vertices:vertices})=>{vertices.forEach(((v,i)=>{const edge=`${v}/${vertices[(i+1)%vertices.length]}`,count=edgeCount.has(edge)?edgeCount.get(edge):0;edgeCount.set(edge,count+1)}))}));const nonManifold=[];if(edgeCount.forEach(((count,edge)=>{const complementEdge=edge.split("/").reverse().join("/");count!==edgeCount.get(complementEdge)&&nonManifold.push(edge.replace("/"," -> "))})),nonManifold.length>0)throw new Error(`non-manifold edges ${nonManifold.length}\n${nonManifold.join("\n")}`)};var index$6=Object.freeze({__proto__:null,clone:clone$7,create:create$8,fromPoints:listOfLists=>{if(!Array.isArray(listOfLists))throw new Error("the given vertices must be an array");return create$8(listOfLists.map(create$7))},fromPointsConvex:uniquePoints=>{if(!Array.isArray(uniquePoints))throw new Error("the given points must be an array");const polygons=runner(uniquePoints,{skipTriangulation:!0}).map((face=>{const vertices=face.map((index=>uniquePoints[index]));return create$7(vertices)}));return create$8(polygons)},fromCompactBinary:data=>{if(1!==data[0])throw new Error("invalid compact binary data");const created=create$8();created.transforms=clone$a(data.slice(1,17));const numberOfVertices=data[21];let ci=22,vi=data.length-3*numberOfVertices;for(;vi<data.length;){const verticesPerPolygon=data[ci];ci++;const vertices=[];for(let i=0;i<verticesPerPolygon;i++)vertices.push(fromValues$3(data[vi],data[vi+1],data[vi+2])),vi+=3;created.polygons.push(create$7(vertices))}return data[17]>=0&&(created.color=[data[17],data[18],data[19],data[20]]),created},invert:geometry=>{const newPolygons=toPolygons$1(geometry).map((polygon=>invert$1(polygon)));return create$8(newPolygons)},isA:isA$3,toPoints:toPoints$2,toPolygons:toPolygons$1,toString:geometry=>{const polygons=toPolygons$1(geometry);let result="geom3 ("+polygons.length+" polygons):\n";return polygons.forEach((polygon=>{result+=" "+toString$6(polygon)+"\n"})),result},toCompactBinary:geometry=>{const polygons=geometry.polygons,transforms=geometry.transforms,numberOfPolygons=polygons.length,numberOfVertices=polygons.reduce(((count,polygon)=>count+polygon.vertices.length),0);let color=[-1,-1,-1,-1];geometry.color&&(color=geometry.color);const compacted=new Float32Array(22+numberOfPolygons+3*numberOfVertices);compacted[0]=1,compacted[1]=transforms[0],compacted[2]=transforms[1],compacted[3]=transforms[2],compacted[4]=transforms[3],compacted[5]=transforms[4],compacted[6]=transforms[5],compacted[7]=transforms[6],compacted[8]=transforms[7],compacted[9]=transforms[8],compacted[10]=transforms[9],compacted[11]=transforms[10],compacted[12]=transforms[11],compacted[13]=transforms[12],compacted[14]=transforms[13],compacted[15]=transforms[14],compacted[16]=transforms[15],compacted[17]=color[0],compacted[18]=color[1],compacted[19]=color[2],compacted[20]=color[3],compacted[21]=numberOfVertices;let ci=22,vi=ci+numberOfPolygons;return polygons.forEach((polygon=>{const vertices=toVertices$1(polygon);compacted[ci]=vertices.length,ci++;for(let i=0;i<vertices.length;i++){const vertex=vertices[i];compacted[vi+0]=vertex[0],compacted[vi+1]=vertex[1],compacted[vi+2]=vertex[2],vi+=3}})),compacted},transform:transform$6,validate:object=>{if(!isA$3(object))throw new Error("invalid geom3 structure");if(object.polygons.forEach(validate$4),validateManifold(object),!object.transforms.every(Number.isFinite))throw new Error(`geom3 invalid transforms ${object.transforms}`)}});const clone$4=geometry=>Object.assign({},geometry),close=geometry=>{if(geometry.isClosed)return geometry;const cloned=clone$4(geometry);if(cloned.isClosed=!0,cloned.points.length>1){const points=cloned.points,p0=points[0];let pn=points[points.length-1];for(;distance(p0,pn)<EPS*EPS&&(points.pop(),1!==points.length);)pn=points[points.length-1]}return cloned},create$5=points=>(void 0===points&&(points=[]),{points:points,isClosed:!1,transforms:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}),fromPoints$2=(options,points)=>{let{closed:closed}=Object.assign({},{closed:!1},options),created=create$5();if(created.points=points.map((point=>clone$8(point))),created.points.length>1){const p0=created.points[0],pn=created.points[created.points.length-1];distance(p0,pn)<EPS*EPS&&(closed=!0)}return!0===closed&&(created=close(created)),created},toPoints$1=geometry=>(geometry=>(isIdentity(geometry.transforms)||(geometry.points=geometry.points.map((point=>transform$b([0,0],point,geometry.transforms))),geometry.transforms=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),geometry))(geometry).points,concat=(...paths)=>{let isClosed=!1,newPoints=[];return paths.forEach(((path,i)=>{const tmp=toPoints$1(path).slice();if(newPoints.length>0&&tmp.length>0&&equals$6(tmp[0],newPoints[newPoints.length-1])&&tmp.shift(),tmp.length>0&&isClosed)throw new Error(`Cannot concatenate to a closed path; check the ${i}th path`);isClosed=path.isClosed,newPoints=newPoints.concat(tmp)})),fromPoints$2({closed:isClosed},newPoints)},appendPoints=(points,geometry)=>concat(geometry,create$5(points)),isA$2=object=>!!(object&&"object"==typeof object&&"points"in object&&"transforms"in object&&"isClosed"in object&&Array.isArray(object.points)&&"length"in object.transforms),transform$5=(matrix,geometry)=>{const transforms=multiply$1([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],matrix,geometry.transforms);return Object.assign({},geometry,{transforms:transforms})};var index$5=Object.freeze({__proto__:null,appendArc:(options,geometry)=>{let{endpoint:endpoint,radius:radius,xaxisRotation:xaxisRotation,clockwise:clockwise,large:large,segments:segments}=Object.assign({},{radius:[0,0],xaxisRotation:0,clockwise:!1,large:!1,segments:16},options);if(!Array.isArray(endpoint))throw new Error("endpoint must be an array of X and Y values");if(endpoint.length<2)throw new Error("endpoint must contain X and Y values");if(endpoint=clone$8(endpoint),!Array.isArray(radius))throw new Error("radius must be an array of X and Y values");if(radius.length<2)throw new Error("radius must contain X and Y values");if(segments<4)throw new Error("segments must be four or more");if(geometry.isClosed)throw new Error("the given path cannot be closed");const points=toPoints$1(geometry);if(points.length<1)throw new Error("the given path must contain one or more points (as the starting point for the arc)");let xRadius=radius[0],yRadius=radius[1];const startpoint=points[points.length-1];xRadius=Math.round(1e5*xRadius)/1e5,yRadius=Math.round(1e5*yRadius)/1e5,endpoint=fromValues$2(Math.round(1e5*endpoint[0])/1e5,Math.round(1e5*endpoint[1])/1e5);const sweepFlag=!clockwise;let newPoints=[];if(0===xRadius||0===yRadius)newPoints.push(endpoint);else{xRadius=Math.abs(xRadius),yRadius=Math.abs(yRadius);const phi=xaxisRotation,cosPhi=Math.cos(phi),sinPhi=Math.sin(phi),minusHalfDistance=subtract$1([0,0],startpoint,endpoint);scale$1(minusHalfDistance,minusHalfDistance,.5);const x=Math.round(1e5*(cosPhi*minusHalfDistance[0]+sinPhi*minusHalfDistance[1]))/1e5,y=Math.round(1e5*(-sinPhi*minusHalfDistance[0]+cosPhi*minusHalfDistance[1]))/1e5,startTranslated=fromValues$2(x,y),bigLambda=startTranslated[0]*startTranslated[0]/(xRadius*xRadius)+startTranslated[1]*startTranslated[1]/(yRadius*yRadius);if(bigLambda>1){const sqrtBigLambda=Math.sqrt(bigLambda);xRadius*=sqrtBigLambda,yRadius*=sqrtBigLambda,xRadius=Math.round(1e5*xRadius)/1e5,yRadius=Math.round(1e5*yRadius)/1e5}let multiplier1=Math.sqrt((xRadius*xRadius*yRadius*yRadius-xRadius*xRadius*startTranslated[1]*startTranslated[1]-yRadius*yRadius*startTranslated[0]*startTranslated[0])/(xRadius*xRadius*startTranslated[1]*startTranslated[1]+yRadius*yRadius*startTranslated[0]*startTranslated[0]));sweepFlag===large&&(multiplier1=-multiplier1);const centerTranslated=fromValues$2(xRadius*startTranslated[1]/yRadius,-yRadius*startTranslated[0]/xRadius);scale$1(centerTranslated,centerTranslated,multiplier1);let center=fromValues$2(cosPhi*centerTranslated[0]-sinPhi*centerTranslated[1],sinPhi*centerTranslated[0]+cosPhi*centerTranslated[1]);center=add(center,center,scale$1([0,0],add([0,0],startpoint,endpoint),.5));const vector1=fromValues$2((startTranslated[0]-centerTranslated[0])/xRadius,(startTranslated[1]-centerTranslated[1])/yRadius),vector2=fromValues$2((-startTranslated[0]-centerTranslated[0])/xRadius,(-startTranslated[1]-centerTranslated[1])/yRadius),theta1=angleRadians(vector1);let deltatheta=angleRadians(vector2)-theta1;deltatheta%=TAU,!sweepFlag&&deltatheta>0?deltatheta-=TAU:sweepFlag&&deltatheta<0&&(deltatheta+=TAU);let numSteps=Math.ceil(Math.abs(deltatheta)/TAU*segments)+1;numSteps<1&&(numSteps=1);for(let step=1;step<numSteps;step++){const theta=theta1+step/numSteps*deltatheta,cosTheta=Math.cos(theta),sinTheta=Math.sin(theta),point=fromValues$2(cosPhi*xRadius*cosTheta-sinPhi*yRadius*sinTheta,sinPhi*xRadius*cosTheta+cosPhi*yRadius*sinTheta);add(point,point,center),newPoints.push(point)}numSteps&&newPoints.push(options.endpoint)}return newPoints=points.concat(newPoints),fromPoints$2({},newPoints)},appendBezier:(options,geometry)=>{let{controlPoints:controlPoints,segments:segments}=Object.assign({},{segments:16},options);if(!Array.isArray(controlPoints))throw new Error("controlPoints must be an array of one or more points");if(controlPoints.length<1)throw new Error("controlPoints must be an array of one or more points");if(segments<4)throw new Error("segments must be four or more");if(geometry.isClosed)throw new Error("the given geometry cannot be closed");const points=toPoints$1(geometry);if(points.length<1)throw new Error("the given path must contain one or more points (as the starting point for the bezier curve)");if(controlPoints=controlPoints.slice(),null===controlPoints[0]){if(controlPoints.length<2)throw new Error("a null control point must be passed with one more control points");let lastBezierControlPoint=points[points.length-2];if("lastBezierControlPoint"in geometry&&(lastBezierControlPoint=geometry.lastBezierControlPoint),!Array.isArray(lastBezierControlPoint))throw new Error("the given path must contain TWO or more points if given a null control point");const controlPoint=scale$1([0,0],points[points.length-1],2);subtract$1(controlPoint,controlPoint,lastBezierControlPoint),controlPoints[0]=controlPoint}controlPoints.unshift(points[points.length-1]);const bezierOrder=controlPoints.length-1,factorials=[];let fact=1;for(let i=0;i<=bezierOrder;++i)i>0&&(fact*=i),factorials.push(fact);const binomials=[];for(let i=0;i<=bezierOrder;++i){const binomial=factorials[bezierOrder]/(factorials[i]*factorials[bezierOrder-i]);binomials.push(binomial)}const v0=[0,0],v1=[0,0],v3=[0,0,0],getPointForT=t=>{let tk=1,oneMinusTNMinusK=Math.pow(1-t,bezierOrder);const invOneMinusT=1!==t?1/(1-t):1,point=[0,0];for(let k=0;k<=bezierOrder;++k){k===bezierOrder&&(oneMinusTNMinusK=1);const bernsteinCoefficient=binomials[k]*tk*oneMinusTNMinusK,derivativePoint=scale$1(v0,controlPoints[k],bernsteinCoefficient);add(point,point,derivativePoint),tk*=t,oneMinusTNMinusK*=invOneMinusT}return point},newPoints=[],newPointsT=[],numSteps=bezierOrder+1;for(let i=0;i<numSteps;++i){const t=i/(numSteps-1),point=getPointForT(t);newPoints.push(point),newPointsT.push(t)}let subdivideBase=1;const maxAngle=TAU/segments,maxSinAngle=Math.sin(maxAngle);for(;subdivideBase<newPoints.length-1;){const dir1=subtract$1(v0,newPoints[subdivideBase],newPoints[subdivideBase-1]);normalize(dir1,dir1);const dir2=subtract$1(v1,newPoints[subdivideBase+1],newPoints[subdivideBase]);normalize(dir2,dir2);const sinAngle=cross(v3,dir1,dir2);if(Math.abs(sinAngle[2])>maxSinAngle){const t0=newPointsT[subdivideBase-1],t1=newPointsT[subdivideBase+1],newt0=t0+1*(t1-t0)/3,newt1=t0+2*(t1-t0)/3,point0=getPointForT(newt0),point1=getPointForT(newt1);newPoints.splice(subdivideBase,1,point0,point1),newPointsT.splice(subdivideBase,1,newt0,newt1),subdivideBase--,subdivideBase<1&&(subdivideBase=1)}else++subdivideBase}newPoints.shift();const result=appendPoints(newPoints,geometry);return result.lastBezierControlPoint=controlPoints[controlPoints.length-2],result},appendPoints:appendPoints,clone:clone$4,close:close,concat:concat,create:create$5,equals:(a,b)=>{if(a.isClosed!==b.isClosed)return!1;if(a.points.length!==b.points.length)return!1;const aPoints=toPoints$1(a),bPoints=toPoints$1(b),length=aPoints.length;let offset=0;do{let unequal=!1;for(let i=0;i<length;i++)if(!equals$6(aPoints[i],bPoints[(i+offset)%length])){unequal=!0;break}if(!1===unequal)return!0;if(!a.isClosed)return!1}while(++offset<length);return!1},fromPoints:fromPoints$2,fromCompactBinary:data=>{if(2!==data[0])throw new Error("invalid compact binary data");const created=create$5();created.transforms=clone$a(data.slice(1,17)),created.isClosed=!!data[17];for(let i=22;i<data.length;i+=2){const point=fromValues$2(data[i],data[i+1]);created.points.push(point)}return data[18]>=0&&(created.color=[data[18],data[19],data[20],data[21]]),created},isA:isA$2,reverse:geometry=>{const cloned=clone$4(geometry);return cloned.points=geometry.points.slice().reverse(),cloned},toPoints:toPoints$1,toString:geometry=>{const points=toPoints$1(geometry);let result="path ("+points.length+" points, "+geometry.isClosed+"):\n[\n";return points.forEach((point=>{result+=" "+toString$9(point)+",\n"})),result+="]\n",result},toCompactBinary:geometry=>{const points=geometry.points,transforms=geometry.transforms;let color=[-1,-1,-1,-1];geometry.color&&(color=geometry.color);const compacted=new Float32Array(22+2*points.length);compacted[0]=2,compacted[1]=transforms[0],compacted[2]=transforms[1],compacted[3]=transforms[2],compacted[4]=transforms[3],compacted[5]=transforms[4],compacted[6]=transforms[5],compacted[7]=transforms[6],compacted[8]=transforms[7],compacted[9]=transforms[8],compacted[10]=transforms[9],compacted[11]=transforms[10],compacted[12]=transforms[11],compacted[13]=transforms[12],compacted[14]=transforms[13],compacted[15]=transforms[14],compacted[16]=transforms[15],compacted[17]=geometry.isClosed?1:0,compacted[18]=color[0],compacted[19]=color[1],compacted[20]=color[2],compacted[21]=color[3];for(let j=0;j<points.length;j++){const ci=2*j+22,point=points[j];compacted[ci]=point[0],compacted[ci+1]=point[1]}return compacted},transform:transform$5,validate:object=>{if(!isA$2(object))throw new Error("invalid path2 structure");if(object.points.length>1)for(let i=0;i<object.points.length;i++)if(equals$6(object.points[i],object.points[(i+1)%object.points.length]))throw new Error(`path2 has duplicate point ${object.points[i]}`);if(object.points.forEach((point=>{if(!point.every(Number.isFinite))throw new Error(`path2 invalid point ${point}`)})),!object.transforms.every(Number.isFinite))throw new Error(`path2 invalid transforms ${object.transforms}`)}});const colorize=(color,...objects)=>{if(!Array.isArray(color))throw new Error("color must be an array");if(color.length<3)throw new Error("color must contain R, G and B values");3===color.length&&(color=[color[0],color[1],color[2],1]);const results=objects.map((object=>isA$5(object)?((color,object)=>{const newGeom2=clone$b(object);return newGeom2.color=color,newGeom2})(color,object):isA$3(object)?((color,object)=>{const newGeom3=clone$7(object);return newGeom3.color=color,newGeom3})(color,object):isA$2(object)?((color,object)=>{const newPath2=clone$4(object);return newPath2.color=color,newPath2})(color,object):isA$4(object)?((color,object)=>{const newPoly=clone$6(object);return newPoly.color=color,newPoly})(color,object):Array.isArray(object)?colorize(color,...object):(object.color=color,object)));return 1===results.length?results[0]:results},flatten=arr=>arr.reduce(((acc,val)=>Array.isArray(val)?acc.concat(flatten(val)):acc.concat(val)),[]),hueToColorComponent=(p,q,t)=>(t<0&&(t+=1),t>1&&(t-=1),t<1/6?p+6*(q-p)*t:t<.5?q:t<2/3?p+(q-p)*(2/3-t)*6:p),getPointType=function(points){let firstPointType=null;return points.forEach((point=>{let pType="";if(Number.isFinite(point))pType="float_single";else{if(!Array.isArray(point))throw new Error("Bezier points must all be numbers or arrays of number.");point.forEach((val=>{if(!Number.isFinite(val))throw new Error("Bezier point values must all be numbers.")})),pType="float_"+point.length}if(null==firstPointType)firstPointType=pType;else if(firstPointType!==pType)throw new Error("Bezier points must be either all numbers or all arrays of numbers of the same size.")})),firstPointType},getPermutations=function(c){const permutations=[];for(let i=0;i<=c;i++)permutations.push(factorial(c)/(factorial(i)*factorial(c-i)));return permutations},factorial=function(b){let out=1;for(let i=2;i<=b;i++)out*=i;return out},valueAt=(t,bezier)=>{if(t<0||t>1)throw new Error("Bezier valueAt() input must be between 0 and 1");if("float_single"===bezier.pointType)return bezierFunction(bezier,bezier.points,t);{const result=[];for(let i=0;i<bezier.dimensions;i++){const singleDimensionPoints=[];for(let j=0;j<bezier.points.length;j++)singleDimensionPoints.push(bezier.points[j][i]);result.push(bezierFunction(bezier,singleDimensionPoints,t))}return result}},bezierFunction=function(bezier,p,t){const n=p.length-1;let result=0;for(let i=0;i<=n;i++)result+=bezier.permutations[i]*Math.pow(1-t,n-i)*Math.pow(t,i)*p[i];return result},bezierTangent=function(bezier,p,t){const n=p.length-1;let result=0;for(let i=0;i<n;i++){const q=n*(p[i+1]-p[i]);result+=bezier.tangentPermutations[i]*Math.pow(1-t,n-1-i)*Math.pow(t,i)*q}return result},lengths=(segments,bezier)=>{let sum=0;const lengths=[0];let previous=valueAt(0,bezier);for(let index=1;index<=segments;index++){const current=valueAt(index/segments,bezier);sum+=distanceBetween(current,previous),lengths.push(sum),previous=current}return lengths},distanceBetween=(a,b)=>{if(Number.isFinite(a)&&Number.isFinite(b))return Math.abs(a-b);if(Array.isArray(a)&&Array.isArray(b)){if(a.length!==b.length)throw new Error("The operands must have the same number of dimensions.");let sum=0;for(let i=0;i<a.length;i++)sum+=(b[i]-a[i])*(b[i]-a[i]);return Math.sqrt(sum)}throw new Error("The operands must be of the same type, either number or array.")};var index$4=Object.freeze({__proto__:null,create:points=>{if(!Array.isArray(points))throw new Error("Bezier points must be a valid array/");if(points.length<2)throw new Error("Bezier points must contain at least 2 values.");const pointType=getPointType(points);return{points:points,pointType:pointType,dimensions:"float_single"===pointType?0:points[0].length,permutations:getPermutations(points.length-1),tangentPermutations:getPermutations(points.length-2)}},valueAt:valueAt,tangentAt:(t,bezier)=>{if(t<0||t>1)throw new Error("Bezier tangentAt() input must be between 0 and 1");if("float_single"===bezier.pointType)return bezierTangent(bezier,bezier.points,t);{const result=[];for(let i=0;i<bezier.dimensions;i++){const singleDimensionPoints=[];for(let j=0;j<bezier.points.length;j++)singleDimensionPoints.push(bezier.points[j][i]);result.push(bezierTangent(bezier,singleDimensionPoints,t))}return result}},lengths:lengths,length:(segments,bezier)=>lengths(segments,bezier)[segments],arcLengthToT:(options,bezier)=>{const{distance:distance,segments:segments}=Object.assign({},{distance:0,segments:100},options),arcLengths=lengths(segments,bezier);let startIndex=0,endIndex=segments;for(;startIndex<=endIndex;){const middleIndex=Math.floor(startIndex+(endIndex-startIndex)/2),diff=arcLengths[middleIndex]-distance;if(diff<0)startIndex=middleIndex+1;else{if(!(diff>0)){endIndex=middleIndex;break}endIndex=middleIndex-1}}const targetIndex=endIndex;if(arcLengths[targetIndex]===distance)return targetIndex/segments;const lengthBefore=arcLengths[targetIndex];return(targetIndex+(distance-lengthBefore)/(arcLengths[targetIndex+1]-lengthBefore))/segments}});const area$1=points=>{let area=0;for(let i=0;i<points.length;i++){const j=(i+1)%points.length;area+=points[i][0]*points[j][1],area-=points[j][0]*points[i][1]}return area/2},measureArea$1=polygon=>area$1(polygon.points),create$3=points=>((void 0===points||points.length<3)&&(points=[]),{points:points}),reverse$3=polygon=>{const points=polygon.points.slice().reverse();return create$3(points)},arePointsInside=(points,polygon)=>0===points.length||polygon.points.length<3?0:(measureArea$1(polygon)<0&&(polygon=reverse$3(polygon)),points.reduce(((acc,point)=>acc+isPointInside(point,polygon.points)),0)===points.length?1:0),isPointInside=(point,polygon)=>{const numPoints=polygon.length,tx=point[0],ty=point[1];let vtx0=polygon[numPoints-1],vtx1=polygon[0],yFlag0=vtx0[1]>ty,insideFlag=0,i=0;for(let j=numPoints+1;--j;){const yFlag1=vtx1[1]>ty;if(yFlag0!==yFlag1){const xFlag0=vtx0[0]>tx,xFlag1=vtx1[0]>tx;(xFlag0&&xFlag1||vtx1[0]-(vtx1[1]-ty)*(vtx0[0]-vtx1[0])/(vtx0[1]-vtx1[1])>=tx)&&(insideFlag=!insideFlag)}yFlag0=yFlag1,vtx0=vtx1,vtx1=polygon[++i]}return insideFlag},isA$1=object=>!!(object&&"object"==typeof object&&"points"in object&&Array.isArray(object.points)),crossBetweenSegments=(p1,p2,p3)=>{const X1=p2[0]-p1[0],Y1=p2[1]-p1[1],X2=p3[0]-p1[0];return X1*(p3[1]-p1[1])-Y1*X2};var index$3=Object.freeze({__proto__:null,arePointsInside:arePointsInside,clone:polygon=>Object.assign({},polygon),create:create$3,isA:isA$1,isConvex:polygon=>{const numPoints=polygon.points.length;if(numPoints>2){const points=polygon.points;let prev=0,curr=0;for(let i=0;i<numPoints;i++)if(curr=crossBetweenSegments(points[i],points[(i+1)%numPoints],points[(i+2)%numPoints]),0!==curr){if(curr*prev<0)return!1;prev=curr}}return!0},isSimple:polygon=>{const numPoints=polygon.points.length;if(numPoints<3)return!1;if(3===numPoints)return!0;const points=polygon.points,found=new Set;if(points.forEach((v=>found.add(v.toString()))),found.size!==numPoints)return!1;for(let i=0;i<numPoints;i++)for(let j=i+2;j<numPoints;j++){const k=(j+1)%numPoints;if(i!==k){const s0=points[i],s1=points[(i+1)%numPoints],z0=points[j],z1=points[k];if(intersect$1(s0,s1,z0,z1))return!1}}return!0},measureArea:measureArea$1,measureBoundingBox:polygon=>{const points=polygon.points,numPoints=points.length,min=0===numPoints?[0,0]:clone$8(points[0]),max=clone$8(min);for(let i=1;i<numPoints;i++)min$1(min,min,points[i]),max$1(max,max,points[i]);return[min,max]},reverse:reverse$3,toPoints:polygon=>polygon.points,toString:polygon=>`poly2: [${polygon.points.map(toString$9).join(", ")}]`,transform:(matrix,polygon)=>{const points=polygon.points.map((point=>transform$b([0,0],point,matrix)));return isMirroring(matrix)&&points.reverse(),create$3(points)},validate:object=>{if(!isA$1(object))throw new Error("invalid poly2 structure");if(object.points.length<3)throw new Error(`poly2 not enough points ${object.points.length}`);if(measureArea$1(object)<=0)throw new Error("poly2 area must be greater than zero");for(let i=0;i<object.points.length;i++)if(equals$6(object.points[i],object.points[(i+1)%object.points.length]))throw new Error(`poly2 duplicate point at ${i}: [${object.points[i]}]`);object.points.forEach((point=>{if(2!==point.length)throw new Error(`poly2 invalid point ${point}`);if(!point.every(Number.isFinite))throw new Error(`poly2 invalid point ${point}`)}))}});const calculatePlane=slice=>{if(slice.contours.length<1)throw new Error("slices must have at least one contour to calculate a plane");const middle=[0,0,0];let n=0;slice.contours.forEach((contour=>{contour.forEach((vertex=>{add$1(middle,middle,vertex),n++}))})),scale$3(middle,middle,1/n);let farthestBefore,farthestVertex,farthestAfter,farthestContour=[],distance=0;slice.contours.forEach((contour=>{let prev=contour[contour.length-1];contour.forEach((vertex=>{if(!equals$7(prev,vertex)){const d=squaredDistance$1(middle,vertex);d>distance&&(farthestContour=contour,farthestBefore=prev,farthestVertex=vertex,distance=d)}prev=vertex}))}));let prev=farthestContour[farthestContour.length-1];for(let i=0;i<farthestContour.length;i++){const vertex=farthestContour[i];if(!equals$7(prev,vertex)&&equals$7(prev,farthestVertex)){farthestAfter=vertex;break}prev=vertex}return fromPoints$4([0,0,0,0],farthestBefore,farthestVertex,farthestAfter)},create$2=(contours=[])=>({contours:contours}),equals$3=(a,b)=>{if(a.contours.length!==b.contours.length)return!1;const len=a.contours.length;for(let i=0;i<len;i++){const aVertex=a.contours[i];for(let j=0;j<len;j++){const bVertex=b.contours[j];if(!equals$7(aVertex,bVertex))return!1}}return!0},fromGeom2=geometry=>{const contours=toOutlines(geometry).map((outline=>outline.map((point=>fromVec2([0,0,0],point)))));return create$2(contours)},fromVertices=vertices=>{if(!Array.isArray(vertices))throw new Error("the given vertices must be an array");if(vertices.length<3)throw new Error("the given vertices must contain THREE or more vertices");const cloned=vertices.map((vertex=>3===vertex.length?vertex:fromVec2([0,0,0],vertex)));return create$2([cloned])},isA=object=>!!(object&&"object"==typeof object&&"contours"in object&&Array.isArray(object.contours)),reverse$2=slice=>{const contours=slice.contours.map((contour=>contour.slice().reverse()));return create$2(contours)},toEdges=slice=>{const edges=[];return slice.contours.forEach((contour=>{contour.forEach(((vertex,i)=>{const next=contour[(i+1)%contour.length];edges.push([vertex,next])}))})),edges};class Node$2{constructor(i,x,y){this.i=i,this.x=x,this.y=y,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}}const insertNode=(i,x,y,last)=>{const p=new Node$2(i,x,y);return last?(p.next=last.next,p.prev=last,last.next.prev=p,last.next=p):(p.prev=p,p.next=p),p},removeNode=p=>{p.next.prev=p.prev,p.prev.next=p.next,p.prevZ&&(p.prevZ.nextZ=p.nextZ),p.nextZ&&(p.nextZ.prevZ=p.prevZ)},pointInTriangle=(ax,ay,bx,by,cx,cy,px,py)=>(cx-px)*(ay-py)-(ax-px)*(cy-py)>=0&&(ax-px)*(by-py)-(bx-px)*(ay-py)>=0&&(bx-px)*(cy-py)-(cx-px)*(by-py)>=0,area=(p,q,r)=>(q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y),linkedPolygon=(data,start,end,dim,clockwise)=>{let last;if(clockwise===signedArea$1(data,start,end,dim)>0)for(let i=start;i<end;i+=dim)last=insertNode(i,data[i],data[i+1],last);else for(let i=end-dim;i>=start;i-=dim)last=insertNode(i,data[i],data[i+1],last);return last&&equals$2(last,last.next)&&(removeNode(last),last=last.next),last},filterPoints=(start,end)=>{if(!start)return start;end||(end=start);let again,p=start;do{if(again=!1,p.steiner||!equals$2(p,p.next)&&0!==area(p.prev,p,p.next))p=p.next;else{if(removeNode(p),p=end=p.prev,p===p.next)break;again=!0}}while(again||p!==end);return end},cureLocalIntersections=(start,triangles,dim)=>{let p=start;do{const a=p.prev,b=p.next.next;!equals$2(a,b)&&intersects(a,p,p.next,b)&&locallyInside(a,b)&&locallyInside(b,a)&&(triangles.push(a.i/dim),triangles.push(p.i/dim),triangles.push(b.i/dim),removeNode(p),removeNode(p.next),p=start=b),p=p.next}while(p!==start);return filterPoints(p)},locallyInside=(a,b)=>area(a.prev,a,a.next)<0?area(a,b,a.next)>=0&&area(a,a.prev,b)>=0:area(a,b,a.prev)<0||area(a,a.next,b)<0,splitPolygon=(a,b)=>{const a2=new Node$2(a.i,a.x,a.y),b2=new Node$2(b.i,b.x,b.y),an=a.next,bp=b.prev;return a.next=b,b.prev=a,a2.next=an,an.prev=a2,b2.next=a2,a2.prev=b2,bp.next=b2,b2.prev=bp,b2},isValidDiagonal=(a,b)=>a.next.i!==b.i&&a.prev.i!==b.i&&!((a,b)=>{let p=a;do{if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i&&intersects(p,p.next,a,b))return!0;p=p.next}while(p!==a);return!1})(a,b)&&(locallyInside(a,b)&&locallyInside(b,a)&&((a,b)=>{let p=a,inside=!1;const px=(a.x+b.x)/2,py=(a.y+b.y)/2;do{p.y>py!=p.next.y>py&&p.next.y!==p.y&&px<(p.next.x-p.x)*(py-p.y)/(p.next.y-p.y)+p.x&&(inside=!inside),p=p.next}while(p!==a);return inside})(a,b)&&(area(a.prev,a,b.prev)||area(a,b.prev,b))||equals$2(a,b)&&area(a.prev,a,a.next)>0&&area(b.prev,b,b.next)>0),intersects=(p1,q1,p2,q2)=>{const o1=Math.sign(area(p1,q1,p2)),o2=Math.sign(area(p1,q1,q2)),o3=Math.sign(area(p2,q2,p1)),o4=Math.sign(area(p2,q2,q1));return o1!==o2&&o3!==o4||!(0!==o1||!onSegment(p1,p2,q1))||!(0!==o2||!onSegment(p1,q2,q1))||!(0!==o3||!onSegment(p2,p1,q2))||!(0!==o4||!onSegment(p2,q1,q2))},onSegment=(p,q,r)=>q.x<=Math.max(p.x,r.x)&&q.x>=Math.min(p.x,r.x)&&q.y<=Math.max(p.y,r.y)&&q.y>=Math.min(p.y,r.y),signedArea$1=(data,start,end,dim)=>{let sum=0;for(let i=start,j=end-dim;i<end;i+=dim)sum+=(data[j]-data[i])*(data[i+1]+data[j+1]),j=i;return sum},equals$2=(p1,p2)=>p1.x===p2.x&&p1.y===p2.y,eliminateHole=(hole,outerNode)=>{const bridge=findHoleBridge(hole,outerNode);if(!bridge)return outerNode;const bridgeReverse=splitPolygon(bridge,hole),filteredBridge=filterPoints(bridge,bridge.next);return filterPoints(bridgeReverse,bridgeReverse.next),outerNode===bridge?filteredBridge:outerNode},findHoleBridge=(hole,outerNode)=>{let p=outerNode;const hx=hole.x,hy=hole.y;let m,qx=-1/0;do{if(hy<=p.y&&hy>=p.next.y&&p.next.y!==p.y){const x=p.x+(hy-p.y)*(p.next.x-p.x)/(p.next.y-p.y);if(x<=hx&&x>qx){if(qx=x,x===hx){if(hy===p.y)return p;if(hy===p.next.y)return p.next}m=p.x<p.next.x?p:p.next}}p=p.next}while(p!==outerNode);if(!m)return null;if(hx===qx)return m;const stop=m,mx=m.x,my=m.y;let tanMin=1/0;p=m;do{if(hx>=p.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hy<my?hx:qx,hy,mx,my,hy<my?qx:hx,hy,p.x,p.y)){const tan=Math.abs(hy-p.y)/(hx-p.x);locallyInside(p,hole)&&(tan<tanMin||tan===tanMin&&(p.x>m.x||p.x===m.x&&sectorContainsSector(m,p)))&&(m=p,tanMin=tan)}p=p.next}while(p!==stop);return m},sectorContainsSector=(m,p)=>area(m.prev,m,p.prev)<0&&area(p.next,m,m.next)<0,getLeftmost=start=>{let p=start,leftmost=start;do{(p.x<leftmost.x||p.x===leftmost.x&&p.y<leftmost.y)&&(leftmost=p),p=p.next}while(p!==start);return leftmost},triangulate=(data,holeIndices,dim=2)=>{const hasHoles=holeIndices&&holeIndices.length,outerLen=hasHoles?holeIndices[0]*dim:data.length;let outerNode=linkedPolygon(data,0,outerLen,dim,!0);const triangles=[];if(!outerNode||outerNode.next===outerNode.prev)return triangles;let minX,minY,maxX,maxY,invSize;if(hasHoles&&(outerNode=((data,holeIndices,outerNode,dim)=>{const queue=[];for(let i=0,len=holeIndices.length;i<len;i++){const start=holeIndices[i]*dim,end=i<len-1?holeIndices[i+1]*dim:data.length,list=linkedPolygon(data,start,end,dim,!1);list===list.next&&(list.steiner=!0),queue.push(getLeftmost(list))}queue.sort(((a,b)=>a.x-b.x));for(let i=0;i<queue.length;i++)outerNode=eliminateHole(queue[i],outerNode),outerNode=filterPoints(outerNode,outerNode.next);return outerNode})(data,holeIndices,outerNode,dim)),data.length>80*dim){minX=maxX=data[0],minY=maxY=data[1];for(let i=dim;i<outerLen;i+=dim){const x=data[i],y=data[i+1];x<minX&&(minX=x),y<minY&&(minY=y),x>maxX&&(maxX=x),y>maxY&&(maxY=y)}invSize=Math.max(maxX-minX,maxY-minY),invSize=0!==invSize?1/invSize:0}return earcutLinked(outerNode,triangles,dim,minX,minY,invSize),triangles},earcutLinked=(ear,triangles,dim,minX,minY,invSize,pass)=>{if(!ear)return;!pass&&invSize&&indexCurve(ear,minX,minY,invSize);let prev,next,stop=ear;for(;ear.prev!==ear.next;)if(prev=ear.prev,next=ear.next,invSize?isEarHashed(ear,minX,minY,invSize):isEar(ear))triangles.push(prev.i/dim),triangles.push(ear.i/dim),triangles.push(next.i/dim),removeNode(ear),ear=next.next,stop=next.next;else if((ear=next)===stop){pass?1===pass?(ear=cureLocalIntersections(filterPoints(ear),triangles,dim),earcutLinked(ear,triangles,dim,minX,minY,invSize,2)):2===pass&&splitEarcut(ear,triangles,dim,minX,minY,invSize):earcutLinked(filterPoints(ear),triangles,dim,minX,minY,invSize,1);break}},isEar=ear=>{const a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return!1;let p=ear.next.next;for(;p!==ear.prev;){if(pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;p=p.next}return!0},isEarHashed=(ear,minX,minY,invSize)=>{const a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return!1;const minTX=a.x<b.x?a.x<c.x?a.x:c.x:b.x<c.x?b.x:c.x,minTY=a.y<b.y?a.y<c.y?a.y:c.y:b.y<c.y?b.y:c.y,maxTX=a.x>b.x?a.x>c.x?a.x:c.x:b.x>c.x?b.x:c.x,maxTY=a.y>b.y?a.y>c.y?a.y:c.y:b.y>c.y?b.y:c.y,minZ=zOrder(minTX,minTY,minX,minY,invSize),maxZ=zOrder(maxTX,maxTY,minX,minY,invSize);let p=ear.prevZ,n=ear.nextZ;for(;p&&p.z>=minZ&&n&&n.z<=maxZ;){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,n!==ear.prev&&n!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,n.x,n.y)&&area(n.prev,n,n.next)>=0)return!1;n=n.nextZ}for(;p&&p.z>=minZ;){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;n&&n.z<=maxZ;){if(n!==ear.prev&&n!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,n.x,n.y)&&area(n.prev,n,n.next)>=0)return!1;n=n.nextZ}return!0},splitEarcut=(start,triangles,dim,minX,minY,invSize)=>{let a=start;do{let b=a.next.next;for(;b!==a.prev;){if(a.i!==b.i&&isValidDiagonal(a,b)){let c=splitPolygon(a,b);return a=filterPoints(a,a.next),c=filterPoints(c,c.next),earcutLinked(a,triangles,dim,minX,minY,invSize),void earcutLinked(c,triangles,dim,minX,minY,invSize)}b=b.next}a=a.next}while(a!==start)},indexCurve=(start,minX,minY,invSize)=>{let p=start;do{null===p.z&&(p.z=zOrder(p.x,p.y,minX,minY,invSize)),p.prevZ=p.prev,p.nextZ=p.next,p=p.next}while(p!==start);p.prevZ.nextZ=null,p.prevZ=null,((list,fn)=>{let i,p,q,e,numMerges,inSize=1;do{p=list,list=null;let tail=null;for(numMerges=0;p;){numMerges++,q=p;let pSize=0;for(i=0;i<inSize&&(pSize++,q=q.nextZ,q);i++);let qSize=inSize;for(;pSize>0||qSize>0&&q;)0!==pSize&&(0===qSize||!q||fn(p)<=fn(q))?(e=p,p=p.nextZ,pSize--):(e=q,q=q.nextZ,qSize--),tail?tail.nextZ=e:list=e,e.prevZ=tail,tail=e;p=q}tail.nextZ=null,inSize*=2}while(numMerges>1)})(p,(p=>p.z))},zOrder=(x,y,minX,minY,invSize)=>(x=1431655765&((x=858993459&((x=252645135&((x=16711935&((x=32767*(x-minX)*invSize)|x<<8))|x<<4))|x<<2))|x<<1))|(y=1431655765&((y=858993459&((y=252645135&((y=16711935&((y=32767*(y-minY)*invSize)|y<<8))|y<<4))|y<<2))|y<<1))<<1,minIndex=(list,score)=>{let bestIndex,best;return list.forEach(((item,index)=>{const value=score(item);(void 0===best||value<best)&&(bestIndex=index,best=value)})),bestIndex};class PolygonHierarchy{constructor(slice){this.plane=calculatePlane(slice);const rightVector=orthogonal([0,0,0],this.plane),perp=cross$1([0,0,0],this.plane,rightVector);this.v=normalize$1(perp,perp),this.u=cross$1([0,0,0],this.v,this.plane),this.basisMap=new Map;const projected=slice.contours.map((part=>part.map((v=>this.to2D(v))))),geometry=create$a(projected);this.roots=(geometry=>{const outlines=toOutlines(geometry),solids=[],holes=[];outlines.forEach(((outline,i)=>{const a=area$1(outline);a<0?holes.push(i):a>0&&solids.push(i)}));const children=[],parents=[];return solids.forEach(((s,i)=>{const solid=outlines[s];children[i]=[],holes.forEach(((h,j)=>{const hole=outlines[h];arePointsInside([hole[0]],create$3(solid))&&(children[i].push(h),parents[j]||(parents[j]=[]),parents[j].push(i))}))})),holes.forEach(((h,j)=>{if(parents[j]&&parents[j].length>1){const directParent=minIndex(parents[j],(p=>children[p].length));parents[j].forEach(((p,i)=>{i!==directParent&&(children[p]=children[p].filter((c=>c!==h)))}))}})),children.map(((holes,i)=>({solid:outlines[solids[i]],holes:holes.map((h=>outlines[h]))})))})(geometry)}to2D(vector3){const vector2=fromValues$2(dot$2(vector3,this.u),dot$2(vector3,this.v));return this.basisMap.set(vector2,vector3),vector2}to3D(vector2){const original=this.basisMap.get(vector2);if(original)return original;{console.log("Warning: point not in original slice");const v1=scale$3([0,0,0],this.u,vector2[0]),v2=scale$3([0,0,0],this.v,vector2[1]),planeOrigin=scale$3([0,0,0],this.plane,this.plane[3]),v3=add$1(v1,v1,planeOrigin);return add$1(v2,v2,v3)}}}const toPolygons=slice=>{const hierarchy=new PolygonHierarchy(slice),polygons=[];return hierarchy.roots.forEach((({solid:solid,holes:holes})=>{let index=solid.length;const holesIndex=[];holes.forEach(((hole,i)=>{holesIndex.push(index),index+=hole.length}));const vertices=[solid,...holes].flat(),data=vertices.flat(),getVertex=i=>hierarchy.to3D(vertices[i]),indices=triangulate(data,holesIndex);for(let i=0;i<indices.length;i+=3){const tri=indices.slice(i,i+3).map(getVertex);polygons.push(fromVerticesAndPlane(tri,hierarchy.plane))}})),polygons},transform$3=(matrix,slice)=>{const contours=slice.contours.map((contour=>contour.map((vertex=>transform$c([0,0,0],vertex,matrix)))));return create$2(contours)};var index$2=Object.freeze({__proto__:null,calculatePlane:calculatePlane,clone:slice=>Object.assign({},slice),create:create$2,equals:equals$3,fromGeom2:fromGeom2,fromVertices:fromVertices,isA:isA,reverse:reverse$2,toEdges:toEdges,toVertices:slice=>{const vertices=[];return slice.contours.forEach((contour=>{contour.forEach((vertex=>{vertices.push(vertex)}))})),vertices},toPolygons:toPolygons,toString:slice=>{let result="slice ("+slice.contours.length+" contours):\n[\n";return slice.contours.forEach((contour=>{result+=" ["+contour.map(toString$b).join()+"],\n"})),result+="]\n",result},transform:transform$3,validate:object=>{if(!isA(object))throw new Error("invalid slice structure");const slicePlane=calculatePlane(object);object.contours.forEach(((contour,i)=>{if(contour.length<3)throw new Error(`slice contour ${i} must contain at least 3 vertices`);const contourPlane=plane(create$7(contour));if(!equals$5(slicePlane,contourPlane))throw new Error("slice contours must be coplanar");for(let i=0;i<contour.length;i++){if(!contour[i].every(Number.isFinite))throw new Error(`slice contour ${i} must contain finite vertices`);const j=(i+1)%contour.length;if(equals$7(contour[i],contour[j]))throw new Error(`slice contour ${i} has duplicate vertex ${contour[i]}`)}}))}});const create$1=()=>[0,1,0],direction$1=line=>{const vector=normal([0,0],line);return negate(vector,vector),vector},origin$1=line=>scale$1([0,0],line,line[2]),copy$1=(out,line)=>(out[0]=line[0],out[1]=line[1],out[2]=line[2],out),fromPoints$1=(out,point1,point2)=>{const vector=subtract$1([0,0],point2,point1);normal(vector,vector),normalize(vector,vector);const distance=dot$1(point1,vector);return out[0]=vector[0],out[1]=vector[1],out[2]=distance,out},fromValues=(x,y,d)=>{const out=[0,1,0];return out[0]=x,out[1]=y,out[2]=d,out},solve2Linear=(a,b,c,d,u,v)=>{const invdet=1/(a*d-b*c);let x=u*d-b*v,y=-u*c+a*v;return x*=invdet,y*=invdet,[x,y]},intersectPointOfLines=(line1,line2)=>{const point=solve2Linear(line1[0],line1[1],line2[0],line2[1],line1[2],line2[2]);return clone$8(point)};var index$1=Object.freeze({__proto__:null,clone:line=>{const out=[0,1,0];return out[0]=line[0],out[1]=line[1],out[2]=line[2],out},closestPoint:(line,point)=>{const orig=origin$1(line),dir=direction$1(line),v=subtract$1([0,0],point,orig),dist=dot$1(v,dir);return scale$1(v,dir,dist),add(v,v,orig),v},copy:copy$1,create:create$1,direction:direction$1,distanceToPoint:(line,point)=>{let distance=dot$1(point,line);return distance=Math.abs(distance-line[2]),distance},equals:(line1,line2)=>line1[0]===line2[0]&&line1[1]===line2[1]&&line1[2]===line2[2],fromPoints:fromPoints$1,fromValues:fromValues,intersectPointOfLines:intersectPointOfLines,origin:origin$1,reverse:(out,line)=>{const normal=negate([0,0],line),distance=-line[2];return copy$1(out,fromValues(normal[0],normal[1],distance))},toString:line=>`line2: (${line[0].toFixed(7)}, ${line[1].toFixed(7)}, ${line[2].toFixed(7)})`,transform:(out,line,matrix)=>{const org=origin$1(line),dir=direction$1(line);return transform$b(org,org,matrix),transform$b(dir,dir,matrix),fromPoints$1(out,org,dir)},xAtY:(line,y)=>{let x=(line[2]-line[1]*y)/line[0];return Number.isNaN(x)&&(x=origin$1(line)[0]),x}});const create=()=>[fromValues$3(0,0,0),fromValues$3(0,0,1)],closestPoint=(line,point)=>{const lPoint=line[0],lDirection=line[1],a=dot$2(subtract$3([0,0,0],point,lPoint),lDirection),b=dot$2(lDirection,lDirection),closestPoint=scale$3([0,0,0],lDirection,a/b);return add$1(closestPoint,closestPoint,lPoint),closestPoint},fromPointAndDirection=(out,point,direction)=>{const unit=normalize$1([0,0,0],direction);return copy$4(out[0],point),copy$4(out[1],unit),out};var index=Object.freeze({__proto__:null,clone:line=>{const out=create();return copy$4(out[0],line[0]),copy$4(out[1],line[1]),out},closestPoint:closestPoint,copy:(out,line)=>(copy$4(out[0],line[0]),copy$4(out[1],line[1]),out),create:create,direction:line=>line[1],distanceToPoint:(line,point)=>{const closest=closestPoint(line,point),distanceVector=subtract$3([0,0,0],point,closest);return length$2(distanceVector)},equals:(line1,line2)=>!!equals$7(line1[1],line2[1])&&!!equals$7(line1[0],line2[0]),fromPlanes:(out,plane1,plane2)=>{let direction=cross$1([0,0,0],plane1,plane2),length=length$2(direction);if(length<EPS)throw new Error("parallel planes do not intersect");length=1/length,direction=scale$3(direction,direction,length);const absX=Math.abs(direction[0]),absY=Math.abs(direction[1]),absZ=Math.abs(direction[2]);let origin,r;return absX>=absY&&absX>=absZ?(r=solve2Linear(plane1[1],plane1[2],plane2[1],plane2[2],plane1[3],plane2[3]),origin=fromValues$3(0,r[0],r[1])):absY>=absX&&absY>=absZ?(r=solve2Linear(plane1[0],plane1[2],plane2[0],plane2[2],plane1[3],plane2[3]),origin=fromValues$3(r[0],0,r[1])):(r=solve2Linear(plane1[0],plane1[1],plane2[0],plane2[1],plane1[3],plane2[3]),origin=fromValues$3(r[0],r[1],0)),fromPointAndDirection(out,origin,direction)},fromPointAndDirection:fromPointAndDirection,fromPoints:(out,point1,point2)=>{const direction=subtract$3([0,0,0],point2,point1);return fromPointAndDirection(out,point1,direction)},intersectPointOfLineAndPlane:(line,plane)=>{const pNormal=plane,pw=plane[3],lPoint=line[0],lDirection=line[1],labda=(pw-dot$2(pNormal,lPoint))/dot$2(pNormal,lDirection);return add$1([0,0,0],lPoint,scale$3([0,0,0],lDirection,labda))},origin:line=>line[0],reverse:(out,line)=>{const point=clone$9(line[0]),direction=negate$1([0,0,0],line[1]);return fromPointAndDirection(out,point,direction)},toString:line=>{const point=line[0],direction=line[1];return`line3: point: (${point[0].toFixed(7)}, ${point[1].toFixed(7)}, ${point[2].toFixed(7)}) direction: (${direction[0].toFixed(7)}, ${direction[1].toFixed(7)}, ${direction[2].toFixed(7)})`},transform:(out,line,matrix)=>{const point=line[0],direction=line[1],pointPlusDirection=add$1([0,0,0],point,direction),newPoint=transform$c([0,0,0],point,matrix),newPointPlusDirection=transform$c(pointPlusDirection,pointPlusDirection,matrix),newDirection=subtract$3(newPointPlusDirection,newPointPlusDirection,newPoint);return fromPointAndDirection(out,newPoint,newDirection)}});const cache$3=new WeakMap,measureArea=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>isA$2(geometry)?0:isA$5(geometry)?(geometry=>{let area=cache$3.get(geometry);return area||(area=toSides(geometry).reduce(((area,side)=>area+(side[0][0]*side[1][1]-side[0][1]*side[1][0])),0),area*=.5,cache$3.set(geometry,area),area)})(geometry):isA$3(geometry)?(geometry=>{let area=cache$3.get(geometry);return area||(area=toPolygons$1(geometry).reduce(((area,polygon)=>area+measureArea$2(polygon)),0),cache$3.set(geometry,area),area)})(geometry):isA(geometry)?(geometry=>{let area=cache$3.get(geometry);return area||(area=0,geometry.contours.forEach((contour=>{area+=measureArea$2(create$7(contour))})),cache$3.set(geometry,area),area)})(geometry):0));return 1===results.length?results[0]:results},cache$2=new WeakMap,expand2=(bbox,point)=>{0===bbox.length?(bbox[0]=fromVec2([0,0,0],point),bbox[1]=fromVec2([0,0,0],point)):(min$1(bbox[0],bbox[0],point),max$1(bbox[1],bbox[1],point))},expand3=(bbox,vertex)=>{0===bbox.length?(bbox[0]=clone$9(vertex),bbox[1]=clone$9(vertex)):(min$2(bbox[0],bbox[0],vertex),max$2(bbox[1],bbox[1],vertex))},measureCached$1=(geometry,measureFn)=>{let boundingBox=cache$2.get(geometry);return boundingBox||(boundingBox=measureFn(geometry),0===boundingBox.length&&(boundingBox[0]=[0,0,0],boundingBox[1]=[0,0,0]),cache$2.set(geometry,boundingBox),boundingBox)},measureBoundingBoxOfPath2=geometry=>{const boundingBox=[];return toPoints$1(geometry).forEach((point=>{expand2(boundingBox,point)})),boundingBox},measureBoundingBoxOfGeom2=geometry=>{const boundingBox=[];return toPoints$3(geometry).forEach((point=>{expand2(boundingBox,point)})),boundingBox},measureBoundingBoxOfGeom3=geometry=>{const boundingBox=[];return toPolygons$1(geometry).forEach((polygon=>{toVertices$1(polygon).forEach((vertex=>{expand3(boundingBox,vertex)}))})),boundingBox},measureBoundingBoxOfSlice=geometry=>{const boundingBox=[];return geometry.contours.forEach((contour=>{contour.forEach((vertex=>{expand3(boundingBox,vertex)}))})),boundingBox},measureBoundingBox=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>isA$2(geometry)?measureCached$1(geometry,measureBoundingBoxOfPath2):isA$5(geometry)?measureCached$1(geometry,measureBoundingBoxOfGeom2):isA$3(geometry)?measureCached$1(geometry,measureBoundingBoxOfGeom3):isA(geometry)?measureCached$1(geometry,measureBoundingBoxOfSlice):[[0,0,0],[0,0,0]]));return 1===results.length?results[0]:results},measureAggregateBoundingBox=(...geometries)=>{geometries=flatten(geometries);const bounds=measureBoundingBox(geometries);if(1===geometries.length)return bounds;const result=[[Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE],[-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE]];return bounds.reduce(((result,item)=>result=[min$2(result[0],result[0],item[0]),max$2(result[1],result[1],item[1])]),result)},calculateEpsilonFromBounds=(bounds,dimensions)=>{let total=0;for(let i=0;i<dimensions;i++)total+=bounds[1][i]-bounds[0][i];return EPS*total/dimensions},cache$1=new WeakMap,measureVolume=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>isA$3(geometry)?(geometry=>{let volume=cache$1.get(geometry);return volume||(volume=toPolygons$1(geometry).reduce(((volume,polygon)=>volume+measureSignedVolume(polygon)),0),cache$1.set(geometry,volume),volume)})(geometry):0));return 1===results.length?results[0]:results},cache=new WeakMap,measureCached=(geometry,measureFn)=>{let boundingSphere=cache.get(geometry);return boundingSphere||(boundingSphere=measureFn(geometry),0===boundingSphere.length&&(boundingSphere[0]=[0,0,0],boundingSphere[1]=0),cache.set(geometry,boundingSphere),boundingSphere)},measureBoundingSphereOfPoints=points=>{const centroid=[0,0,0];let radius=0;if(points.length>0){let numPoints=0;const temp=[0,0,0];points.forEach((point=>{add$1(centroid,centroid,fromVec2(temp,point,0)),numPoints++})),scale$3(centroid,centroid,1/numPoints),points.forEach((point=>{radius=Math.max(radius,squaredDistance(centroid,point))})),radius=Math.sqrt(radius)}return[centroid,radius]},measureBoundingSphereOfPath2=points=>measureBoundingSphereOfPoints(toPoints$1(points)),measureBoundingSphereOfGeom2=geometry=>measureBoundingSphereOfPoints(toPoints$3(geometry)),measureBoundingSphereOfGeom3=geometry=>{const centroid=[0,0,0];let radius=0;const polygons=toPolygons$1(geometry);if(polygons.length>0){let numVertices=0;polygons.forEach((polygon=>{toVertices$1(polygon).forEach((vertex=>{add$1(centroid,centroid,vertex),numVertices++}))})),scale$3(centroid,centroid,1/numVertices),polygons.forEach((polygon=>{toVertices$1(polygon).forEach((vertex=>{radius=Math.max(radius,squaredDistance$1(centroid,vertex))}))})),radius=Math.sqrt(radius)}return[centroid,radius]},measureBoundingSphereOfSlice=geometry=>{const centroid=[0,0,0];let radius=0,numVertices=0;return geometry.contours.forEach((contour=>{contour.forEach((vertex=>{add$1(centroid,centroid,vertex),numVertices++}))})),numVertices>0&&(scale$3(centroid,centroid,1/numVertices),geometry.contours.forEach((contour=>{contour.forEach((vertex=>{radius=Math.max(radius,squaredDistance$1(centroid,vertex))}))})),radius=Math.sqrt(radius)),[centroid,radius]},cacheOfCenterOfMass=new WeakMap,measureEpsilon=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>isA$2(geometry)||isA$5(geometry)?calculateEpsilonFromBounds(measureBoundingBox(geometry),2):isA$3(geometry)||isA(geometry)?calculateEpsilonFromBounds(measureBoundingBox(geometry),3):0));return 1===results.length?results[0]:results},isNumberArray=(array,dimension)=>!!(Array.isArray(array)&&array.length>=dimension)&&array.every((n=>Number.isFinite(n))),isGT=(value,constant)=>Number.isFinite(value)&&value>constant,isGTE=(value,constant)=>Number.isFinite(value)&&value>=constant,ellipse=options=>{const defaults={center:[0,0],radius:[1,1],startAngle:0,endAngle:TAU,segments:32};let{center:center,radius:radius,startAngle:startAngle,endAngle:endAngle,segments:segments}=Object.assign({},defaults,options);if(!isNumberArray(center,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(radius,2))throw new Error("radius must be an array of X and Y values");if(!radius.every((n=>n>=0)))throw new Error("radius values must be positive");if(!isGTE(startAngle,0))throw new Error("startAngle must be positive");if(!isGTE(endAngle,0))throw new Error("endAngle must be positive");if(!isGTE(segments,3))throw new Error("segments must be three or more");if(0===radius[0]||0===radius[1])return create$a();startAngle%=TAU,endAngle%=TAU;let rotation=TAU;startAngle<endAngle&&(rotation=endAngle-startAngle),startAngle>endAngle&&(rotation=endAngle+(TAU-startAngle));const minRadius=Math.min(radius[0],radius[1]);if(rotation<Math.acos((minRadius*minRadius+minRadius*minRadius-EPS*EPS)/(2*minRadius*minRadius)))throw new Error("startAngle and endAngle do not define a significant rotation");segments=Math.floor(segments*(rotation/TAU));const centerV=clone$8(center),step=rotation/segments,points=[];segments=rotation<TAU?segments+1:segments;for(let i=0;i<segments;i++){const angle=step*i+startAngle,point=fromValues$2(radius[0]*cos(angle),radius[1]*sin(angle));add(point,centerV,point),points.push(point)}return rotation<TAU&&points.push(centerV),create$a([points])},circle=options=>{const defaults={center:[0,0],radius:1,startAngle:0,endAngle:TAU,segments:32};let{center:center,radius:radius,startAngle:startAngle,endAngle:endAngle,segments:segments}=Object.assign({},defaults,options);if(!isGTE(radius,0))throw new Error("radius must be positive");return radius=[radius,radius],ellipse({center:center,radius:radius,startAngle:startAngle,endAngle:endAngle,segments:segments})},cuboid=options=>{const{center:center,size:size}=Object.assign({},{center:[0,0,0],size:[2,2,2]},options);if(!isNumberArray(center,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(size,3))throw new Error("size must be an array of width, depth and height values");if(!size.every((n=>n>=0)))throw new Error("size values must be positive");return 0===size[0]||0===size[1]||0===size[2]?create$8():create$8([[[0,4,6,2],[-1,0,0]],[[1,3,7,5],[1,0,0]],[[0,1,5,4],[0,-1,0]],[[2,6,7,3],[0,1,0]],[[0,2,3,1],[0,0,-1]],[[4,5,7,6],[0,0,1]]].map((info=>{const vertices=info[0].map((i=>[center[0]+size[0]/2*(2*!!(1&i)-1),center[1]+size[1]/2*(2*!!(2&i)-1),center[2]+size[2]/2*(2*!!(4&i)-1)]));return create$7(vertices)})))},cylinderElliptic=options=>{const defaults={center:[0,0,0],height:2,startRadius:[1,1],startAngle:0,endRadius:[1,1],endAngle:TAU,segments:32};let{center:center,height:height,startRadius:startRadius,startAngle:startAngle,endRadius:endRadius,endAngle:endAngle,segments:segments}=Object.assign({},defaults,options);if(!isNumberArray(center,3))throw new Error("center must be an array of X, Y and Z values");if(!isGT(height,0))throw new Error("height must be greater then zero");if(!isNumberArray(startRadius,2))throw new Error("startRadius must be an array of X and Y values");if(!startRadius.every((n=>n>=0)))throw new Error("startRadius values must be positive");if(!isNumberArray(endRadius,2))throw new Error("endRadius must be an array of X and Y values");if(!endRadius.every((n=>n>=0)))throw new Error("endRadius values must be positive");if(endRadius.every((n=>0===n))&&startRadius.every((n=>0===n)))throw new Error("at least one radius must be positive");if(!isGTE(startAngle,0))throw new Error("startAngle must be positive");if(!isGTE(endAngle,0))throw new Error("endAngle must be positive");if(!isGTE(segments,4))throw new Error("segments must be four or more");startAngle%=TAU,endAngle%=TAU;let rotation=TAU;startAngle<endAngle&&(rotation=endAngle-startAngle),startAngle>endAngle&&(rotation=endAngle+(TAU-startAngle));const minRadius=Math.min(startRadius[0],startRadius[1],endRadius[0],endRadius[1]),minAngle=Math.acos((minRadius*minRadius+minRadius*minRadius-EPS*EPS)/(2*minRadius*minRadius));if(rotation<minAngle)throw new Error("startAngle and endAngle do not define a significant rotation");const slices=Math.floor(segments*(rotation/TAU)),start=fromValues$3(0,0,-height/2),end=fromValues$3(0,0,height/2),ray=subtract$3([0,0,0],end,start),axisX=fromValues$3(1,0,0),axisY=fromValues$3(0,1,0),v1=[0,0,0],v2=[0,0,0],v3=[0,0,0],genVertex=(stack,slice,radius)=>{const angle=slice*rotation+startAngle;return scale$3(v1,axisX,radius[0]*cos(angle)),scale$3(v2,axisY,radius[1]*sin(angle)),add$1(v1,v1,v2),scale$3(v3,ray,stack),add$1(v3,v3,start),add$1([0,0,0],v1,v3)},fromVertices=(...vertices)=>{const newVertices=vertices.map((vertex=>add$1([0,0,0],vertex,center)));return create$7(newVertices)},polygons=[];for(let i=0;i<slices;i++){const t0=i/slices;let t1=(i+1)/slices;rotation===TAU&&i===slices-1&&(t1=0),endRadius[0]===startRadius[0]&&endRadius[1]===startRadius[1]?(polygons.push(fromVertices(start,genVertex(0,t1,endRadius),genVertex(0,t0,endRadius))),polygons.push(fromVertices(genVertex(0,t1,endRadius),genVertex(1,t1,endRadius),genVertex(1,t0,endRadius),genVertex(0,t0,endRadius))),polygons.push(fromVertices(end,genVertex(1,t0,endRadius),genVertex(1,t1,endRadius)))):(startRadius[0]>0&&startRadius[1]>0&&polygons.push(fromVertices(start,genVertex(0,t1,startRadius),genVertex(0,t0,startRadius))),(startRadius[0]>0||startRadius[1]>0)&&polygons.push(fromVertices(genVertex(0,t0,startRadius),genVertex(0,t1,startRadius),genVertex(1,t0,endRadius))),endRadius[0]>0&&endRadius[1]>0&&polygons.push(fromVertices(end,genVertex(1,t0,endRadius),genVertex(1,t1,endRadius))),(endRadius[0]>0||endRadius[1]>0)&&polygons.push(fromVertices(genVertex(1,t0,endRadius),genVertex(0,t1,startRadius),genVertex(1,t1,endRadius))))}return rotation<TAU&&(polygons.push(fromVertices(start,genVertex(0,0,startRadius),end)),polygons.push(fromVertices(genVertex(0,0,startRadius),genVertex(1,0,endRadius),end)),polygons.push(fromVertices(start,end,genVertex(0,1,startRadius))),polygons.push(fromVertices(genVertex(0,1,startRadius),end,genVertex(1,1,endRadius)))),create$8(polygons)},cylinder=options=>{const{center:center,height:height,radius:radius,segments:segments}=Object.assign({},{center:[0,0,0],height:2,radius:1,segments:32},options);if(!isGTE(radius,0))throw new Error("radius must be positive");return 0===height||0===radius?create$8():cylinderElliptic({center:center,height:height,startRadius:[radius,radius],endRadius:[radius,radius],segments:segments})},ellipsoid=options=>{const{center:center,radius:radius,segments:segments,axes:axes}=Object.assign({},{center:[0,0,0],radius:[1,1,1],segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},options);if(!isNumberArray(center,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(radius,3))throw new Error("radius must be an array of X, Y and Z values");if(!radius.every((n=>n>=0)))throw new Error("radius values must be positive");if(!isGTE(segments,4))throw new Error("segments must be four or more");if(0===radius[0]||0===radius[1]||0===radius[2])return create$8();const xVector=scale$3([0,0,0],normalize$1([0,0,0],axes[0]),radius[0]),yVector=scale$3([0,0,0],normalize$1([0,0,0],axes[1]),radius[1]),zVector=scale$3([0,0,0],normalize$1([0,0,0],axes[2]),radius[2]),qSegments=Math.round(segments/4);let prevCylinderVertex;const polygons=[],p1=[0,0,0],p2=[0,0,0];for(let slice1=0;slice1<=segments;slice1++){const angle=TAU*slice1/segments,cylinderVertex=add$1([0,0,0],scale$3(p1,xVector,cos(angle)),scale$3(p2,yVector,sin(angle)));if(slice1>0){let prevCosPitch,prevSinPitch;for(let slice2=0;slice2<=qSegments;slice2++){const pitch=TAU/4*slice2/qSegments,cosPitch=cos(pitch),sinPitch=sin(pitch);if(slice2>0){let vertex,vertices=[];vertex=subtract$3([0,0,0],scale$3(p1,prevCylinderVertex,prevCosPitch),scale$3(p2,zVector,prevSinPitch)),vertices.push(add$1(vertex,vertex,center)),vertex=subtract$3([0,0,0],scale$3(p1,cylinderVertex,prevCosPitch),scale$3(p2,zVector,prevSinPitch)),vertices.push(add$1(vertex,vertex,center)),slice2<qSegments&&(vertex=subtract$3([0,0,0],scale$3(p1,cylinderVertex,cosPitch),scale$3(p2,zVector,sinPitch)),vertices.push(add$1(vertex,vertex,center))),vertex=subtract$3([0,0,0],scale$3(p1,prevCylinderVertex,cosPitch),scale$3(p2,zVector,sinPitch)),vertices.push(add$1(vertex,vertex,center)),polygons.push(create$7(vertices)),vertices=[],vertex=add$1([0,0,0],scale$3(p1,prevCylinderVertex,prevCosPitch),scale$3(p2,zVector,prevSinPitch)),vertices.push(add$1([0,0,0],center,vertex)),vertex=add$1(vertex,scale$3(p1,cylinderVertex,prevCosPitch),scale$3(p2,zVector,prevSinPitch)),vertices.push(add$1([0,0,0],center,vertex)),slice2<qSegments&&(vertex=add$1(vertex,scale$3(p1,cylinderVertex,cosPitch),scale$3(p2,zVector,sinPitch)),vertices.push(add$1([0,0,0],center,vertex))),vertex=add$1(vertex,scale$3(p1,prevCylinderVertex,cosPitch),scale$3(p2,zVector,sinPitch)),vertices.push(add$1([0,0,0],center,vertex)),vertices.reverse(),polygons.push(create$7(vertices))}prevCosPitch=cosPitch,prevSinPitch=sinPitch}}prevCylinderVertex=cylinderVertex}return create$8(polygons)},polyhedron=options=>{const defaults={points:[],faces:[],colors:void 0,orientation:"outward"},{points:points,faces:faces,colors:colors,orientation:orientation}=Object.assign({},defaults,options);if(!Array.isArray(points)||!Array.isArray(faces))throw new Error("points and faces must be arrays");if(points.length<3)throw new Error("three or more points are required");if(faces.length<1)throw new Error("one or more faces are required");if(colors){if(!Array.isArray(colors))throw new Error("colors must be an array");if(colors.length!==faces.length)throw new Error("faces and colors must have the same length")}points.forEach(((vertex,i)=>{if(!isNumberArray(vertex,3))throw new Error(`vertex ${i} must be an array of X, Y, Z values`)})),faces.forEach(((face,i)=>{if(face.length<3)throw new Error(`face ${i} must contain 3 or more indexes`);if(!isNumberArray(face,face.length))throw new Error(`face ${i} must be an array of numbers`)})),"outward"!==orientation&&faces.forEach((face=>face.reverse()));const polygons=faces.map(((face,findex)=>{const polygon=create$7(face.map((pindex=>points[pindex])));return colors&&colors[findex]&&(polygon.color=colors[findex]),polygon}));return create$8(polygons)},rectangle=options=>{const{center:center,size:size}=Object.assign({},{center:[0,0],size:[2,2]},options);if(!isNumberArray(center,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(size,2))throw new Error("size must be an array of X and Y values");if(!size.every((n=>n>=0)))throw new Error("size values must be positive");if(0===size[0]||0===size[1])return create$a();const point=[size[0]/2,size[1]/2],swapped=[point[0],-point[1]],points=[subtract$1([0,0],center,point),add([0,0],center,swapped),add([0,0],center,point),subtract$1([0,0],center,swapped)];return create$a([points])},createCorners=(center,size,radius,segments,slice,positive)=>{const pitch=TAU/4*slice/segments,cosPitch=cos(pitch),sinPitch=sin(pitch),layerSegments=segments-slice;let layerRadius=radius*cosPitch,layerOffset=size[2]-(radius-radius*sinPitch);positive||(layerOffset=radius-radius*sinPitch-size[2]),layerRadius=layerRadius>EPS?layerRadius:0;const corner0=add$1([0,0,0],center,[size[0]-radius,size[1]-radius,layerOffset]),corner1=add$1([0,0,0],center,[radius-size[0],size[1]-radius,layerOffset]),corner2=add$1([0,0,0],center,[radius-size[0],radius-size[1],layerOffset]),corner3=add$1([0,0,0],center,[size[0]-radius,radius-size[1],layerOffset]),corner0Vertices=[],corner1Vertices=[],corner2Vertices=[],corner3Vertices=[];for(let i=0;i<=layerSegments;i++){const point2d=fromAngleRadians([0,0],layerSegments>0?TAU/4*i/layerSegments:0);scale$1(point2d,point2d,layerRadius);const point3d=fromVec2([0,0,0],point2d);corner0Vertices.push(add$1([0,0,0],corner0,point3d)),rotateZ$2(point3d,point3d,[0,0,0],TAU/4),corner1Vertices.push(add$1([0,0,0],corner1,point3d)),rotateZ$2(point3d,point3d,[0,0,0],TAU/4),corner2Vertices.push(add$1([0,0,0],corner2,point3d)),rotateZ$2(point3d,point3d,[0,0,0],TAU/4),corner3Vertices.push(add$1([0,0,0],corner3,point3d))}return positive?[corner0Vertices,corner1Vertices,corner2Vertices,corner3Vertices]:(corner0Vertices.reverse(),corner1Vertices.reverse(),corner2Vertices.reverse(),corner3Vertices.reverse(),[corner3Vertices,corner2Vertices,corner1Vertices,corner0Vertices])},stitchCorners=(previousCorners,currentCorners)=>{const polygons=[];for(let i=0;i<previousCorners.length;i++){const previous=previousCorners[i],current=currentCorners[i];for(let j=0;j<previous.length-1;j++)polygons.push(create$7([previous[j],previous[j+1],current[j]])),j<current.length-1&&polygons.push(create$7([current[j],previous[j+1],current[j+1]]))}return polygons},stitchWalls=(previousCorners,currentCorners)=>{const polygons=[];for(let i=0;i<previousCorners.length;i++){let previous=previousCorners[i],current=currentCorners[i];const p0=previous[previous.length-1],c0=current[current.length-1],j=(i+1)%previousCorners.length;previous=previousCorners[j],current=currentCorners[j];const p1=previous[0],c1=current[0];polygons.push(create$7([p0,p1,c1,c0]))}return polygons},stitchSides=(bottomCorners,topCorners)=>{bottomCorners=(bottomCorners=[bottomCorners[3],bottomCorners[2],bottomCorners[1],bottomCorners[0]]).map((corner=>corner.slice().reverse()));const bottomVertices=[];bottomCorners.forEach((corner=>{corner.forEach((vertex=>bottomVertices.push(vertex)))}));const topVertices=[];topCorners.forEach((corner=>{corner.forEach((vertex=>topVertices.push(vertex)))}));const polygons=[];for(let i=0;i<topVertices.length;i++){const j=(i+1)%topVertices.length;polygons.push(create$7([bottomVertices[i],bottomVertices[j],topVertices[j],topVertices[i]]))}return polygons},sphere=options=>{let{center:center,radius:radius,segments:segments,axes:axes}=Object.assign({},{center:[0,0,0],radius:1,segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},options);if(!isGTE(radius,0))throw new Error("radius must be positive");return radius=[radius,radius,radius],ellipsoid({center:center,radius:radius,segments:segments,axes:axes})},getPoints=(vertices,radius,startAngle,center)=>{const a=TAU/vertices,points=[];for(let i=0;i<vertices;i++){const point=fromAngleRadians([0,0],a*i+startAngle);scale$1(point,point,radius),add(point,center,point),points.push(point)}return points},mirror=(options,...objects)=>{const{origin:origin,normal:normal}=Object.assign({},{origin:[0,0,0],normal:[0,0,1]},options),planeOfMirror=fromNormalAndPoint([0,0,0,0],normal,origin);if(Number.isNaN(planeOfMirror[0]))throw new Error("the given origin and normal do not define a proper plane");const matrix=mirrorByPlane([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],planeOfMirror),results=objects.map((object=>isA$2(object)?transform$5(matrix,object):isA$5(object)?transform$a(matrix,object):isA$3(object)?transform$6(matrix,object):Array.isArray(object)?mirror(options,...object):object));return 1===results.length?results[0]:results},mirrorX=(...objects)=>mirror({normal:[1,0,0]},...objects),gcd=(a,b)=>a===b?a:a<b?gcd(b,a):1===b?1:0===b?a:gcd(b,a%b),repartitionEdges=(newLength,edges)=>{const multiple=newLength/edges.length;if(1===multiple)return edges;const divisor=fromValues$3(multiple,multiple,multiple),newEdges=[];return edges.forEach((edge=>{const increment=subtract$3([0,0,0],edge[1],edge[0]);divide$1(increment,increment,divisor);let prev=edge[0];for(let i=1;i<=multiple;++i){const next=add$1([0,0,0],prev,increment);newEdges.push([prev,next]),prev=next}})),newEdges},EPSAREA=EPS*EPS/2*Math.sin(Math.PI/3),extrudeWalls=(slice0,slice1)=>{let edges0=toEdges(slice0),edges1=toEdges(slice1);if(edges0.length!==edges1.length){const newLength=(a=edges0.length,b=edges1.length,a*b/gcd(a,b));newLength!==edges0.length&&(edges0=repartitionEdges(newLength,edges0)),newLength!==edges1.length&&(edges1=repartitionEdges(newLength,edges1))}var a,b;const walls=[];return edges0.forEach(((edge0,i)=>{const edge1=edges1[i],poly0=create$7([edge0[0],edge0[1],edge1[1]]),poly0area=measureArea$2(poly0);Number.isFinite(poly0area)&&poly0area>EPSAREA&&walls.push(poly0);const poly1=create$7([edge0[0],edge1[1],edge1[0]]),poly1area=measureArea$2(poly1);Number.isFinite(poly1area)&&poly1area>EPSAREA&&walls.push(poly1)})),walls},defaultCallback=(progress,index,base)=>{let baseSlice=null;return isA$5(base)&&(baseSlice=fromGeom2(base)),isA$4(base)&&(baseSlice=fromVertices(toVertices$1(base))),0===progress||1===progress?transform$3(fromTranslation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],[0,0,progress]),baseSlice):null},extrudeFromSlices=(options,base)=>{const defaults={numberOfSlices:2,capStart:!0,capEnd:!0,close:!1,callback:defaultCallback},{numberOfSlices:numberOfSlices,capStart:capStart,capEnd:capEnd,close:close,callback:generate}=Object.assign({},defaults,options);if(numberOfSlices<2)throw new Error("numberOfSlices must be 2 or more");const sMax=numberOfSlices-1;let startSlice=null,endSlice=null,prevSlice=null,polygons=[];for(let s=0;s<numberOfSlices;s++){const currentSlice=generate(s/sMax,s,base);if(currentSlice){if(!isA(currentSlice))throw new Error("the callback function must return slice objects");if(0===currentSlice.contours.length)throw new Error("the callback function must return slices with one or more contours");prevSlice&&(polygons=polygons.concat(extrudeWalls(prevSlice,currentSlice))),0===s&&(startSlice=currentSlice),s===numberOfSlices-1&&(endSlice=currentSlice),prevSlice=currentSlice}}if(capEnd){const endPolygons=toPolygons(endSlice);polygons=polygons.concat(endPolygons)}if(capStart){const startPolygons=toPolygons(startSlice).map(invert$1);polygons=polygons.concat(startPolygons)}return capStart||capEnd||close&&!equals$3(endSlice,startSlice)&&(polygons=polygons.concat(extrudeWalls(endSlice,startSlice))),create$8(polygons)},extrudeRotate=(options,geometry)=>{const defaults={segments:12,startAngle:0,angle:TAU,overflow:"cap"};let{segments:segments,startAngle:startAngle,angle:angle,overflow:overflow}=Object.assign({},defaults,options);if(segments<3)throw new Error("segments must be greater then 3");startAngle=Math.abs(startAngle)>TAU?startAngle%TAU:startAngle,angle=Math.abs(angle)>TAU?angle%TAU:angle;let endAngle=startAngle+angle;if(endAngle=Math.abs(endAngle)>TAU?endAngle%TAU:endAngle,endAngle<startAngle){const x=startAngle;startAngle=endAngle,endAngle=x}let totalRotation=endAngle-startAngle;if(totalRotation<=0&&(totalRotation=TAU),Math.abs(totalRotation)<TAU){const anglePerSegment=TAU/segments;segments=Math.floor(Math.abs(totalRotation)/anglePerSegment),Math.abs(totalRotation)>segments*anglePerSegment&&segments++}let shapeSides=toSides(geometry);if(0===shapeSides.length)return create$8();let sliceGeometry=geometry;const pointsWithNegativeX=shapeSides.filter((s=>s[0][0]<0)),pointsWithPositiveX=shapeSides.filter((s=>s[0][0]>=0));pointsWithNegativeX.length>0&&pointsWithPositiveX.length>0&&"cap"===overflow&&(pointsWithNegativeX.length>pointsWithPositiveX.length?(shapeSides=shapeSides.map((side=>{let point0=side[0],point1=side[1];return point0=[Math.min(point0[0],0),point0[1]],point1=[Math.min(point1[0],0),point1[1]],[point0,point1]})),sliceGeometry=fromSides(shapeSides),sliceGeometry=mirrorX(sliceGeometry)):pointsWithPositiveX.length>=pointsWithNegativeX.length&&(shapeSides=shapeSides.map((side=>{let point0=side[0],point1=side[1];return point0=[Math.max(point0[0],0),point0[1]],point1=[Math.max(point1[0],0),point1[1]],[point0,point1]})),sliceGeometry=fromSides(shapeSides)));const rotationPerSlice=totalRotation/segments,isCapped=Math.abs(totalRotation)<TAU;let baseSlice=fromGeom2(sliceGeometry);baseSlice=reverse$2(baseSlice);const matrix=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];options={numberOfSlices:segments+1,capStart:isCapped,capEnd:isCapped,close:!isCapped,callback:(progress,index,base)=>{let Zrotation=rotationPerSlice*index+startAngle;return totalRotation===TAU&&index===segments&&(Zrotation=startAngle),multiply$1(matrix,fromZRotation(matrix,Zrotation),fromXRotation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],TAU/4)),transform$3(matrix,base)}};const output=extrudeFromSlices(options,baseSlice);return geometry.color&&(output.color=geometry.color),output},rotate=(angles,...objects)=>{if(!Array.isArray(angles))throw new Error("angles must be an array");for(angles=angles.slice();angles.length<3;)angles.push(0);const yaw=angles[2],pitch=angles[1],roll=angles[0],matrix=fromTaitBryanRotation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],yaw,pitch,roll),results=objects.map((object=>isA$2(object)?transform$5(matrix,object):isA$5(object)?transform$a(matrix,object):isA$3(object)?transform$6(matrix,object):Array.isArray(object)?rotate(angles,...object):object));return 1===results.length?results[0]:results},translate=(offset,...objects)=>{if(!Array.isArray(offset))throw new Error("offset must be an array");for(offset=offset.slice();offset.length<3;)offset.push(0);const matrix=fromTranslation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],offset),results=objects.map((object=>isA$2(object)?transform$5(matrix,object):isA$5(object)?transform$a(matrix,object):isA$3(object)?transform$6(matrix,object):Array.isArray(object)?translate(offset,...object):object));return 1===results.length?results[0]:results},solveAngleFromSSS=(a,b,c)=>Math.acos((a*a+b*b-c*c)/(2*a*b)),solveSAS=values=>{const c=values[0],B=values[1],a=values[2],b=((a,C,b)=>C>NEPS?Math.sqrt(a*a+b*b-2*a*b*Math.cos(C)):Math.sqrt((a-b)*(a-b)+a*b*C*C*(1-C*C/12)))(c,B,a),A=solveAngleFromSSS(b,c,a),C=Math.PI-A-B;return createTriangle(A,B,C,a,b,c)},createTriangle=(A,B,C,a,b,c)=>{const p0=fromValues$2(0,0),p1=fromValues$2(c,0),p2=fromValues$2(a,0);return add(p2,rotate$1(p2,p2,[0,0],Math.PI-B),p1),create$a([[p0,p1,p2]])},simplex={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]},defaultsVectorParams$1={xOffset:0,yOffset:0,font:simplex,height:14,extrudeOffset:0},vectorChar=(options,text)=>{const{xOffset:xOffset,yOffset:yOffset,font:font,height:height,extrudeOffset:extrudeOffset}=Object.assign({},defaultsVectorParams$1,options);if("string"!=typeof text||1!==text.length)throw new Error("text must be a single character");let code=text.charCodeAt(0);code&&font[code]||(code=63);const glyph=[].concat(font[code]),ratio=(height-extrudeOffset)/font.height,extrudeYOffset=extrudeOffset/2,width=glyph.shift()*ratio,paths=[];let polyline=[];for(let i=0,il=glyph.length;i<il;i+=2){const gx=ratio*glyph[i]+xOffset,gy=ratio*glyph[i+1]+yOffset+extrudeYOffset;void 0===glyph[i]?(paths.push(fromPoints$2({},polyline)),polyline=[],i--):polyline.push(fromValues$2(gx,gy))}return polyline.length&&paths.push(fromPoints$2({},polyline)),{width:width,height:height,paths:paths}},defaultsVectorParams={xOffset:0,yOffset:0,align:"left",font:simplex,height:14,lineSpacing:30/14,letterSpacing:0,extrudeOffset:0},matrix=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],translateLine=(options,line)=>{const{x:x,y:y}=Object.assign({x:0,y:0},options);return identity(matrix),translate$1(matrix,matrix,[x,y,0]),line.chars=line.chars.map((vchar=>(vchar.paths=vchar.paths.map((path=>transform$5(matrix,path))),vchar))),line},areAllShapesTheSameType=shapes=>{let previousType;for(const shape of shapes){let currentType=0;if(isA$5(shape)&&(currentType=1),isA$3(shape)&&(currentType=2),isA$2(shape)&&(currentType=3),previousType&&currentType!==previousType)return!1;previousType=currentType}return!0},coalesce=arr=>flattenHelper(arr,[]),flattenHelper=(arr,out)=>(Array.isArray(arr)?arr.forEach((child=>flattenHelper(child,out))):null!=arr&&void 0!==arr&&out.push(arr),out),DEFAULT_COMPARE=(a,b)=>a>b?1:a<b?-1:0;class Node$1{constructor(key,data){this.key=key,this.data=data,this.left=null,this.right=null,this.next=null}}const splay=(i,t,comparator)=>{const N=new Node$1(null,null);let l=N,r=N;for(;;){const cmp=comparator(i,t.key);if(cmp<0){if(null===t.left)break;if(comparator(i,t.left.key)<0){const y=t.left;if(t.left=y.right,y.right=t,null===(t=y).left)break}r.left=t,r=t,t=t.left}else{if(!(cmp>0))break;if(null===t.right)break;if(comparator(i,t.right.key)>0){const y=t.right;if(t.right=y.left,y.left=t,null===(t=y).right)break}l.right=t,l=t,t=t.right}}return l.right=t.left,r.left=t.right,t.left=N.right,t.right=N.left,t},insert=(i,data,t,comparator)=>{const node=new Node$1(i,data);if(null===t)return node.left=node.right=null,node;const cmp=comparator(i,(t=splay(i,t,comparator)).key);return cmp<0?(node.left=t.left,node.right=t,t.left=null):cmp>=0&&(node.right=t.right,node.left=t,t.right=null),node},split=(key,v,comparator)=>{let left=null,right=null;if(v){const cmp=comparator((v=splay(key,v,comparator)).key,key);0===cmp?(left=v.left,right=v.right):cmp<0?(right=v.right,v.right=null,left=v):(left=v.left,v.left=null,right=v)}return{left:left,right:right}},printRow=(root,prefix,isTail,out,printNode)=>{if(root){out(`${prefix}${isTail?"└── ":"├── "}${printNode(root)}\n`);const indent=prefix+(isTail?" ":"│ ");root.left&&printRow(root.left,indent,!1,out,printNode),root.right&&printRow(root.right,indent,!0,out,printNode)}};class Tree$1{constructor(comparator=DEFAULT_COMPARE){this._comparator=comparator,this._root=null,this._size=0}insert(key,data){return this._size++,this._root=insert(key,data,this._root,this._comparator),this._root}add(key,data){const node=new Node$1(key,data);null===this._root&&(node.left=node.right=null,this._size++,this._root=node);const comparator=this._comparator,t=splay(key,this._root,comparator),cmp=comparator(key,t.key);return 0===cmp?this._root=t:(cmp<0?(node.left=t.left,node.right=t,t.left=null):cmp>0&&(node.right=t.right,node.left=t,t.right=null),this._size++,this._root=node),this._root}remove(key){this._root=this._remove(key,this._root,this._comparator)}_remove(i,t,comparator){let x;return null===t?null:0===comparator(i,(t=splay(i,t,comparator)).key)?(null===t.left?x=t.right:(x=splay(i,t.left,comparator),x.right=t.right),this._size--,x):t}pop(){let node=this._root;if(node){for(;node.left;)node=node.left;return this._root=splay(node.key,this._root,this._comparator),this._root=this._remove(node.key,this._root,this._comparator),{key:node.key,data:node.data}}return null}findStatic(key){let current=this._root;const compare=this._comparator;for(;current;){const cmp=compare(key,current.key);if(0===cmp)return current;current=cmp<0?current.left:current.right}return null}find(key){return this._root&&(this._root=splay(key,this._root,this._comparator),0!==this._comparator(key,this._root.key))?null:this._root}contains(key){let current=this._root;const compare=this._comparator;for(;current;){const cmp=compare(key,current.key);if(0===cmp)return!0;current=cmp<0?current.left:current.right}return!1}forEach(visitor,ctx){let current=this._root;const Q=[];let done=!1;for(;!done;)null!==current?(Q.push(current),current=current.left):0!==Q.length?(current=Q.pop(),visitor.call(ctx,current),current=current.right):done=!0;return this}range(low,high,fn,ctx){const Q=[],compare=this._comparator;let cmp,node=this._root;for(;0!==Q.length||node;)if(node)Q.push(node),node=node.left;else{if(node=Q.pop(),cmp=compare(node.key,high),cmp>0)break;if(compare(node.key,low)>=0&&fn.call(ctx,node))return this;node=node.right}return this}keys(){const keys=[];return this.forEach((({key:key})=>keys.push(key))),keys}values(){const values=[];return this.forEach((({data:data})=>values.push(data))),values}min(){return this._root?this.minNode(this._root).key:null}max(){return this._root?this.maxNode(this._root).key:null}minNode(t=this._root){if(t)for(;t.left;)t=t.left;return t}maxNode(t=this._root){if(t)for(;t.right;)t=t.right;return t}at(index){let current=this._root,done=!1,i=0;const Q=[];for(;!done;)if(current)Q.push(current),current=current.left;else if(Q.length>0){if(current=Q.pop(),i===index)return current;i++,current=current.right}else done=!0;return null}next(d){let root=this._root,successor=null;if(d.right){for(successor=d.right;successor.left;)successor=successor.left;return successor}const comparator=this._comparator;for(;root;){const cmp=comparator(d.key,root.key);if(0===cmp)break;cmp<0?(successor=root,root=root.left):root=root.right}return successor}prev(d){let root=this._root,predecessor=null;if(null!==d.left){for(predecessor=d.left;predecessor.right;)predecessor=predecessor.right;return predecessor}const comparator=this._comparator;for(;root;){const cmp=comparator(d.key,root.key);if(0===cmp)break;cmp<0?root=root.left:(predecessor=root,root=root.right)}return predecessor}clear(){return this._root=null,this._size=0,this}toList(){return toList(this._root)}load(keys,values=[],presort=!1){let size=keys.length;const comparator=this._comparator;if(presort&&sort(keys,values,0,size-1,comparator),null===this._root)this._root=loadRecursive(keys,values,0,size),this._size=size;else{const mergedList=mergeLists(this.toList(),createList(keys,values),comparator);size=this._size+size,this._root=sortedListToBST({head:mergedList},0,size)}return this}isEmpty(){return null===this._root}size(){return this._size}root(){return this._root}toString(printNode=(n=>String(n.key))){const out=[];return printRow(this._root,"",!0,(v=>out.push(v)),printNode),out.join("")}update(key,newKey,newData){const comparator=this._comparator;let{left:left,right:right}=split(key,this._root,comparator);comparator(key,newKey)<0?right=insert(newKey,newData,right,comparator):left=insert(newKey,newData,left,comparator),this._root=((left,right,comparator)=>null===right?left:(null===left||((right=splay(left.key,right,comparator)).left=left),right))(left,right,comparator)}split(key){return split(key,this._root,this._comparator)}*[Symbol.iterator](){let n=this.minNode();for(;n;)yield n,n=this.next(n)}}const loadRecursive=(keys,values,start,end)=>{const size=end-start;if(size>0){const middle=start+Math.floor(size/2),key=keys[middle],data=values[middle],node=new Node$1(key,data);return node.left=loadRecursive(keys,values,start,middle),node.right=loadRecursive(keys,values,middle+1,end),node}return null},createList=(keys,values)=>{const head=new Node$1(null,null);let p=head;for(let i=0;i<keys.length;i++)p=p.next=new Node$1(keys[i],values[i]);return p.next=null,head.next},toList=root=>{let current=root;const Q=[];let done=!1;const head=new Node$1(null,null);let p=head;for(;!done;)current?(Q.push(current),current=current.left):Q.length>0?(current=p=p.next=Q.pop(),current=current.right):done=!0;return p.next=null,head.next},sortedListToBST=(list,start,end)=>{const size=end-start;if(size>0){const middle=start+Math.floor(size/2),left=sortedListToBST(list,start,middle),root=list.head;return root.left=left,list.head=list.head.next,root.right=sortedListToBST(list,middle+1,end),root}return null},mergeLists=(l1,l2,compare)=>{const head=new Node$1(null,null);let p=head,p1=l1,p2=l2;for(;null!==p1&&null!==p2;)compare(p1.key,p2.key)<0?(p.next=p1,p1=p1.next):(p.next=p2,p2=p2.next),p=p.next;return null!==p1?p.next=p1:null!==p2&&(p.next=p2),head.next},sort=(keys,values,left,right,compare)=>{if(left>=right)return;const pivot=keys[left+right>>1];let i=left-1,j=right+1;for(;;){do{i++}while(compare(keys[i],pivot)<0);do{j--}while(compare(keys[j],pivot)>0);if(i>=j)break;let tmp=keys[i];keys[i]=keys[j],keys[j]=tmp,tmp=values[i],values[i]=values[j],values[j]=tmp}sort(keys,values,left,j,compare),sort(keys,values,j+1,right,compare)},computeFields=(event,prev,operation)=>{null===prev?(event.inOut=!1,event.otherInOut=!0):(event.isSubject===prev.isSubject?(event.inOut=!prev.inOut,event.otherInOut=prev.otherInOut):(event.inOut=!prev.otherInOut,event.otherInOut=prev.isVertical()?!prev.inOut:prev.inOut),prev&&(event.prevInResult=!inResult(prev,operation)||prev.isVertical()?prev.prevInResult:prev));const isInResult=inResult(event,operation);event.resultTransition=isInResult?determineResultTransition(event,operation):0},inResult=(event,operation)=>{switch(event.type){case 0:switch(operation){case 0:return!event.otherInOut;case 1:return event.otherInOut;case 2:return event.isSubject&&event.otherInOut||!event.isSubject&&!event.otherInOut;case 3:return!0}break;case 2:return 0===operation||1===operation;case 3:return 2===operation;case 1:return!1}return!1},determineResultTransition=(event,operation)=>{const thisIn=!event.inOut,thatIn=!event.otherInOut;let isIn;switch(operation){case 0:isIn=thisIn&&thatIn;break;case 1:isIn=thisIn||thatIn;break;case 3:isIn=thisIn^thatIn;break;case 2:isIn=event.isSubject?thisIn&&!thatIn:thatIn&&!thisIn}return isIn?1:-1};class SweepEvent{constructor(point,left,otherEvent,isSubject,edgeType){this.left=left,this.point=point,this.otherEvent=otherEvent,this.isSubject=isSubject,this.type=edgeType||0,this.inOut=!1,this.otherInOut=!1,this.prevInResult=null,this.resultTransition=0,this.otherPos=-1,this.outputContourId=-1,this.isExteriorRing=!0}isBelow(p){const p0=this.point,p1=this.otherEvent.point;return this.left?(p0[0]-p[0])*(p1[1]-p[1])-(p1[0]-p[0])*(p0[1]-p[1])>0:(p1[0]-p[0])*(p0[1]-p[1])-(p0[0]-p[0])*(p1[1]-p[1])>0}isAbove(p){return!this.isBelow(p)}isVertical(){return this.point[0]===this.otherEvent.point[0]}get inResult(){return 0!==this.resultTransition}clone(){const copy=new SweepEvent(this.point,this.left,this.otherEvent,this.isSubject,this.type);return copy.contourId=this.contourId,copy.resultTransition=this.resultTransition,copy.prevInResult=this.prevInResult,copy.isExteriorRing=this.isExteriorRing,copy.inOut=this.inOut,copy.otherInOut=this.otherInOut,copy}}const signedArea=(p0,p1,p2)=>{const res=(ax=p0[0],ay=p0[1],bx=p1[0],by=p1[1],cx=p2[0],cy=p2[1],(ay-cy)*(bx-cx)-(ax-cx)*(by-cy));var ax,ay,bx,by,cx,cy;return res>0?-1:res<0?1:0},compareEvents=(e1,e2)=>{const p1=e1.point,p2=e2.point;return p1[0]>p2[0]?1:p1[0]<p2[0]?-1:p1[1]!==p2[1]?p1[1]>p2[1]?1:-1:specialCases(e1,e2,p1)},specialCases=(e1,e2,p1,p2)=>e1.left!==e2.left?e1.left?1:-1:0!==signedArea(p1,e1.otherEvent.point,e2.otherEvent.point)?e1.isBelow(e2.otherEvent.point)?-1:1:!e1.isSubject&&e2.isSubject?1:-1,divideSegment=(se,p,queue)=>{const r=new SweepEvent(p,!1,se,se.isSubject),l=new SweepEvent(p,!0,se.otherEvent,se.isSubject);return r.contourId=l.contourId=se.contourId,compareEvents(l,se.otherEvent)>0&&(se.otherEvent.left=!0,l.left=!1),se.otherEvent.otherEvent=l,se.otherEvent=r,queue.push(l),queue.push(r),queue},crossProduct=(a,b)=>a[0]*b[1]-a[1]*b[0],possibleIntersection=(se1,se2,queue)=>{const inter=((a1,a2,b1,b2,noEndpointTouch)=>{const va=[a2[0]-a1[0],a2[1]-a1[1]],vb=[b2[0]-b1[0],b2[1]-b1[1]],toPoint=(p,s,d)=>[p[0]+s*d[0],p[1]+s*d[1]],e=[b1[0]-a1[0],b1[1]-a1[1]];let kross=crossProduct(va,vb),sqrKross=kross*kross;const sqrLenA=dot$1(va,va);if(sqrKross>0){const s=crossProduct(e,vb)/kross;if(s<0||s>1)return null;const t=crossProduct(e,va)/kross;return t<0||t>1?null:0===s||1===s?noEndpointTouch?null:[toPoint(a1,s,va)]:0===t||1===t?noEndpointTouch?null:[toPoint(b1,t,vb)]:[toPoint(a1,s,va)]}if(kross=crossProduct(e,va),sqrKross=kross*kross,sqrKross>0)return null;const sa=dot$1(va,e)/sqrLenA,sb=sa+dot$1(va,vb)/sqrLenA,smin=Math.min(sa,sb),smax=Math.max(sa,sb);return smin<=1&&smax>=0?1===smin?noEndpointTouch?null:[toPoint(a1,smin>0?smin:0,va)]:0===smax?noEndpointTouch?null:[toPoint(a1,smax<1?smax:1,va)]:noEndpointTouch&&0===smin&&1===smax?null:[toPoint(a1,smin>0?smin:0,va),toPoint(a1,smax<1?smax:1,va)]:null})(se1.point,se1.otherEvent.point,se2.point,se2.otherEvent.point),nIntersections=inter?inter.length:0;if(0===nIntersections)return 0;if(1===nIntersections&&(equals$6(se1.point,se2.point)||equals$6(se1.otherEvent.point,se2.otherEvent.point)))return 0;if(2===nIntersections&&se1.isSubject===se2.isSubject)return 0;if(1===nIntersections)return equals$6(se1.point,inter[0])||equals$6(se1.otherEvent.point,inter[0])||divideSegment(se1,inter[0],queue),equals$6(se2.point,inter[0])||equals$6(se2.otherEvent.point,inter[0])||divideSegment(se2,inter[0],queue),1;const events=[];let leftCoincide=!1,rightCoincide=!1;return equals$6(se1.point,se2.point)?leftCoincide=!0:1===compareEvents(se1,se2)?events.push(se2,se1):events.push(se1,se2),equals$6(se1.otherEvent.point,se2.otherEvent.point)?rightCoincide=!0:1===compareEvents(se1.otherEvent,se2.otherEvent)?events.push(se2.otherEvent,se1.otherEvent):events.push(se1.otherEvent,se2.otherEvent),leftCoincide&&rightCoincide||leftCoincide?(se2.type=1,se1.type=se2.inOut===se1.inOut?2:3,leftCoincide&&!rightCoincide&&divideSegment(events[1].otherEvent,events[0].point,queue),2):rightCoincide?(divideSegment(events[0],events[1].point,queue),3):events[0]!==events[3].otherEvent?(divideSegment(events[0],events[1].point,queue),divideSegment(events[1],events[2].point,queue),3):(divideSegment(events[0],events[1].point,queue),divideSegment(events[3].otherEvent,events[2].point,queue),3)},compareSegments=(le1,le2)=>{if(le1===le2)return 0;if(0!==signedArea(le1.point,le1.otherEvent.point,le2.point)||0!==signedArea(le1.point,le1.otherEvent.point,le2.otherEvent.point))return equals$6(le1.point,le2.point)?le1.isBelow(le2.otherEvent.point)?-1:1:le1.point[0]===le2.point[0]?le1.point[1]<le2.point[1]?-1:1:1===compareEvents(le1,le2)?le2.isAbove(le1.point)?-1:1:le1.isBelow(le2.point)?-1:1;if(le1.isSubject!==le2.isSubject)return le1.isSubject?-1:1;{let p1=le1.point,p2=le2.point;if(p1[0]===p2[0]&&p1[1]===p2[1])return p1=le1.otherEvent.point,p2=le2.otherEvent.point,p1[0]===p2[0]&&p1[1]===p2[1]?0:le1.contourId>le2.contourId?1:-1}return 1===compareEvents(le1,le2)?1:-1};class Contour{constructor(){this.points=[],this.holeIds=[],this.holeOf=null,this.depth=null}isExterior(){return null==this.holeOf}}const nextPos=(pos,resultEvents,processed,origPos)=>{let newPos=pos+1;const p=resultEvents[pos].point;let p1;const length=resultEvents.length;for(newPos<length&&(p1=resultEvents[newPos].point);newPos<length&&p1[0]===p[0]&&p1[1]===p[1];){if(!processed[newPos])return newPos;newPos++,newPos<length&&(p1=resultEvents[newPos].point)}for(newPos=pos-1;processed[newPos]&&newPos>origPos;)newPos--;return newPos},initializeContourFromContext=(event,contours,contourId)=>{const contour=new Contour;if(null!=event.prevInResult){const prevInResult=event.prevInResult,lowerContourId=prevInResult.outputContourId,lowerResultTransition=prevInResult.resultTransition;if(lowerContourId<0)contour.holeOf=null,contour.depth=0;else if(lowerResultTransition>0){const lowerContour=contours[lowerContourId];if(null!=lowerContour.holeOf){const parentContourId=lowerContour.holeOf;contours[parentContourId].holeIds.push(contourId),contour.holeOf=parentContourId,contour.depth=contours[lowerContourId].depth}else contours[lowerContourId].holeIds.push(contourId),contour.holeOf=lowerContourId,contour.depth=contours[lowerContourId].depth+1}else contour.holeOf=null,contour.depth=contours[lowerContourId].depth}else contour.holeOf=null,contour.depth=0;return contour},connectEdges=sortedEvents=>{const resultEvents=(sortedEvents=>{let event,i,len,tmp;const resultEvents=[];for(i=0,len=sortedEvents.length;i<len;i++)event=sortedEvents[i],(event.left&&event.inResult||!event.left&&event.otherEvent.inResult)&&resultEvents.push(event);let sorted=!1;for(;!sorted;)for(sorted=!0,i=0,len=resultEvents.length;i<len;i++)i+1<len&&1===compareEvents(resultEvents[i],resultEvents[i+1])&&(tmp=resultEvents[i],resultEvents[i]=resultEvents[i+1],resultEvents[i+1]=tmp,sorted=!1);for(i=0,len=resultEvents.length;i<len;i++)event=resultEvents[i],event.otherPos=i;for(i=0,len=resultEvents.length;i<len;i++)event=resultEvents[i],event.left||(tmp=event.otherPos,event.otherPos=event.otherEvent.otherPos,event.otherEvent.otherPos=tmp);return resultEvents})(sortedEvents),len=resultEvents.length,processed={},contours=[];for(let i=0;i<len;i++){if(processed[i])continue;const contourId=contours.length,contour=initializeContourFromContext(resultEvents[i],contours,contourId),markAsProcessed=pos=>{processed[pos]=!0,pos<resultEvents.length&&resultEvents[pos]&&(resultEvents[pos].outputContourId=contourId)};let pos=i;const origPos=i,initial=resultEvents[i].point;for(contour.points.push(initial);markAsProcessed(pos),pos=resultEvents[pos].otherPos,markAsProcessed(pos),contour.points.push(resultEvents[pos].point),pos=nextPos(pos,resultEvents,processed,origPos),!(pos===origPos||pos>=resultEvents.length)&&resultEvents[pos];);contours.push(contour)}return contours};class Queue{constructor(data,compare){if(this.data=data,this.length=this.data.length,this.compare=compare,this.length>0)for(let i=(this.length>>1)-1;i>=0;i--)this._down(i)}push(item){this.data.push(item),this._up(this.length++)}pop(){if(0===this.length)return;const top=this.data[0],bottom=this.data.pop();return--this.length>0&&(this.data[0]=bottom,this._down(0)),top}peek(){return this.data[0]}_up(pos){const{data:data,compare:compare}=this,item=data[pos];for(;pos>0;){const parent=pos-1>>1,current=data[parent];if(compare(item,current)>=0)break;data[pos]=current,pos=parent}data[pos]=item}_down(pos){const{data:data,compare:compare}=this,halfLength=this.length>>1,item=data[pos];for(;pos<halfLength;){let bestChild=1+(pos<<1);const right=bestChild+1;if(right<this.length&&compare(data[right],data[bestChild])<0&&(bestChild=right),compare(data[bestChild],item)>=0)break;data[pos]=data[bestChild],pos=bestChild}data[pos]=item}}const max=Math.max,min=Math.min;let contourId=0;const processPolygon=(contourOrHole,isSubject,depth,queue,bbox,isExteriorRing)=>{const len=contourOrHole.length-1;let s1,s2,e1,e2;for(let i=0;i<len;i++){if(s1=contourOrHole[i],s2=contourOrHole[i+1],e1=new SweepEvent(s1,!1,void 0,isSubject),e2=new SweepEvent(s2,!1,e1,isSubject),e1.otherEvent=e2,s1[0]===s2[0]&&s1[1]===s2[1])continue;e1.contourId=e2.contourId=depth,isExteriorRing||(e1.isExteriorRing=!1,e2.isExteriorRing=!1),compareEvents(e1,e2)>0?e2.left=!0:e1.left=!0;const x=s1[0],y=s1[1];bbox[0]=min(bbox[0],x),bbox[1]=min(bbox[1],y),bbox[2]=max(bbox[2],x),bbox[3]=max(bbox[3],y),queue.push(e1),queue.push(e2)}},EMPTY=[],toMartinez=geometry=>{const outlines=[];return toOutlines(geometry).forEach((outline=>{equals$6(outline[0],outline[outline.length-1])?outlines.push(outline):outlines.push([...outline,outline[0]])})),[outlines]},fromOutlines=outlines=>(outlines.forEach((outline=>{equals$6(outline[0],outline[outline.length-1])&&outline.pop()})),outlines=outlines.filter((o=>o.length>=3)),create$a(outlines)),boolean=(subjectGeom,clippingGeom,operation)=>{const subject=toMartinez(subjectGeom),clipping=toMartinez(clippingGeom);let trivial=((subject,clipping,operation)=>{let result=null;if(subject.length*clipping.length==0){if(0===operation)return EMPTY;2===operation?result=subject:1!==operation&&3!==operation||(result=0===subject.length?clipping:subject)}return result===EMPTY?create$a():result?fromOutlines(result.flat()):null})(subject,clipping,operation);if(trivial)return trivial;const sbbox=[1/0,1/0,-1/0,-1/0],cbbox=[1/0,1/0,-1/0,-1/0],eventQueue=((subject,clipping,sbbox,cbbox,operation)=>{const eventQueue=new Queue([],compareEvents);let polygonSet,isExteriorRing,i,ii,j,jj;for(i=0,ii=subject.length;i<ii;i++)for(polygonSet=subject[i],j=0,jj=polygonSet.length;j<jj;j++)isExteriorRing=0===j,isExteriorRing&&contourId++,processPolygon(polygonSet[j],!0,contourId,eventQueue,sbbox,isExteriorRing);for(i=0,ii=clipping.length;i<ii;i++)for(polygonSet=clipping[i],j=0,jj=polygonSet.length;j<jj;j++)isExteriorRing=0===j,2===operation&&(isExteriorRing=!1),isExteriorRing&&contourId++,processPolygon(polygonSet[j],!1,contourId,eventQueue,cbbox,isExteriorRing);return eventQueue})(subject,clipping,sbbox,cbbox,operation);if(trivial=((subject,clipping,sbbox,cbbox,operation)=>{let result=null;return(sbbox[0]>cbbox[2]||cbbox[0]>sbbox[2]||sbbox[1]>cbbox[3]||cbbox[1]>sbbox[3])&&(0===operation?result=EMPTY:2===operation?result=subject:1!==operation&&3!==operation||(result=subject.concat(clipping))),result===EMPTY?create$a():result?fromOutlines(result.flat()):null})(subject,clipping,sbbox,cbbox,operation),trivial)return trivial;const sortedEvents=((eventQueue,subject,clipping,sbbox,cbbox,operation)=>{const sweepLine=new Tree$1(compareSegments),sortedEvents=[],rightBound=Math.min(sbbox[2],cbbox[2]);let prev,next,begin;for(;0!==eventQueue.length;){let event=eventQueue.pop();if(sortedEvents.push(event),0===operation&&event.point[0]>rightBound||2===operation&&event.point[0]>sbbox[2])break;if(event.left){next=prev=sweepLine.insert(event),begin=sweepLine.minNode(),prev=prev!==begin?sweepLine.prev(prev):null,next=sweepLine.next(next);const prevEvent=prev?prev.key:null;let prevprevEvent;if(computeFields(event,prevEvent,operation),next&&2===possibleIntersection(event,next.key,eventQueue)&&(computeFields(event,prevEvent,operation),computeFields(next.key,event,operation)),prev&&2===possibleIntersection(prev.key,event,eventQueue)){let prevprev=prev;prevprev=prevprev!==begin?sweepLine.prev(prevprev):null,prevprevEvent=prevprev?prevprev.key:null,computeFields(prevEvent,prevprevEvent,operation),computeFields(event,prevEvent,operation)}}else event=event.otherEvent,next=prev=sweepLine.find(event),prev&&next&&(prev=prev!==begin?sweepLine.prev(prev):null,next=sweepLine.next(next),sweepLine.remove(event),next&&prev&&possibleIntersection(prev.key,next.key,eventQueue))}return sortedEvents})(eventQueue,0,0,sbbox,cbbox,operation),contours=connectEdges(sortedEvents),polygons=[];for(let i=0;i<contours.length;i++){const contour=contours[i];if(contour.isExterior()){const rings=[contour.points];for(let j=0;j<contour.holeIds.length;j++){const holePoints=contours[contour.holeIds[j]].points,hole=[];for(let k=holePoints.length-2;k>=0;k--)hole.push(holePoints[k]);rings.push(hole)}polygons.push(rings)}}return polygons?fromOutlines(polygons.flat()):create$a()},interpolateBetween2DPointsForY=(point1,point2,y)=>{let t,f1=y-point1[1],f2=point2[1]-point1[1];return f2<0&&(f1=-f1,f2=-f2),t=f1<=0?0:f1>=f2?1:f2<1e-10?.5:f1/f2,point1[0]+t*(point2[0]-point1[0])};class OrthonormalFormula{constructor(plane){this.plane=plane;const rightVector=orthogonal([0,0,0],plane);this.v=normalize$1(rightVector,cross$1(rightVector,plane,rightVector)),this.u=cross$1([0,0,0],this.v,plane),this.planeOrigin=scale$3([0,0,0],plane,plane[3]),this.basisMap=new Map}getProjectionMatrix(){return fromValues$4(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(){return fromValues$4(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,this.planeOrigin[0],this.planeOrigin[1],this.planeOrigin[2],1)}to2D(vertex){const point=fromValues$2(dot$2(vertex,this.u),dot$2(vertex,this.v));return this.basisMap.set(point,vertex),point}to3D(point){const original=this.basisMap.get(point);if(original)return original;const v1=scale$3([0,0,0],this.u,point[0]),v2=scale$3([0,0,0],this.v,point[1]),v3=add$1(v1,v1,this.planeOrigin);return add$1(v2,v2,v3)}}const insertSorted=(array,element,compareFunc)=>{let leftBound=0,rightBound=array.length;for(;rightBound>leftBound;){const testIndex=Math.floor((leftBound+rightBound)/2);compareFunc(element,array[testIndex])>0?leftBound=testIndex+1:rightBound=testIndex}array.splice(leftBound,0,element)},fnNumberSort=(a,b)=>a-b,retessellate=geometry=>{if(geometry.isRetesselated)return geometry;const polygons=toPolygons$1(geometry).map(((polygon,index)=>({vertices:polygon.vertices,plane:plane(polygon),index:index}))),classified=classifyPolygons(polygons),destPolygons=[];classified.forEach((group=>{if(Array.isArray(group)){const reTessellateCoplanarPolygons=(sourcePolygons=>{if(sourcePolygons.length<2)return sourcePolygons;const destPolygons=[],numPolygons=sourcePolygons.length,plane$1=plane(sourcePolygons[0]),orthonormalFormula=new OrthonormalFormula(plane$1),polygonVertices2d=[],polygonTopVertexIndexes=[],topy2polygonIndexes=new Map,yCoordinateToPolygonIndexes=new Map,yCoordinateBins=new Map;for(let polygonIndex=0;polygonIndex<numPolygons;polygonIndex++){const poly3d=sourcePolygons[polygonIndex];let vertices2d=[],numVertices=poly3d.vertices.length,minIndex=-1;if(numVertices>0){let miny,maxy;for(let i=0;i<numVertices;i++){let pos2d=orthonormalFormula.to2D(poly3d.vertices[i]);const yCoordinateBin=Math.floor(999999.9999999999*pos2d[1]);let newY;yCoordinateBins.has(yCoordinateBin)?newY=yCoordinateBins.get(yCoordinateBin):yCoordinateBins.has(yCoordinateBin+1)?newY=yCoordinateBins.get(yCoordinateBin+1):yCoordinateBins.has(yCoordinateBin-1)?newY=yCoordinateBins.get(yCoordinateBin-1):(newY=pos2d[1],yCoordinateBins.set(yCoordinateBin,pos2d[1])),pos2d=fromValues$2(pos2d[0],newY),vertices2d.push(pos2d);const y=pos2d[1];(0===i||y<miny)&&(miny=y,minIndex=i),(0===i||y>maxy)&&(maxy=y);let polygonIndexes=yCoordinateToPolygonIndexes.get(y);polygonIndexes||(polygonIndexes={},yCoordinateToPolygonIndexes.set(y,polygonIndexes)),polygonIndexes[polygonIndex]=!0}if(miny>=maxy)vertices2d=[],numVertices=0,minIndex=-1;else{let polygonIndexes=topy2polygonIndexes.get(miny);polygonIndexes||(polygonIndexes=[],topy2polygonIndexes.set(miny,polygonIndexes)),polygonIndexes.push(polygonIndex)}}vertices2d.reverse(),minIndex=numVertices-minIndex-1,polygonVertices2d.push(vertices2d),polygonTopVertexIndexes.push(minIndex)}const yCoordinates=[];yCoordinateToPolygonIndexes.forEach(((polylist,y)=>yCoordinates.push(y))),yCoordinates.sort(fnNumberSort);let activePolygons=[],prevOutPolygonRow=[];for(let yIndex=0;yIndex<yCoordinates.length;yIndex++){const newOutPolygonRow=[],yCoordinate=yCoordinates[yIndex],polygonIndexesWithCorner=yCoordinateToPolygonIndexes.get(yCoordinate);for(let activePolygonIndex=0;activePolygonIndex<activePolygons.length;++activePolygonIndex){const activePolygon=activePolygons[activePolygonIndex],polygonIndex=activePolygon.polygonIndex;if(polygonIndexesWithCorner[polygonIndex]){const vertices2d=polygonVertices2d[polygonIndex],numVertices=vertices2d.length;let newLeftVertexIndex=activePolygon.leftVertexIndex,newRightVertexIndex=activePolygon.rightVertexIndex;for(;;){let nextLeftVertexIndex=newLeftVertexIndex+1;if(nextLeftVertexIndex>=numVertices&&(nextLeftVertexIndex=0),vertices2d[nextLeftVertexIndex][1]!==yCoordinate)break;newLeftVertexIndex=nextLeftVertexIndex}let nextRightVertexIndex=newRightVertexIndex-1;if(nextRightVertexIndex<0&&(nextRightVertexIndex=numVertices-1),vertices2d[nextRightVertexIndex][1]===yCoordinate&&(newRightVertexIndex=nextRightVertexIndex),newLeftVertexIndex!==activePolygon.leftVertexIndex&&newLeftVertexIndex===newRightVertexIndex)activePolygons.splice(activePolygonIndex,1),--activePolygonIndex;else{activePolygon.leftVertexIndex=newLeftVertexIndex,activePolygon.rightVertexIndex=newRightVertexIndex,activePolygon.topLeft=vertices2d[newLeftVertexIndex],activePolygon.topRight=vertices2d[newRightVertexIndex];let nextLeftVertexIndex=newLeftVertexIndex+1;nextLeftVertexIndex>=numVertices&&(nextLeftVertexIndex=0),activePolygon.bottomLeft=vertices2d[nextLeftVertexIndex];let nextRightVertexIndex=newRightVertexIndex-1;nextRightVertexIndex<0&&(nextRightVertexIndex=numVertices-1),activePolygon.bottomRight=vertices2d[nextRightVertexIndex]}}}let nextYcoordinate;if(yIndex>=yCoordinates.length-1)activePolygons=[],nextYcoordinate=null;else{nextYcoordinate=Number(yCoordinates[yIndex+1]);const middleYcoordinate=.5*(yCoordinate+nextYcoordinate),startingPolygonIndexes=topy2polygonIndexes.get(yCoordinate);for(const polygonIndexKey in startingPolygonIndexes){const polygonIndex=startingPolygonIndexes[polygonIndexKey],vertices2d=polygonVertices2d[polygonIndex],numVertices=vertices2d.length,topVertexIndex=polygonTopVertexIndexes[polygonIndex];let topLeftVertexIndex=topVertexIndex;for(;;){let i=topLeftVertexIndex+1;if(i>=numVertices&&(i=0),vertices2d[i][1]!==yCoordinate)break;if(i===topVertexIndex)break;topLeftVertexIndex=i}let topRightVertexIndex=topVertexIndex;for(;;){let i=topRightVertexIndex-1;if(i<0&&(i=numVertices-1),vertices2d[i][1]!==yCoordinate)break;if(i===topLeftVertexIndex)break;topRightVertexIndex=i}let nextLeftVertexIndex=topLeftVertexIndex+1;nextLeftVertexIndex>=numVertices&&(nextLeftVertexIndex=0);let nextRightVertexIndex=topRightVertexIndex-1;nextRightVertexIndex<0&&(nextRightVertexIndex=numVertices-1);const newActivePolygon={polygonIndex:polygonIndex,leftVertexIndex:topLeftVertexIndex,rightVertexIndex:topRightVertexIndex,topLeft:vertices2d[topLeftVertexIndex],topRight:vertices2d[topRightVertexIndex],bottomLeft:vertices2d[nextLeftVertexIndex],bottomRight:vertices2d[nextRightVertexIndex]};insertSorted(activePolygons,newActivePolygon,((el1,el2)=>{const x1=interpolateBetween2DPointsForY(el1.topLeft,el1.bottomLeft,middleYcoordinate),x2=interpolateBetween2DPointsForY(el2.topLeft,el2.bottomLeft,middleYcoordinate);return x1>x2?1:x1<x2?-1:0}))}}for(const activePolygonKey in activePolygons){const activePolygon=activePolygons[activePolygonKey];let x=interpolateBetween2DPointsForY(activePolygon.topLeft,activePolygon.bottomLeft,yCoordinate);const topLeft=fromValues$2(x,yCoordinate);x=interpolateBetween2DPointsForY(activePolygon.topRight,activePolygon.bottomRight,yCoordinate);const topRight=fromValues$2(x,yCoordinate);x=interpolateBetween2DPointsForY(activePolygon.topLeft,activePolygon.bottomLeft,nextYcoordinate);const bottomLeft=fromValues$2(x,nextYcoordinate);x=interpolateBetween2DPointsForY(activePolygon.topRight,activePolygon.bottomRight,nextYcoordinate);const bottomRight=fromValues$2(x,nextYcoordinate),outPolygon={topLeft:topLeft,topRight:topRight,bottomLeft:bottomLeft,bottomRight:bottomRight,leftLine:fromPoints$1([0,1,0],topLeft,bottomLeft),rightLine:fromPoints$1([0,1,0],bottomRight,topRight)};if(newOutPolygonRow.length>0){const prevOutPolygon=newOutPolygonRow[newOutPolygonRow.length-1],d1=distance(outPolygon.topLeft,prevOutPolygon.topRight),d2=distance(outPolygon.bottomLeft,prevOutPolygon.bottomRight);d1<EPS&&d2<EPS&&(outPolygon.topLeft=prevOutPolygon.topLeft,outPolygon.leftLine=prevOutPolygon.leftLine,outPolygon.bottomLeft=prevOutPolygon.bottomLeft,newOutPolygonRow.splice(newOutPolygonRow.length-1,1))}newOutPolygonRow.push(outPolygon)}if(yIndex>0){const prevContinuedIndexes=new Set,matchedIndexes=new Set;for(let i=0;i<newOutPolygonRow.length;i++){const thisPolygon=newOutPolygonRow[i];for(let ii=0;ii<prevOutPolygonRow.length;ii++)if(!matchedIndexes.has(ii)){const prevPolygon=prevOutPolygonRow[ii];if(distance(prevPolygon.bottomLeft,thisPolygon.topLeft)<EPS&&distance(prevPolygon.bottomRight,thisPolygon.topRight)<EPS){matchedIndexes.add(ii);const v1=direction$1(thisPolygon.leftLine),v2=direction$1(prevPolygon.leftLine),d1=v1[0]-v2[0],v3=direction$1(thisPolygon.rightLine),v4=direction$1(prevPolygon.rightLine),d2=v3[0]-v4[0],leftLineContinues=Math.abs(d1)<EPS,rightLineContinues=Math.abs(d2)<EPS;(leftLineContinues||d1>=0)&&(rightLineContinues||d2>=0)&&(thisPolygon.outPolygon=prevPolygon.outPolygon,thisPolygon.leftLineContinues=leftLineContinues,thisPolygon.rightLineContinues=rightLineContinues,prevContinuedIndexes.add(ii));break}}}for(let ii=0;ii<prevOutPolygonRow.length;ii++)if(!prevContinuedIndexes.has(ii)){const prevPolygon=prevOutPolygonRow[ii];prevPolygon.outPolygon.rightPoints.push(prevPolygon.bottomRight),distance(prevPolygon.bottomRight,prevPolygon.bottomLeft)>EPS&&prevPolygon.outPolygon.leftPoints.push(prevPolygon.bottomLeft),prevPolygon.outPolygon.leftPoints.reverse();const vertices3d=prevPolygon.outPolygon.rightPoints.concat(prevPolygon.outPolygon.leftPoints).map((point2d=>orthonormalFormula.to3D(point2d))),polygon=fromVerticesAndPlane(vertices3d,plane$1);polygon.vertices.length&&destPolygons.push(polygon)}}for(let i=0;i<newOutPolygonRow.length;i++){const thisPolygon=newOutPolygonRow[i];thisPolygon.outPolygon?(thisPolygon.leftLineContinues||thisPolygon.outPolygon.leftPoints.push(thisPolygon.topLeft),thisPolygon.rightLineContinues||thisPolygon.outPolygon.rightPoints.push(thisPolygon.topRight)):(thisPolygon.outPolygon={leftPoints:[],rightPoints:[]},thisPolygon.outPolygon.leftPoints.push(thisPolygon.topLeft),distance(thisPolygon.topLeft,thisPolygon.topRight)>EPS&&thisPolygon.outPolygon.rightPoints.push(thisPolygon.topRight))}prevOutPolygonRow=newOutPolygonRow}return destPolygons})(group);destPolygons.push(...reTessellateCoplanarPolygons)}else destPolygons.push(group)}));const result=create$8(destPolygons);return result.isRetesselated=!0,result},classifyPolygons=polygons=>{let clusters=[polygons];const nonCoplanar=[];for(let component=3;component>=0;component--){const maybeCoplanar=[],tolerance=3===component?15e-9:NEPS;clusters.forEach((cluster=>{cluster.sort(byPlaneComponent(component,tolerance));let startIndex=0;for(let i=1;i<cluster.length;i++)cluster[i].plane[component]-cluster[startIndex].plane[component]>tolerance&&(i-startIndex==1?nonCoplanar.push(cluster[startIndex]):maybeCoplanar.push(cluster.slice(startIndex,i)),startIndex=i);cluster.length-startIndex==1?nonCoplanar.push(cluster[startIndex]):maybeCoplanar.push(cluster.slice(startIndex))})),clusters=maybeCoplanar}const result=[];return clusters.forEach((cluster=>{cluster[0]&&(result[cluster[0].index]=cluster)})),nonCoplanar.forEach((polygon=>{result[polygon.index]=polygon})),result},byPlaneComponent=(component,tolerance)=>(a,b)=>a.plane[component]-b.plane[component]>tolerance?1:b.plane[component]-a.plane[component]>tolerance?-1:0;class Node{constructor(parent){this.plane=null,this.front=null,this.back=null,this.polygontreenodes=[],this.parent=parent}invert(){const queue=[this];let node;for(let i=0;i<queue.length;i++){node=queue[i],node.plane&&(node.plane=flip([0,0,0,0],node.plane)),node.front&&queue.push(node.front),node.back&&queue.push(node.back);const temp=node.front;node.front=node.back,node.back=temp}}clipPolygons(polygonTreeNodes,alsoRemoveCoplanarFront){let node,current={node:this,polygonTreeNodes:polygonTreeNodes};const stack=[];do{if(node=current.node,polygonTreeNodes=current.polygonTreeNodes,node.plane){const plane=node.plane,backNodes=[],frontNodes=[],coplanarFrontNodes=alsoRemoveCoplanarFront?backNodes:frontNodes;polygonTreeNodes.forEach((treeNode=>{treeNode.isRemoved()||treeNode.splitByPlane(plane,coplanarFrontNodes,backNodes,frontNodes,backNodes)})),node.front&&frontNodes.length>0&&stack.push({node:node.front,polygonTreeNodes:frontNodes});const numBackNodes=backNodes.length;if(node.back&&numBackNodes>0)stack.push({node:node.back,polygonTreeNodes:backNodes});else for(let i=0;i<numBackNodes;i++)backNodes[i].remove()}current=stack.pop()}while(void 0!==current)}clipTo(tree,alsoRemoveCoplanarFront){let node=this;const stack=[];do{node.polygontreenodes.length>0&&tree.rootnode.clipPolygons(node.polygontreenodes,alsoRemoveCoplanarFront),node.front&&stack.push(node.front),node.back&&stack.push(node.back),node=stack.pop()}while(void 0!==node)}addPolygonTreeNodes(newPolygonTreeNodes){let current={node:this,polygonTreeNodes:newPolygonTreeNodes};const stack=[];do{const node=current.node,polygonTreeNodes=current.polygonTreeNodes,len=polygonTreeNodes.length;if(0===len){current=stack.pop();continue}if(!node.plane){let index=0;index=Math.floor(len/2);const bestPoly=polygonTreeNodes[index].getPolygon();node.plane=plane(bestPoly)}const frontNodes=[],backNodes=[];for(let i=0;i<len;++i)polygonTreeNodes[i].splitByPlane(node.plane,node.polygontreenodes,backNodes,frontNodes,backNodes);frontNodes.length>0&&(node.front||(node.front=new Node(node)),len===frontNodes.length&&0===backNodes.length?node.front.polygontreenodes=frontNodes:stack.push({node:node.front,polygonTreeNodes:frontNodes})),backNodes.length>0&&(node.back||(node.back=new Node(node)),len===backNodes.length&&0===frontNodes.length?node.back.polygontreenodes=backNodes:stack.push({node:node.back,polygonTreeNodes:backNodes})),current=stack.pop()}while(void 0!==current)}}const splitLineSegmentByPlane=(plane,p1,p2)=>{const direction=subtract$3([0,0,0],p2,p1);let lambda=(plane[3]-dot$2(plane,p1))/dot$2(plane,direction);return Number.isNaN(lambda)&&(lambda=0),lambda>1&&(lambda=1),lambda<0&&(lambda=0),scale$3(direction,direction,lambda),add$1(direction,p1,direction),direction};class PolygonTreeNode{constructor(parent,polygon){this.parent=parent,this.children=[],this.polygon=polygon,this.removed=!1}addPolygons(polygons){if(!this.isRootNode())throw new Error("Assertion failed");const _this=this;polygons.forEach((polygon=>{_this.addChild(polygon)}))}remove(){if(!this.removed){this.removed=!0,this.polygon=null;const parentschildren=this.parent.children,i=parentschildren.indexOf(this);if(i<0)throw new Error("Assertion failed");parentschildren.splice(i,1),this.parent.recursivelyInvalidatePolygon()}}isRemoved(){return this.removed}isRootNode(){return!this.parent}invert(){if(!this.isRootNode())throw new Error("Assertion failed");this.invertSub()}getPolygon(){if(!this.polygon)throw new Error("Assertion failed");return this.polygon}getPolygons(result){let children=[this];const queue=[children];let i,j,l,node;for(i=0;i<queue.length;++i)for(children=queue[i],j=0,l=children.length;j<l;j++)node=children[j],node.polygon?result.push(node.polygon):node.children.length>0&&queue.push(node.children)}splitByPlane(plane,coplanarFrontNodes,coplanarBackNodes,frontNodes,backNodes){if(this.children.length){const queue=[this.children];let i,j,l,node,nodes;for(i=0;i<queue.length;i++)for(nodes=queue[i],j=0,l=nodes.length;j<l;j++)node=nodes[j],node.children.length>0?queue.push(node.children):node._splitByPlane(plane,coplanarFrontNodes,coplanarBackNodes,frontNodes,backNodes)}else this._splitByPlane(plane,coplanarFrontNodes,coplanarBackNodes,frontNodes,backNodes)}_splitByPlane(splane,coplanarFrontNodes,coplanarBackNodes,frontNodes,backNodes){const polygon=this.polygon;if(polygon){const bound=measureBoundingSphere$1(polygon),sphereRadius=bound[3]+EPS,d=dot$2(splane,bound)-splane[3];if(d>sphereRadius)frontNodes.push(this);else if(d<-sphereRadius)backNodes.push(this);else{const splitResult=((splane,polygon)=>{const result={type:null,front:null,back:null},vertices=polygon.vertices,numVertices=vertices.length,pplane=plane(polygon);if(equals$5(pplane,splane))result.type=0;else{let hasFront=!1,hasBack=!1;const vertexIsBack=[],MINEPS=-EPS;for(let i=0;i<numVertices;i++){const t=dot$2(splane,vertices[i])-splane[3],isback=t<MINEPS;vertexIsBack.push(isback),t>EPS&&(hasFront=!0),t<MINEPS&&(hasBack=!0)}if(hasFront||hasBack)if(hasBack)if(hasFront){result.type=4;const frontVertices=[],backVertices=[];let isback=vertexIsBack[0];for(let vertexIndex=0;vertexIndex<numVertices;vertexIndex++){const vertex=vertices[vertexIndex];let nextVertexIndex=vertexIndex+1;nextVertexIndex>=numVertices&&(nextVertexIndex=0);const nextIsBack=vertexIsBack[nextVertexIndex];if(isback===nextIsBack)isback?backVertices.push(vertex):frontVertices.push(vertex);else{const nextPoint=vertices[nextVertexIndex],intersectionPoint=splitLineSegmentByPlane(splane,vertex,nextPoint);isback?(backVertices.push(vertex),backVertices.push(intersectionPoint),frontVertices.push(intersectionPoint)):(frontVertices.push(vertex),frontVertices.push(intersectionPoint),backVertices.push(intersectionPoint))}isback=nextIsBack}const EPS_SQUARED=EPS*EPS;if(backVertices.length>=3){let prevVertex=backVertices[backVertices.length-1];for(let vertexIndex=0;vertexIndex<backVertices.length;vertexIndex++){const vertex=backVertices[vertexIndex];squaredDistance$1(vertex,prevVertex)<EPS_SQUARED&&(backVertices.splice(vertexIndex,1),vertexIndex--),prevVertex=vertex}}if(frontVertices.length>=3){let prevVertex=frontVertices[frontVertices.length-1];for(let vertexIndex=0;vertexIndex<frontVertices.length;vertexIndex++){const vertex=frontVertices[vertexIndex];squaredDistance$1(vertex,prevVertex)<EPS_SQUARED&&(frontVertices.splice(vertexIndex,1),vertexIndex--),prevVertex=vertex}}frontVertices.length>=3&&(result.front=fromVerticesAndPlane(frontVertices,pplane)),backVertices.length>=3&&(result.back=fromVerticesAndPlane(backVertices,pplane))}else result.type=3;else result.type=2;else{const t=dot$2(splane,pplane);result.type=t>=0?0:1}}return result})(splane,polygon);switch(splitResult.type){case 0:coplanarFrontNodes.push(this);break;case 1:coplanarBackNodes.push(this);break;case 2:frontNodes.push(this);break;case 3:backNodes.push(this);break;case 4:if(splitResult.front){const frontNode=this.addChild(splitResult.front);frontNodes.push(frontNode)}if(splitResult.back){const backNode=this.addChild(splitResult.back);backNodes.push(backNode)}}}}}addChild(polygon){const newChild=new PolygonTreeNode(this,polygon);return this.children.push(newChild),newChild}invertSub(){let children=[this];const queue=[children];let i,j,l,node;for(i=0;i<queue.length;i++)for(children=queue[i],j=0,l=children.length;j<l;j++)node=children[j],node.polygon&&(node.polygon=invert$1(node.polygon)),node.children.length>0&&queue.push(node.children)}recursivelyInvalidatePolygon(){this.polygon=null,this.parent&&this.parent.recursivelyInvalidatePolygon()}clear(){let children=[this];const queue=[children];for(let i=0;i<queue.length;++i){children=queue[i];const l=children.length;for(let j=0;j<l;j++){const node=children[j];node.polygon&&(node.polygon=null),node.parent&&(node.parent=null),node.children.length>0&&queue.push(node.children),node.children=[]}}}toString(){let result="",children=[this];const queue=[children];let i,j,l,node;for(i=0;i<queue.length;++i){children=queue[i];const prefix=" ".repeat(i);for(j=0,l=children.length;j<l;j++)node=children[j],result+=`${prefix}PolygonTreeNode (${node.isRootNode()}): ${node.children.length}`,node.polygon?result+=`\n ${prefix}polygon: ${node.polygon.vertices}\n`:result+="\n",node.children.length>0&&queue.push(node.children)}return result}}class Tree{constructor(polygons){this.polygonTree=new PolygonTreeNode,this.rootnode=new Node(null),polygons&&this.addPolygons(polygons)}invert(){this.polygonTree.invert(),this.rootnode.invert()}clipTo(tree,alsoRemoveCoplanarFront=!1){this.rootnode.clipTo(tree,alsoRemoveCoplanarFront)}allPolygons(){const result=[];return this.polygonTree.getPolygons(result),result}addPolygons(polygons){const polygonTreeNodes=new Array(polygons.length);for(let i=0;i<polygons.length;i++)polygonTreeNodes[i]=this.polygonTree.addChild(polygons[i]);this.rootnode.addPolygonTreeNodes(polygonTreeNodes)}clear(){this.polygonTree.clear()}toString(){return"Tree: "+this.polygonTree.toString("")}}const mayOverlap=(geometry1,geometry2)=>{if(0===geometry1.polygons.length||0===geometry2.polygons.length)return!1;const bounds1=measureBoundingBox(geometry1),min1=bounds1[0],max1=bounds1[1],bounds2=measureBoundingBox(geometry2),min2=bounds2[0],max2=bounds2[1];return!(min2[0]-max1[0]>EPS||min1[0]-max2[0]>EPS||min2[1]-max1[1]>EPS||min1[1]-max2[1]>EPS||min2[2]-max1[2]>EPS||min1[2]-max2[2]>EPS)},intersectGeom3=geometries=>{let newGeometry=geometries.shift();return geometries.forEach((geometry=>{newGeometry=((geometry1,geometry2)=>{if(!mayOverlap(geometry1,geometry2))return create$8();const a=new Tree(toPolygons$1(geometry1)),b=new Tree(toPolygons$1(geometry2));a.invert(),b.clipTo(a),b.invert(),a.clipTo(b),b.clipTo(a),a.addPolygons(b.allPolygons()),a.invert();const newPolygons=a.allPolygons();return create$8(newPolygons)})(newGeometry,geometry)})),newGeometry=retessellate(newGeometry),newGeometry},scission=(...objects)=>{const results=objects.map((object=>isA$3(object)?(geometry=>{const eps=measureEpsilon(geometry),polygons=toPolygons$1(geometry),pl=polygons.length,indexesPerVertex=new Map,temp=[0,0,0];polygons.forEach(((polygon,index)=>{polygon.vertices.forEach((vertex=>{((map,vertex,index)=>{const key=`${vertex}`,mapping=map.get(key);void 0===mapping?map.set(key,[index]):mapping.push(index)})(indexesPerVertex,snap$2(temp,vertex,eps),index)}))}));const indexesPerPolygon=polygons.map((polygon=>{let indexes=[];return polygon.vertices.forEach((vertex=>{indexes=indexes.concat(((map,vertex)=>{const key=`${vertex}`;return map.get(key)})(indexesPerVertex,snap$2(temp,vertex,eps)))})),{e:1,d:(array=indexes,array.sort(((a,b)=>a-b)).filter(((item,pos,ary)=>!pos||item!==ary[pos-1])))};var array}));indexesPerVertex.clear();let merges=0;const ippl=indexesPerPolygon.length;for(let i=0;i<ippl;i++){const mapi=indexesPerPolygon[i];if(mapi.e>0){const indexes=new Array(pl);indexes[i]=!0;do{merges=0,indexes.forEach(((e,j)=>{const mapj=indexesPerPolygon[j];if(mapj.e>0){mapj.e=-1;for(let d=0;d<mapj.d.length;d++)indexes[mapj.d[d]]=!0;merges++}}))}while(merges>0);mapi.indexes=indexes}}const newgeometries=[];for(let i=0;i<ippl;i++)if(indexesPerPolygon[i].indexes){const newpolygons=[];indexesPerPolygon[i].indexes.forEach(((e,p)=>newpolygons.push(polygons[p]))),newgeometries.push(create$8(newpolygons))}return newgeometries})(object):Array.isArray(object)?scission(...object):object));return 1===results.length?results[0]:results},subtractGeom3=geometries=>{let newGeometry=geometries.shift();return geometries.forEach((geometry=>{newGeometry=((geometry1,geometry2)=>{if(!mayOverlap(geometry1,geometry2))return clone$7(geometry1);const a=new Tree(toPolygons$1(geometry1)),b=new Tree(toPolygons$1(geometry2));a.invert(),a.clipTo(b),b.clipTo(a,!0),a.addPolygons(b.allPolygons()),a.invert();const newPolygons=a.allPolygons();return create$8(newPolygons)})(newGeometry,geometry)})),newGeometry=retessellate(newGeometry),newGeometry},unionGeom2=geometries=>{let newGeometry=geometries.shift();return geometries.forEach((geometry=>{newGeometry=boolean(newGeometry,geometry,1)})),newGeometry},unionGeom3Sub=(geometry1,geometry2)=>{if(!mayOverlap(geometry1,geometry2))return unionForNonIntersecting(geometry1,geometry2);const a=new Tree(toPolygons$1(geometry1)),b=new Tree(toPolygons$1(geometry2));a.clipTo(b,!1),b.clipTo(a),b.invert(),b.clipTo(a),b.invert();const newPolygons=a.allPolygons().concat(b.allPolygons());return create$8(newPolygons)},unionForNonIntersecting=(geometry1,geometry2)=>{let newpolygons=toPolygons$1(geometry1);return newpolygons=newpolygons.concat(toPolygons$1(geometry2)),create$8(newpolygons)},union=(...geometries)=>{if(0===(geometries=coalesce(geometries)).length)return;if(!areAllShapesTheSameType(geometries))throw new Error("union arguments must be the same geometry type");const geometry=geometries[0];if(isA$5(geometry))return unionGeom2(geometries);if(isA$3(geometry))return(geometries=>{let i;for(i=1;i<geometries.length;i+=2)geometries.push(unionGeom3Sub(geometries[i-1],geometries[i]));let newGeometry=geometries[i-1];return newGeometry=retessellate(newGeometry),newGeometry})(geometries);throw new Error("union unsupported geometry type")},extrudeLinearGeom2=(options,geometry)=>{let{offset:offset,twistAngle:twistAngle,twistSteps:twistSteps,repair:repair}=Object.assign({},{offset:[0,0,1],twistAngle:0,twistSteps:12,repair:!0},options);if(twistSteps<1)throw new Error("twistSteps must be 1 or more");0===twistAngle&&(twistSteps=1);const offsetV=clone$9(offset);let baseSlice=fromGeom2(geometry);offsetV[2]<0&&(baseSlice=reverse$2(baseSlice));const matrix=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];options={numberOfSlices:twistSteps+1,capStart:!0,capEnd:!0,repair:repair,callback:(progress,index,base)=>{const Zrotation=index/twistSteps*twistAngle,Zoffset=scale$3([0,0,0],offsetV,index/twistSteps);return multiply$1(matrix,fromZRotation(matrix,Zrotation),fromTranslation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],Zoffset)),transform$3(matrix,base)}};const output=extrudeFromSlices(options,baseSlice);return geometry.color&&(output.color=geometry.color),output},extrudeLinear=(options,...objects)=>{const{height:height,twistAngle:twistAngle,twistSteps:twistSteps,repair:repair}=Object.assign({},{height:1,twistAngle:0,twistSteps:1,repair:!0},options);options={offset:[0,0,height],twistAngle:twistAngle,twistSteps:twistSteps,repair:repair};const results=objects.map((object=>isA$2(object)?((options,geometry)=>{if(!geometry.isClosed)throw new Error("extruded path must be closed");const points=toPoints$1(geometry),geometry2=create$a([points]);return geometry.color&&(geometry2.color=geometry.color),extrudeLinearGeom2(options,geometry2)})(options,object):isA$5(object)?extrudeLinearGeom2(options,object):Array.isArray(object)?extrudeLinear(options,...object):object));return 1===results.length?results[0]:results},aboutEqualNormals=(a,b)=>Math.abs(a[0]-b[0])<=NEPS&&Math.abs(a[1]-b[1])<=NEPS&&Math.abs(a[2]-b[2])<=NEPS,project=(options,...objects)=>{const{axis:axis,origin:origin}=Object.assign({},{axis:[0,0,1],origin:[0,0,0]},options);options={axis:axis,origin:origin};const results=objects.map((object=>isA$3(object)?((options,geometry)=>{const projPlane=fromNormalAndPoint([0,0,0,0],options.axis,options.origin);if(Number.isNaN(projPlane[0])||Number.isNaN(projPlane[1])||Number.isNaN(projPlane[2])||Number.isNaN(projPlane[3]))throw new Error("project: invalid axis or origin");const epsilon=measureEpsilon(geometry),epsilonArea=epsilon*epsilon*Math.sqrt(3)/4;if(0===epsilon)return create$a();const polygons=toPolygons$1(geometry);let projPolys=[];for(let i=0;i<polygons.length;i++){const newVertices=polygons[i].vertices.map((v=>projectionOfPoint(projPlane,v))),newPoly=create$7(newVertices),newPlane=plane(newPoly);aboutEqualNormals(projPlane,newPlane)&&(measureArea$2(newPoly)<epsilonArea||projPolys.push(newPoly))}if(!aboutEqualNormals(projPlane,[0,0,1])){const rotation=fromVectorRotation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],projPlane,[0,0,1]);projPolys=projPolys.map((p=>transform$7(rotation,p)))}projPolys=projPolys.sort(((a,b)=>measureArea$2(b)-measureArea$2(a)));const projGeoms=projPolys.map((p=>{const cloned=p.vertices.map(clone$8);return create$a([cloned])})),output=unionGeom2(projGeoms);return geometry.color&&(output.color=geometry.color),output})(options,object):Array.isArray(object)?project(options,...object):object));return 1===results.length?results[0]:results},hullPoints2=uniquePoints=>{let min=fromValues$2(1/0,1/0);uniquePoints.forEach((point=>{(point[1]<min[1]||point[1]===min[1]&&point[0]<min[0])&&(min=point)}));const points=[];uniquePoints.forEach((point=>{const angle=fakeAtan2(point[1]-min[1],point[0]-min[0]),distSq=squaredDistance(point,min);points.push({point:point,angle:angle,distSq:distSq})})),points.sort(((pt1,pt2)=>pt1.angle!==pt2.angle?pt1.angle-pt2.angle:pt1.distSq-pt2.distSq));const stack=[];return points.forEach((point=>{let cnt=stack.length;for(;cnt>1&&ccw(stack[cnt-2],stack[cnt-1],point.point)<=Number.EPSILON;)stack.pop(),cnt=stack.length;stack.push(point.point)})),stack},ccw=(v1,v2,v3)=>(v2[0]-v1[0])*(v3[1]-v1[1])-(v2[1]-v1[1])*(v3[0]-v1[0]),fakeAtan2=(y,x)=>0===y&&0===x?-1/0:-x/y,toUniquePoints=geometries=>{const found=new Set,uniquePoints=[],addPoint=point=>{const key=point.toString();found.has(key)||(uniquePoints.push(point),found.add(key))};return geometries.forEach((geometry=>{isA$5(geometry)?toPoints$3(geometry).forEach(addPoint):isA$3(geometry)?toPoints$2(geometry).forEach((points=>points.forEach(addPoint))):isA$2(geometry)&&toPoints$1(geometry).forEach(addPoint)})),uniquePoints},hullPoints3=uniquePoints=>{const polygons=runner(uniquePoints,{skipTriangulation:!0}).map((face=>{const vertices=face.map((index=>uniquePoints[index]));return create$7(vertices)}));return polygons},hull=(...geometries)=>{if(0===(geometries=coalesce(geometries)).length)return;if(!areAllShapesTheSameType(geometries))throw new Error("only hulls of the same type are supported");const geometry=geometries[0];return isA$2(geometry)?(geometries=>{const unique=toUniquePoints(geometries),hullPoints=hullPoints2(unique);return fromPoints$2({closed:!0},hullPoints)})(geometries):isA$5(geometry)?(geometries=>{const unique=toUniquePoints(geometries),hullPoints=hullPoints2(unique);return hullPoints.length<3?create$a():create$a([hullPoints])})(geometries):isA$3(geometry)?(geometries=>{const unique=toUniquePoints(geometries);return 0===unique.length?create$8():create$8(hullPoints3(unique))})(geometries):geometry},snapPolygons=(epsilon,polygons)=>{let newPolygons=polygons.map((polygon=>{const snapVertices=polygon.vertices.map((vertex=>snap$2([0,0,0],vertex,epsilon))),newVertices=[];for(let i=0;i<snapVertices.length;i++){const j=(i+1)%snapVertices.length;equals$7(snapVertices[i],snapVertices[j])||newVertices.push(snapVertices[i])}const newPolygon=create$7(newVertices);return polygon.color&&(newPolygon.color=polygon.color),newPolygon}));const epsilonArea=epsilon*epsilon*Math.sqrt(3)/4;return newPolygons=newPolygons.filter((polygon=>((epsilon,polygon)=>{const area=Math.abs(measureArea$2(polygon));return Number.isFinite(area)&&area>epsilon})(epsilonArea,polygon))),newPolygons},createEdges=polygon=>{const vertices=toVertices$1(polygon),edges=[];for(let i=0;i<vertices.length;i++){const j=(i+1)%vertices.length,edge={v1:vertices[i],v2:vertices[j]};edges.push(edge)}for(let i=0;i<edges.length;i++){const j=(i+1)%vertices.length;edges[i].next=edges[j],edges[j].prev=edges[i]}return edges},insertEdge=(edges,edge)=>{const key=`${edge.v1}:${edge.v2}`;edges.set(key,edge)},deleteEdge=(edges,edge)=>{const key=`${edge.v1}:${edge.v2}`;edges.delete(key)},findOppositeEdge=(edges,edge)=>{const key=`${edge.v2}:${edge.v1}`;return edges.get(key)},calculateAnglesBetween=(current,opposite,normal)=>{let v0=current.prev.v1,v1=current.prev.v2,v2=opposite.next.v2;const angle1=calculateAngle(v0,v1,v2,normal);return v0=opposite.prev.v1,v1=opposite.prev.v2,v2=current.next.v2,[angle1,calculateAngle(v0,v1,v2,normal)]},v1=[0,0,0],v2=[0,0,0],calculateAngle=(prevVertex,midVertex,nextVertex,normal)=>{const d0=subtract$3(v1,midVertex,prevVertex),d1=subtract$3(v2,nextVertex,midVertex);return cross$1(d0,d0,d1),dot$2(d0,normal)},mergeCoplanarPolygons=sourcePolygons=>{if(sourcePolygons.length<2)return sourcePolygons;const normal=sourcePolygons[0].plane,polygons=sourcePolygons.slice(),edgeList=new Map;for(;polygons.length>0;){const polygon=polygons.shift(),edges=createEdges(polygon);for(let i=0;i<edges.length;i++){const current=edges[i],opposite=findOppositeEdge(edgeList,current);if(opposite){const angles=calculateAnglesBetween(current,opposite,normal);if(angles[0]>=0&&angles[1]>=0){const edge1=opposite.next,edge2=current.next;current.prev.next=opposite.next,current.next.prev=opposite.prev,opposite.prev.next=current.next,opposite.next.prev=current.prev,current.v1=null,current.v2=null,current.next=null,current.prev=null,deleteEdge(edgeList,opposite),opposite.v1=null,opposite.v2=null,opposite.next=null,opposite.prev=null;const mergeEdges=(list,e1,e2)=>{const newEdge={v1:e2.v1,v2:e1.v2,next:e1.next,prev:e2.prev};e2.prev.next=newEdge,e1.next.prev=newEdge,deleteEdge(list,e1),e1.v1=null,e1.v2=null,e1.next=null,e1.prev=null,deleteEdge(list,e2),e2.v1=null,e2.v2=null,e2.next=null,e2.prev=null};0===angles[0]&&mergeEdges(edgeList,edge1,edge1.prev),0===angles[1]&&mergeEdges(edgeList,edge2,edge2.prev)}}else current.next&&insertEdge(edgeList,current)}}const destPolygons=[];return edgeList.forEach((edge=>{const polygon=(edge=>{let polygon;const vertices=[];for(;edge.next;){const next=edge.next;vertices.push(edge.v1),edge.v1=null,edge.v2=null,edge.next=null,edge.prev=null,edge=next}return vertices.length>0&&(polygon=create$7(vertices)),polygon})(edge);polygon&&destPolygons.push(polygon)})),edgeList.clear(),destPolygons},mergePolygons=(epsilon,polygons)=>{const polygonsPerPlane=[];polygons.forEach((polygon=>{const mapping=polygonsPerPlane.find((element=>{return plane1=element[0],plane2=plane(polygon),Math.abs(plane1[3]-plane2[3])<15e-8&&aboutEqualNormals(plane1,plane2);var plane1,plane2}));mapping?mapping[1].push(polygon):polygonsPerPlane.push([plane(polygon),[polygon]])}));let destPolygons=[];return polygonsPerPlane.forEach((mapping=>{const sourcePolygons=mapping[1],retesselatedPolygons=mergeCoplanarPolygons(sourcePolygons);destPolygons=destPolygons.concat(retesselatedPolygons)})),destPolygons},getTag=vertex=>`${vertex}`,addSide=(sideMap,vertextag2sidestart,vertextag2sideend,vertex0,vertex1,polygonIndex)=>{const startTag=getTag(vertex0),endTag=getTag(vertex1),newSideTag=`${startTag}/${endTag}`,reverseSideTag=`${endTag}/${startTag}`;if(sideMap.has(reverseSideTag))return deleteSide(sideMap,vertextag2sidestart,vertextag2sideend,vertex1,vertex0,null),null;const newSideObj={vertex0:vertex0,vertex1:vertex1,polygonIndex:polygonIndex};return sideMap.has(newSideTag)?sideMap.get(newSideTag).push(newSideObj):sideMap.set(newSideTag,[newSideObj]),vertextag2sidestart.has(startTag)?vertextag2sidestart.get(startTag).push(newSideTag):vertextag2sidestart.set(startTag,[newSideTag]),vertextag2sideend.has(endTag)?vertextag2sideend.get(endTag).push(newSideTag):vertextag2sideend.set(endTag,[newSideTag]),newSideTag},deleteSide=(sidemap,vertextag2sidestart,vertextag2sideend,vertex0,vertex1,polygonIndex)=>{const startTag=getTag(vertex0),endTag=getTag(vertex1),sideTag=`${startTag}/${endTag}`;let idx=-1;const sideObjs=sidemap.get(sideTag);for(let i=0;i<sideObjs.length;i++){const sideObj=sideObjs[i];let sideTag=getTag(sideObj.vertex0);if(sideTag===startTag&&(sideTag=getTag(sideObj.vertex1),sideTag===endTag&&(null===polygonIndex||sideObj.polygonIndex===polygonIndex))){idx=i;break}}sideObjs.splice(idx,1),0===sideObjs.length&&sidemap.delete(sideTag),idx=vertextag2sidestart.get(startTag).indexOf(sideTag),vertextag2sidestart.get(startTag).splice(idx,1),0===vertextag2sidestart.get(startTag).length&&vertextag2sidestart.delete(startTag),idx=vertextag2sideend.get(endTag).indexOf(sideTag),vertextag2sideend.get(endTag).splice(idx,1),0===vertextag2sideend.get(endTag).length&&vertextag2sideend.delete(endTag)},triangulatePolygons=(epsilon,polygons)=>{const triangles=[];return polygons.forEach((polygon=>{((epsilon,polygon,triangles)=>{const nv=polygon.vertices.length;if(nv>3){if(nv>4){const midpoint=[0,0,0];polygon.vertices.forEach((vertex=>add$1(midpoint,midpoint,vertex))),snap$2(midpoint,divide$1(midpoint,midpoint,[nv,nv,nv]),epsilon);for(let i=0;i<nv;i++){const poly=create$7([midpoint,polygon.vertices[i],polygon.vertices[(i+1)%nv]]);polygon.color&&(poly.color=polygon.color),triangles.push(poly)}return}const poly0=create$7([polygon.vertices[0],polygon.vertices[1],polygon.vertices[2]]),poly1=create$7([polygon.vertices[0],polygon.vertices[2],polygon.vertices[3]]);return polygon.color&&(poly0.color=polygon.color,poly1.color=polygon.color),void triangles.push(poly0,poly1)}triangles.push(polygon)})(epsilon,polygon,triangles)})),triangles},generalizeGeom3=(options,geometry)=>{const{snap:snap,simplify:simplify,triangulate:triangulate}=Object.assign({},{snap:!1,simplify:!1,triangulate:!1},options),epsilon=measureEpsilon(geometry);let polygons=toPolygons$1(geometry);snap&&(polygons=snapPolygons(epsilon,polygons)),simplify&&(polygons=mergePolygons(0,polygons)),triangulate&&(polygons=(polygons=>{const sideMap=new Map;for(let polygonIndex=0;polygonIndex<polygons.length;polygonIndex++){const polygon=polygons[polygonIndex],numVertices=polygon.vertices.length;if(numVertices>=3){let vertex=polygon.vertices[0],vertexTag=getTag(vertex);for(let vertexIndex=0;vertexIndex<numVertices;vertexIndex++){let nextVertexIndex=vertexIndex+1;nextVertexIndex===numVertices&&(nextVertexIndex=0);const nextVertex=polygon.vertices[nextVertexIndex],nextVertexTag=getTag(nextVertex),sideTag=`${vertexTag}/${nextVertexTag}`,reverseSideTag=`${nextVertexTag}/${vertexTag}`;if(sideMap.has(reverseSideTag)){const ar=sideMap.get(reverseSideTag);ar.splice(-1,1),0===ar.length&&sideMap.delete(reverseSideTag)}else{const sideobj={vertex0:vertex,vertex1:nextVertex,polygonIndex:polygonIndex};sideMap.has(sideTag)?sideMap.get(sideTag).push(sideobj):sideMap.set(sideTag,[sideobj])}vertex=nextVertex,vertexTag=nextVertexTag}}else console.warn("warning: invalid polygon found during insertTjunctions")}if(sideMap.size>0){const vertextag2sidestart=new Map,vertextag2sideend=new Map,sidesToCheck=new Map;for(const[sidetag,sideObjs]of sideMap)sidesToCheck.set(sidetag,!0),sideObjs.forEach((sideObj=>{const starttag=getTag(sideObj.vertex0),endtag=getTag(sideObj.vertex1);vertextag2sidestart.has(starttag)?vertextag2sidestart.get(starttag).push(sidetag):vertextag2sidestart.set(starttag,[sidetag]),vertextag2sideend.has(endtag)?vertextag2sideend.get(endtag).push(sidetag):vertextag2sideend.set(endtag,[sidetag])}));const newPolygons=polygons.slice(0);for(;0!==sideMap.size;){for(const sideTag of sideMap.keys())sidesToCheck.set(sideTag,!0);let doneSomething=!1;for(;;){const sideTags=Array.from(sidesToCheck.keys());if(0===sideTags.length)break;const sideTagToCheck=sideTags[0];let doneWithSide=!0;if(sideMap.has(sideTagToCheck)){const sideObj=sideMap.get(sideTagToCheck)[0];for(let directionIndex=0;directionIndex<2;directionIndex++){const startVertex=0===directionIndex?sideObj.vertex0:sideObj.vertex1,endVertex=0===directionIndex?sideObj.vertex1:sideObj.vertex0,startVertexTag=getTag(startVertex),endVertexTag=getTag(endVertex);let matchingSides=[];0===directionIndex?vertextag2sideend.has(startVertexTag)&&(matchingSides=vertextag2sideend.get(startVertexTag)):vertextag2sidestart.has(startVertexTag)&&(matchingSides=vertextag2sidestart.get(startVertexTag));for(let matchingSideIndex=0;matchingSideIndex<matchingSides.length;matchingSideIndex++){const matchingSideTag=matchingSides[matchingSideIndex],matchingSide=sideMap.get(matchingSideTag)[0],matchingSideStartVertex=0===directionIndex?matchingSide.vertex0:matchingSide.vertex1;if(0===directionIndex?matchingSide.vertex1:matchingSide.vertex0,getTag(matchingSideStartVertex)===endVertexTag){deleteSide(sideMap,vertextag2sidestart,vertextag2sideend,startVertex,endVertex,null),deleteSide(sideMap,vertextag2sidestart,vertextag2sideend,endVertex,startVertex,null),doneWithSide=!1,directionIndex=2,doneSomething=!0;break}{const startPos=startVertex,endPos=endVertex,direction=subtract$3([0,0,0],matchingSideStartVertex,startPos),t=dot$2(subtract$3([0,0,0],endPos,startPos),direction)/dot$2(direction,direction);if(t>0&&t<1){const closestVertex=scale$3([0,0,0],direction,t);if(add$1(closestVertex,closestVertex,startPos),squaredDistance$1(closestVertex,endPos)<EPS*EPS){const polygonIndex=matchingSide.polygonIndex,polygon=newPolygons[polygonIndex],insertionVertexTag=getTag(matchingSide.vertex1);let insertionVertexTagIndex=-1;for(let i=0;i<polygon.vertices.length;i++)if(getTag(polygon.vertices[i])===insertionVertexTag){insertionVertexTagIndex=i;break}const newVertices=polygon.vertices.slice(0);newVertices.splice(insertionVertexTagIndex,0,endVertex);const newPolygon=create$7(newVertices);newPolygons[polygonIndex]=newPolygon,deleteSide(sideMap,vertextag2sidestart,vertextag2sideend,matchingSide.vertex0,matchingSide.vertex1,polygonIndex);const newSideTag1=addSide(sideMap,vertextag2sidestart,vertextag2sideend,matchingSide.vertex0,endVertex,polygonIndex),newSideTag2=addSide(sideMap,vertextag2sidestart,vertextag2sideend,endVertex,matchingSide.vertex1,polygonIndex);null!==newSideTag1&&sidesToCheck.set(newSideTag1,!0),null!==newSideTag2&&sidesToCheck.set(newSideTag2,!0),doneWithSide=!1,directionIndex=2,doneSomething=!0;break}}}}}}doneWithSide&&sidesToCheck.delete(sideTagToCheck)}if(!doneSomething)break}polygons=newPolygons}return sideMap.clear(),polygons})(polygons),polygons=triangulatePolygons(epsilon,polygons));const clone=Object.assign({},geometry);return clone.polygons=polygons,clone},generalize=(options,...geometries)=>{const results=geometries.map((geometry=>isA$2(geometry)||isA$5(geometry)?((options,geometry)=>geometry)(0,geometry):isA$3(geometry)?generalizeGeom3(options,geometry):Array.isArray(geometry)?generalize(options,...geometry):geometry));return 1===results.length?results[0]:results},snap=(...geometries)=>{const results=geometries.map((geometry=>isA$2(geometry)?(geometry=>{const epsilon=measureEpsilon(geometry),newPoints=toPoints$1(geometry).map((point=>snap$1([0,0],point,epsilon)));return create$5(newPoints)})(geometry):isA$5(geometry)?(geometry=>{const epsilon=measureEpsilon(geometry);let newOutlines=toOutlines(geometry).map((outline=>{let prev=snap$1([0,0],outline[outline.length-1],epsilon);const newOutline=[];return outline.forEach((point=>{const snapped=snap$1([0,0],point,epsilon);equals$6(prev,snapped)||newOutline.push(snapped),prev=snapped})),newOutline}));return newOutlines=newOutlines.filter((outline=>measureArea$1(create$3(outline)))),create$a(newOutlines)})(geometry):isA$3(geometry)?(geometry=>{const epsilon=measureEpsilon(geometry),polygons=toPolygons$1(geometry),newPolygons=snapPolygons(epsilon,polygons);return create$8(newPolygons)})(geometry):Array.isArray(geometry)?snap(...geometry):geometry));return 1===results.length?results[0]:results},offsetFromPoints=(options,points)=>{let{delta:delta,corners:corners,closed:closed,segments:segments}=Object.assign({},{delta:1,corners:"edge",closed:!1,segments:16},options);if(Math.abs(delta)<EPS)return points;if(points.length<2)return points;let rotation=options.closed?area$1(points):1;0===rotation&&(rotation=1);const orientation=rotation>0&&delta>=0||rotation<0&&delta<0;delta=Math.abs(delta);let previousSegment=null,newPoints=[];const newCorners=[],of=[0,0],n=points.length;for(let i=0;i<n;i++){const j=(i+1)%n,p0=points[i],p1=points[j];orientation?subtract$1(of,p0,p1):subtract$1(of,p1,p0),normal(of,of),normalize(of,of),scale$1(of,of,delta);const n0=add([0,0],p0,of),n1=add([0,0],p1,of),currentSegment=[n0,n1];if(null!=previousSegment&&(closed||!closed&&0!==j)){const ip=intersect$1(previousSegment[0],previousSegment[1],currentSegment[0],currentSegment[1],!0);ip?(newPoints.pop(),currentSegment[0]=ip):newCorners.push({c:p0,s0:previousSegment,s1:currentSegment})}previousSegment=[n0,n1],(0!==j||closed)&&(newPoints.push(currentSegment[0]),newPoints.push(currentSegment[1]))}if(closed&&null!=previousSegment){const n0=newPoints[0],n1=newPoints[1],ip=intersect$1(previousSegment[0],previousSegment[1],n0,n1,!0);if(ip)newPoints[0]=ip,newPoints.pop();else{const p0=points[0],currentSegment=[n0,n1];newCorners.push({c:p0,s0:previousSegment,s1:currentSegment})}}if("edge"===corners){const pointIndex=new Map;newPoints.forEach(((point,index)=>pointIndex.set(point,index)));const line0=[0,1,0],line1=[0,1,0];newCorners.forEach((corner=>{fromPoints$1(line0,corner.s0[0],corner.s0[1]),fromPoints$1(line1,corner.s1[0],corner.s1[1]);const ip=intersectPointOfLines(line0,line1);if(Number.isFinite(ip[0])&&Number.isFinite(ip[1])){const p0=corner.s0[1],i=pointIndex.get(p0);newPoints[i]=ip,newPoints[(i+1)%newPoints.length]=void 0}else{const p0=corner.s1[0],i=pointIndex.get(p0);newPoints[i]=void 0}})),newPoints=newPoints.filter((p=>void 0!==p))}if("round"===corners){let cornerSegments=Math.floor(segments/4);const v0=[0,0];newCorners.forEach((corner=>{let rotation=angleRadians(subtract$1(v0,corner.s1[0],corner.c));if(rotation-=angleRadians(subtract$1(v0,corner.s0[1],corner.c)),orientation&&rotation<0&&(rotation+=Math.PI,rotation<0&&(rotation+=Math.PI)),!orientation&&rotation>0&&(rotation-=Math.PI,rotation>0&&(rotation-=Math.PI)),0!==rotation){cornerSegments=Math.floor(segments*(Math.abs(rotation)/TAU));const step=rotation/cornerSegments,start=angleRadians(subtract$1(v0,corner.s0[1],corner.c)),cornerPoints=[];for(let i=1;i<cornerSegments;i++){const point=fromAngleRadians([0,0],start+step*i);scale$1(point,point,delta),add(point,point,corner.c),cornerPoints.push(point)}if(cornerPoints.length>0){const p0=corner.s0[1];let i=newPoints.findIndex((point=>equals$6(p0,point)));i=(i+1)%newPoints.length,newPoints.splice(i,0,...cornerPoints)}}else{const p0=corner.s1[0],i=newPoints.findIndex((point=>equals$6(p0,point)));newPoints.splice(i,1)}}))}return newPoints},mapPlaneToVertex=(map,vertex,plane)=>{const key=vertex.toString();if(map.has(key))map.get(key)[1].push(plane);else{const entry=[vertex,[plane]];map.set(key,entry)}},mapPlaneToEdge=(map,edge,plane)=>{const key0=edge[0].toString(),key1=edge[1].toString(),key=key0<key1?`${key0},${key1}`:`${key1},${key0}`;if(map.has(key))map.get(key)[1].push(plane);else{const entry=[edge,[plane]];map.set(key,entry)}},addUniqueAngle=(map,angle)=>{map.findIndex((item=>item===angle))<0&&map.push(angle)},offsetShell=(options,geometry)=>{const{delta:delta,segments:segments}=Object.assign({},{delta:1,segments:12},options);let result=create$8();const vertices2planes=new Map,edges2planes=new Map,v1=[0,0,0],v2=[0,0,0];return toPolygons$1(geometry).forEach((polygon=>{const extrudeVector=scale$3([0,0,0],plane(polygon),2*delta),extrudedFace=((offsetVector,polygon1)=>{dot$2(plane(polygon1),offsetVector)>0&&(polygon1=invert$1(polygon1));const newPolygons=[polygon1],polygon2=transform$7(fromTranslation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],offsetVector),polygon1),numVertices=polygon1.vertices.length;for(let i=0;i<numVertices;i++){const nexti=i<numVertices-1?i+1:0,sideFacePolygon=create$7([polygon1.vertices[i],polygon2.vertices[i],polygon2.vertices[nexti],polygon1.vertices[nexti]]);newPolygons.push(sideFacePolygon)}return newPolygons.push(invert$1(polygon2)),create$8(newPolygons)})(extrudeVector,transform$7(fromTranslation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],scale$3([0,0,0],extrudeVector,-.5)),polygon));result=unionGeom3Sub(result,extrudedFace);const vertices=polygon.vertices;for(let i=0;i<vertices.length;i++){mapPlaneToVertex(vertices2planes,vertices[i],plane(polygon));const j=(i+1)%vertices.length,edge=[vertices[i],vertices[j]];mapPlaneToEdge(edges2planes,edge,plane(polygon))}})),edges2planes.forEach((item=>{const edge=item[0],planes=item[1],startVertex=edge[0],endVertex=edge[1],zBase=subtract$3([0,0,0],endVertex,startVertex);normalize$1(zBase,zBase);const xBase=planes[0],yBase=cross$1([0,0,0],xBase,zBase);let angles=[];for(let i=0;i<segments;i++)addUniqueAngle(angles,i*TAU/segments);for(let i=0,iMax=planes.length;i<iMax;i++){const planeNormal=planes[i],si=dot$2(yBase,planeNormal),co=dot$2(xBase,planeNormal);let angle=Math.atan2(si,co);angle<0&&(angle+=TAU),addUniqueAngle(angles,angle),angle=Math.atan2(-si,-co),angle<0&&(angle+=TAU),addUniqueAngle(angles,angle)}angles=angles.sort(fnNumberSort);const numAngles=angles.length;let prevP1,prevP2;const startFaceVertices=[],endFaceVertices=[],polygons=[];for(let i=-1;i<numAngles;i++){const angle=angles[i<0?i+numAngles:i],si=Math.sin(angle),co=Math.cos(angle);scale$3(v1,xBase,co*delta),scale$3(v2,yBase,si*delta),add$1(v1,v1,v2);const p1=add$1([0,0,0],startVertex,v1),p2=add$1([0,0,0],endVertex,v1);let skip=!1;if(i>=0&&distance$1(p1,prevP1)<EPS&&(skip=!0),!skip){if(i>=0){startFaceVertices.push(p1),endFaceVertices.push(p2);const polygon=create$7([prevP2,p2,p1,prevP1]);polygons.push(polygon)}prevP1=p1,prevP2=p2}}endFaceVertices.reverse(),polygons.push(create$7(startFaceVertices)),polygons.push(create$7(endFaceVertices));const cylinder=create$8(polygons);result=unionGeom3Sub(result,cylinder)})),vertices2planes.forEach((item=>{const vertex=item[0],planes=item[1],xaxis=planes[0];let bestzaxis=null,bestzaxisOrthogonality=0;for(let i=1;i<planes.length;i++){const normal=planes[i],cross=cross$1(v1,xaxis,normal),crossLength=length$2(cross);crossLength>.05&&crossLength>bestzaxisOrthogonality&&(bestzaxisOrthogonality=crossLength,bestzaxis=normal)}bestzaxis||(bestzaxis=orthogonal(v1,xaxis));const yaxis=cross$1(v1,xaxis,bestzaxis);normalize$1(yaxis,yaxis);const zaxis=cross$1(v2,yaxis,xaxis),corner=sphere({center:[vertex[0],vertex[1],vertex[2]],radius:delta,segments:segments,axes:[xaxis,yaxis,zaxis]});result=unionGeom3Sub(result,corner)})),retessellate(result)},offsetPath2=(options,geometry)=>{const{delta:delta,corners:corners,segments:segments}=Object.assign({},{delta:1,corners:"edge",segments:16},options);if(delta<=0)throw new Error("the given delta must be positive for paths");if("edge"!==corners&&"chamfer"!==corners&&"round"!==corners)throw new Error('corners must be "edge", "chamfer", or "round"');const closed=geometry.isClosed,points=toPoints$1(geometry),paths={points:points,external:offsetFromPoints({delta:delta,corners:corners,segments:segments,closed:closed},points),internal:offsetFromPoints({delta:-delta,corners:corners,segments:segments,closed:closed},points)},output=geometry.isClosed?(paths=>{let{external:external,internal:internal}=paths;return external.length<2?create$a():(area$1(external)<0?external=external.reverse():internal=internal.reverse(),create$a([external,internal]))})(paths):((paths,segments,corners,delta)=>{const{points:points,external:external,internal:internal}=paths;if(0===points.length)return create$a();if(1===points.length)return circle({center:points[0],radius:delta});const capSegments=Math.floor(segments/2),e2iCap=[],i2eCap=[];if("round"===corners&&capSegments>0){const step=Math.PI/capSegments,eCorner=points[points.length-1],e2iStart=angleRadians(subtract$1([0,0],external[external.length-1],eCorner)),iCorner=points[0],i2eStart=angleRadians(subtract$1([0,0],internal[0],iCorner));for(let i=1;i<capSegments;i++){let radians=e2iStart+step*i,point=fromAngleRadians([0,0],radians);scale$1(point,point,delta),add(point,point,eCorner),e2iCap.push(point),radians=i2eStart+step*i,point=fromAngleRadians([0,0],radians),scale$1(point,point,delta),add(point,point,iCorner),i2eCap.push(point)}}const allPoints=[];return allPoints.push(...external,...e2iCap,...internal.reverse(),...i2eCap),create$a([allPoints])})(paths,segments,corners,delta);return geometry.color&&(output.color=geometry.color),output},offset=(options,...objects)=>{const results=objects.map((object=>isA$2(object)?offsetPath2(options,object):isA$5(object)?((options,geometry)=>{const{delta:delta,corners:corners,segments:segments,expandHoles:expandHoles}=Object.assign({},{delta:1,corners:"edge",segments:16,expandHoles:!1},options);if("edge"!==corners&&"chamfer"!==corners&&"round"!==corners)throw new Error('corners must be "edge", "chamfer", or "round"');if(!Number.isFinite(delta))throw new Error("delta must be a finite number");if("round"===corners&&!Number.isFinite(segments))throw new Error("segments must be a finite number");if("round"===corners&&!(segments>0))throw new Error("segments must be greater than zero");const outlines=toOutlines(geometry),newOutlines=outlines.map((outline=>{let outside=!0;if(expandHoles){const level=outlines.reduce(((acc,polygon)=>acc+arePointsInside(outline,create$3(polygon))),0);outside=level%2==0}return offsetFromPoints(options={delta:outside?delta:-delta,corners:corners,closed:!0,segments:segments},outline)})),output=create$a(newOutlines);return geometry.color&&(output.color=geometry.color),output})(options,object):isA$3(object)?((options,geometry)=>{const{delta:delta,corners:corners,segments:segments}=Object.assign({},{delta:1,corners:"round",segments:12},options);if("round"!==corners)throw new Error('corners must be "round" for 3D geometries');const expanded=offsetShell(options={delta:delta,corners:corners,segments:segments},geometry),output=union(geometry,expanded);return geometry.color&&(output.color=geometry.color),output})(options,object):Array.isArray(object)?offset(options,...object):object));return 1===results.length?results[0]:results},padArrayToLength=(anArray,padding,targetLength)=>{for(anArray=anArray.slice();anArray.length<targetLength;)anArray.push(padding);return anArray},alignGeometries=(geometries,modes,relativeTo)=>{const bounds=measureAggregateBoundingBox(geometries),translation=[0,0,0];for(let i=0;i<3;i++)"center"===modes[i]?translation[i]=relativeTo[i]-(bounds[0][i]+bounds[1][i])/2:"max"===modes[i]?translation[i]=relativeTo[i]-bounds[1][i]:"min"===modes[i]&&(translation[i]=relativeTo[i]-bounds[0][i]);return translate(translation,geometries)},centerGeometry=(options,object)=>{const{axes:axes,relativeTo:relativeTo}=Object.assign({},{axes:[!0,!0,!0],relativeTo:[0,0,0]},options),bounds=measureAggregateBoundingBox(object),offset=[0,0,0];return axes[0]&&(offset[0]=relativeTo[0]-(bounds[0][0]+(bounds[1][0]-bounds[0][0])/2)),axes[1]&&(offset[1]=relativeTo[1]-(bounds[0][1]+(bounds[1][1]-bounds[0][1])/2)),axes[2]&&(offset[2]=relativeTo[2]-(bounds[0][2]+(bounds[1][2]-bounds[0][2])/2)),translate(offset,object)},center=(options,...objects)=>{const{axes:axes,relativeTo:relativeTo}=Object.assign({},{axes:[!0,!0,!0],relativeTo:[0,0,0]},options);if(3!==relativeTo.length)throw new Error("relativeTo must be an array of length 3");options={axes:axes,relativeTo:relativeTo};const results=objects.map((object=>isA$2(object)||isA$5(object)||isA$3(object)||Array.isArray(object)?centerGeometry(options,object):object));return 1===results.length?results[0]:results},scale=(factors,...objects)=>{if(!Array.isArray(factors))throw new Error("factors must be an array");for(factors=factors.slice();factors.length<3;)factors.push(1);if(factors[0]<=0||factors[1]<=0||factors[2]<=0)throw new Error("factors must be positive");const matrix=fromScaling([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],factors),results=objects.map((object=>isA$2(object)?transform$5(matrix,object):isA$5(object)?transform$a(matrix,object):isA$3(object)?transform$6(matrix,object):Array.isArray(object)?scale(factors,...object):object));return 1===results.length?results[0]:results},transform=(matrix,...objects)=>{const results=objects.map((object=>isA$2(object)?transform$5(matrix,object):isA$5(object)?transform$a(matrix,object):isA$3(object)?transform$6(matrix,object):Array.isArray(object)?transform(matrix,...object):object));return 1===results.length?results[0]:results};exports.EPS=EPS,exports.NEPS=NEPS,exports.TAU=TAU,exports.align=(options,...geometries)=>{options=(options=>{if(!Array.isArray(options.modes)||options.modes.length>3)throw new Error("align(): modes must be an array of length <= 3");if(options.modes=padArrayToLength(options.modes,"none",3),3!==options.modes.filter((mode=>["center","max","min","none"].includes(mode))).length)throw new Error('align(): all modes must be one of "center", "max" or "min"');if(!Array.isArray(options.relativeTo)||options.relativeTo.length>3)throw new Error("align(): relativeTo must be an array of length <= 3");if(options.relativeTo=padArrayToLength(options.relativeTo,0,3),3!==options.relativeTo.filter((alignVal=>Number.isFinite(alignVal)||null==alignVal)).length)throw new Error("align(): all relativeTo values must be a number, or null.");if("boolean"!=typeof options.grouped)throw new Error("align(): grouped must be a boolean value.");return options})(options=Object.assign({},{modes:["center","center","min"],relativeTo:[0,0,0],grouped:!1},options));let{modes:modes,relativeTo:relativeTo,grouped:grouped}=options;if(relativeTo.filter((val=>null==val)).length){const bounds=measureAggregateBoundingBox(geometries);relativeTo=((relativeTo,modes,bounds)=>{for(let i=0;i<3;i++)null==relativeTo[i]&&("center"===modes[i]?relativeTo[i]=(bounds[0][i]+bounds[1][i])/2:"max"===modes[i]?relativeTo[i]=bounds[1][i]:"min"===modes[i]&&(relativeTo[i]=bounds[0][i]));return relativeTo})(relativeTo,modes,bounds)}return grouped?(geometries=coalesce(geometries),geometries=alignGeometries(geometries,modes,relativeTo)):geometries=geometries.map((geometry=>alignGeometries(geometry,modes,relativeTo))),1===geometries.length?geometries[0]:geometries},exports.arc=options=>{const defaults={center:[0,0],radius:1,startAngle:0,endAngle:TAU,makeTangent:!1,segments:32};let{center:center,radius:radius,startAngle:startAngle,endAngle:endAngle,makeTangent:makeTangent,segments:segments}=Object.assign({},defaults,options);if(!isNumberArray(center,2))throw new Error("center must be an array of X and Y values");if(!isGT(radius,0))throw new Error("radius must be greater than zero");if(!isGTE(startAngle,0))throw new Error("startAngle must be positive");if(!isGTE(endAngle,0))throw new Error("endAngle must be positive");if(!isGTE(segments,4))throw new Error("segments must be four or more");startAngle%=TAU,endAngle%=TAU;let rotation=TAU;startAngle<endAngle&&(rotation=endAngle-startAngle),startAngle>endAngle&&(rotation=endAngle+(TAU-startAngle));const minAngle=Math.acos((radius*radius+radius*radius-EPS*EPS)/(2*radius*radius)),centerV=clone$8(center);let point;const pointArray=[];if(rotation<minAngle)point=fromAngleRadians([0,0],startAngle),scale$1(point,point,radius),add(point,point,centerV),pointArray.push(point);else{const numSteps=Math.max(1,Math.floor(segments*(rotation/TAU)))+1;let edgeStepSize=.5*numSteps/rotation;edgeStepSize>.25&&(edgeStepSize=.25);const totalSteps=makeTangent?numSteps+2:numSteps;for(let i=0;i<=totalSteps;i++){let step=i;makeTangent&&(step=(i-1)*(numSteps-2*edgeStepSize)/numSteps+edgeStepSize,step<0&&(step=0),step>numSteps&&(step=numSteps)),point=fromAngleRadians([0,0],startAngle+step*(rotation/numSteps)),scale$1(point,point,radius),add(point,point,centerV),pointArray.push(point)}}return fromPoints$2({closed:!1},pointArray)},exports.area=area$1,exports.bezier=index$4,exports.center=center,exports.centerX=(...objects)=>center({axes:[!0,!1,!1]},...objects),exports.centerY=(...objects)=>center({axes:[!1,!0,!1]},...objects),exports.centerZ=(...objects)=>center({axes:[!1,!1,!0]},...objects),exports.circle=circle,exports.colorNameToRgb=s=>cssColors[s.toLowerCase()],exports.colorize=colorize,exports.cos=cos,exports.cssColors=cssColors,exports.cube=options=>{let{center:center,size:size}=Object.assign({},{center:[0,0,0],size:2},options);if(!isGTE(size,0))throw new Error("size must be positive");return size=[size,size,size],cuboid({center:center,size:size})},exports.cuboid=cuboid,exports.cylinder=cylinder,exports.cylinderElliptic=cylinderElliptic,exports.degToRad=degrees=>.017453292519943295*degrees,exports.ellipse=ellipse,exports.ellipsoid=ellipsoid,exports.extrudeFromSlices=extrudeFromSlices,exports.extrudeHelical=(options,geometry)=>{const defaults={angle:TAU,startAngle:0,pitch:10,endOffset:0,segmentsPerRotation:32},{angle:angle,endOffset:endOffset,segmentsPerRotation:segmentsPerRotation,startAngle:startAngle}=Object.assign({},defaults,options);let pitch;if(pitch=!options.pitch&&options.height?options.height/(angle/TAU):options.pitch?options.pitch:defaults.pitch,segmentsPerRotation<3)throw new Error("The number of segments per rotation needs to be at least 3.");let baseSlice=fromGeom2(geometry);measureBoundingBox(geometry)[1][0]<=0&&(baseSlice=reverse$2(baseSlice));const calculatedSegments=Math.round(segmentsPerRotation/TAU*Math.abs(angle)),segments=calculatedSegments>=2?calculatedSegments:2,step1=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];let matrix;return extrudeFromSlices({numberOfSlices:segments+1,callback:(progress,index,base)=>{const zRotation=startAngle+angle/segments*index;return multiply$1(step1,fromTranslation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],[endOffset/segments*index,0,(zRotation-startAngle)/TAU*pitch*Math.sign(angle)]),fromXRotation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],-TAU/4*Math.sign(angle))),matrix=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],multiply$1(matrix,fromZRotation([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],zRotation),step1),transform$3(matrix,baseSlice)}},baseSlice)},exports.extrudeLinear=extrudeLinear,exports.extrudeRotate=extrudeRotate,exports.flatten=flatten,exports.generalize=generalize,exports.geodesicSphere=options=>{let{radius:radius,frequency:frequency}=Object.assign({},{radius:1,frequency:6},options);if(!isGTE(radius,0))throw new Error("radius must be positive");if(!isGTE(frequency,6))throw new Error("frequency must be six or more");if(0===radius)return create$8();frequency=Math.floor(frequency/6);const ci=[[.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]],ti=[[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]],geodesicSubDivide=(p,frequency,offset)=>{const p1=p[0],p2=p[1],p3=p[2];let n=offset;const c=[],f=[];for(let i=0;i<frequency;i++)for(let j=0;j<frequency-i;j++){const t0=i/frequency,t1=(i+1)/frequency,s0=j/(frequency-i),s1=(j+1)/(frequency-i),s2=frequency-i-1?j/(frequency-i-1):1,q=[];q[0]=mix3(mix3(p1,p2,s0),p3,t0),q[1]=mix3(mix3(p1,p2,s1),p3,t0),q[2]=mix3(mix3(p1,p2,s2),p3,t1);for(let k=0;k<3;k++){const r=length$2(q[k]);for(let l=0;l<3;l++)q[k][l]/=r}if(c.push(q[0],q[1],q[2]),f.push([n,n+1,n+2]),n+=3,j<frequency-i-1){const s3=frequency-i-1?(j+1)/(frequency-i-1):1;q[0]=mix3(mix3(p1,p2,s1),p3,t0),q[1]=mix3(mix3(p1,p2,s3),p3,t1),q[2]=mix3(mix3(p1,p2,s2),p3,t1);for(let k=0;k<3;k++){const r=length$2(q[k]);for(let l=0;l<3;l++)q[k][l]/=r}c.push(q[0],q[1],q[2]),f.push([n,n+1,n+2]),n+=3}}return{vertices:c,triangles:f,offset:n}},mix3=(a,b,f)=>{const _f=1-f,c=[];for(let i=0;i<3;i++)c[i]=a[i]*_f+b[i]*f;return c};let vertices=[],faces=[],offset=0;for(let i=0;i<ti.length;i++){const g=geodesicSubDivide([ci[ti[i][0]],ci[ti[i][1]],ci[ti[i][2]]],frequency,offset);vertices=vertices.concat(g.vertices),faces=faces.concat(g.triangles),offset=g.offset}let geometry=polyhedron({points:vertices,faces:faces,orientation:"inward"});return 1!==radius&&(geometry=transform$6(fromScaling([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],[radius,radius,radius]),geometry)),geometry},exports.geom2=index$a,exports.geom3=index$6,exports.hexToRgb=notation=>{if((notation=notation.replace("#","")).length<6)throw new Error("the given notation must contain 3 or more hex values");const r=parseInt(notation.substring(0,2),16)/255,g=parseInt(notation.substring(2,4),16)/255,b=parseInt(notation.substring(4,6),16)/255;return notation.length>=8?[r,g,b,parseInt(notation.substring(6,8),16)/255]:[r,g,b]},exports.hslToRgb=(...values)=>{if((values=flatten(values)).length<3)throw new Error("values must contain H, S and L values");const h=values[0],s=values[1],l=values[2];let r=l,g=l,b=l;if(0!==s){const q=l<.5?l*(1+s):l+s-l*s,p=2*l-q;r=hueToColorComponent(p,q,h+1/3),g=hueToColorComponent(p,q,h),b=hueToColorComponent(p,q,h-1/3)}return values.length>3?[r,g,b,values[3]]:[r,g,b]},exports.hsvToRgb=(...values)=>{if((values=flatten(values)).length<3)throw new Error("values must contain H, S and V values");const h=values[0],s=values[1],v=values[2];let r=0,g=0,b=0;const i=Math.floor(6*h),f=6*h-i,p=v*(1-s),q=v*(1-f*s),t=v*(1-(1-f)*s);switch(i%6){case 0:r=v,g=t,b=p;break;case 1:r=q,g=v,b=p;break;case 2:r=p,g=v,b=t;break;case 3:r=p,g=q,b=v;break;case 4:r=t,g=p,b=v;break;case 5:r=v,g=p,b=q}return values.length>3?[r,g,b,values[3]]:[r,g,b]},exports.hueToColorComponent=hueToColorComponent,exports.hull=hull,exports.hullChain=(...geometries)=>{if(0===(geometries=coalesce(geometries)).length)return;if(1===geometries.length)return geometries[0];if(!areAllShapesTheSameType(geometries))throw new Error("only hulls of the same type are supported");const hulls=[];for(let i=1;i<geometries.length;i++)hulls.push(hull(geometries[i-1],geometries[i]));return union(hulls)},exports.hullPoints2=hullPoints2,exports.hullPoints3=hullPoints3,exports.intersect=(...geometries)=>{if(0===(geometries=coalesce(geometries)).length)return;if(!areAllShapesTheSameType(geometries))throw new Error("intersect arguments must be the same geometry type");const geometry=geometries[0];if(isA$5(geometry))return(geometries=>{let newGeometry=geometries.shift();return geometries.forEach((geometry=>{newGeometry=boolean(newGeometry,geometry,0)})),newGeometry})(geometries);if(isA$3(geometry))return intersectGeom3(geometries);throw new Error("intersect unsupported geometry type")},exports.line=points=>{if(!Array.isArray(points))throw new Error("points must be an array");return fromPoints$2({},points)},exports.line2=index$1,exports.line3=index,exports.mat4=index$c,exports.measureAggregateArea=(...geometries)=>{geometries=flatten(geometries);const areas=measureArea(geometries);return 1===geometries.length?areas:areas.reduce(((result,area)=>result+area),0)},exports.measureAggregateBoundingBox=measureAggregateBoundingBox,exports.measureAggregateEpsilon=(...geometries)=>{geometries=flatten(geometries);const bounds=measureAggregateBoundingBox(geometries);let dimensions=0;return dimensions=geometries.reduce(((dimensions,geometry)=>isA$2(geometry)||isA$5(geometry)?Math.max(dimensions,2):isA$3(geometry)?Math.max(dimensions,3):0),dimensions),calculateEpsilonFromBounds(bounds,dimensions)},exports.measureAggregateVolume=(...geometries)=>{geometries=flatten(geometries);const volumes=measureVolume(geometries);return 1===geometries.length?volumes:volumes.reduce(((result,volume)=>result+volume),0)},exports.measureArea=measureArea,exports.measureBoundingBox=measureBoundingBox,exports.measureBoundingSphere=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>isA$2(geometry)?measureCached(geometry,measureBoundingSphereOfPath2):isA$5(geometry)?measureCached(geometry,measureBoundingSphereOfGeom2):isA$3(geometry)?measureCached(geometry,measureBoundingSphereOfGeom3):isA(geometry)?measureCached(geometry,measureBoundingSphereOfSlice):[[0,0,0],0]));return 1===results.length?results[0]:results},exports.measureCenter=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>{const bounds=measureBoundingBox(geometry);return[bounds[0][0]+(bounds[1][0]-bounds[0][0])/2,bounds[0][1]+(bounds[1][1]-bounds[0][1])/2,bounds[0][2]+(bounds[1][2]-bounds[0][2])/2]}));return 1===results.length?results[0]:results},exports.measureCenterOfMass=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>isA$5(geometry)?(geometry=>{let centerOfMass=cacheOfCenterOfMass.get(geometry);if(void 0!==centerOfMass)return centerOfMass;const sides=toSides(geometry);let area=0,x=0,y=0;if(sides.length>0){for(let i=0;i<sides.length;i++){const p1=sides[i][0],p2=sides[i][1],a=p1[0]*p2[1]-p1[1]*p2[0];area+=a,x+=(p1[0]+p2[0])*a,y+=(p1[1]+p2[1])*a}area/=2;const f=1/(6*area);x*=f,y*=f}return centerOfMass=fromValues$3(x,y,0),cacheOfCenterOfMass.set(geometry,centerOfMass),centerOfMass})(geometry):isA$3(geometry)?(geometry=>{let centerOfMass=cacheOfCenterOfMass.get(geometry);if(void 0!==centerOfMass)return centerOfMass;centerOfMass=[0,0,0];const polygons=toPolygons$1(geometry);if(0===polygons.length)return centerOfMass;let totalVolume=0;const vector=[0,0,0];return polygons.forEach((polygon=>{const vertices=polygon.vertices;for(let i=0;i<vertices.length-2;i++){cross$1(vector,vertices[i+1],vertices[i+2]);const volume=dot$2(vertices[0],vector)/6;totalVolume+=volume,add$1(vector,vertices[0],vertices[i+1]),add$1(vector,vector,vertices[i+2]);const weightedCenter=scale$3(vector,vector,1/4*volume);add$1(centerOfMass,centerOfMass,weightedCenter)}})),scale$3(centerOfMass,centerOfMass,1/totalVolume),cacheOfCenterOfMass.set(geometry,centerOfMass),centerOfMass})(geometry):[0,0,0]));return 1===results.length?results[0]:results},exports.measureDimensions=(...geometries)=>{const results=(geometries=flatten(geometries)).map((geometry=>{const boundingBox=measureBoundingBox(geometry);return[boundingBox[1][0]-boundingBox[0][0],boundingBox[1][1]-boundingBox[0][1],boundingBox[1][2]-boundingBox[0][2]]}));return 1===results.length?results[0]:results},exports.measureEpsilon=measureEpsilon,exports.measureVolume=measureVolume,exports.mirror=mirror,exports.mirrorX=mirrorX,exports.mirrorY=(...objects)=>mirror({normal:[0,1,0]},...objects),exports.mirrorZ=(...objects)=>mirror({normal:[0,0,1]},...objects),exports.offset=offset,exports.offsetFromPoints=offsetFromPoints,exports.path2=index$5,exports.plane=index$9,exports.poly2=index$3,exports.poly3=index$7,exports.polygon=options=>{const{points:points,paths:paths,orientation:orientation}=Object.assign({},{points:[],paths:[],orientation:"counterclockwise"},options);if(!Array.isArray(points)||!Array.isArray(paths))throw new Error("points and paths must be arrays");let listOfPolys=points;Array.isArray(points[0])&&(Array.isArray(points[0][0])||(listOfPolys=[points])),listOfPolys.forEach(((list,i)=>{if(!Array.isArray(list))throw new Error("list of points "+i+" must be an array");if(list.length<3)throw new Error("list of points "+i+" must contain three or more points");list.forEach(((point,j)=>{if(!Array.isArray(point))throw new Error("list of points "+i+", point "+j+" must be an array");if(point.length<2)throw new Error("list of points "+i+", point "+j+" must contain by X and Y values")}))}));let listOfPaths=paths;if(0===paths.length){let count=0;listOfPaths=listOfPolys.map((list=>list.map((point=>count++))))}const allPoints=[];listOfPolys.forEach((list=>list.forEach((point=>allPoints.push(point)))));const outlines=[];listOfPaths.forEach((path=>{const setOfPoints=path.map((index=>allPoints[index]));outlines.push(setOfPoints)}));let geometry=create$a(outlines);return"clockwise"===orientation&&(geometry=reverse$5(geometry)),geometry},exports.polyhedron=polyhedron,exports.project=project,exports.radToDeg=radians=>57.29577951308232*radians,exports.radiusToSegments=(radius,minimumLength,minimumAngle)=>{const ss=minimumLength>0?radius*TAU/minimumLength:0,as=minimumAngle>0?TAU/minimumAngle:0;return Math.ceil(Math.max(ss,as,4))},exports.rectangle=rectangle,exports.retessellate=retessellate,exports.rgbToHex=(...values)=>{if((values=flatten(values)).length<3)throw new Error("values must contain R, G and B values");const r=255*values[0],g=255*values[1],b=255*values[2];let s=`#${Number(16777216+65536*r+256*g+b).toString(16).substring(1,7)}`;return values.length>3&&(s+=Number(255*values[3]).toString(16)),s},exports.rgbToHsl=(...values)=>{if((values=flatten(values)).length<3)throw new Error("values must contain R, G and B values");const r=values[0],g=values[1],b=values[2],max=Math.max(r,g,b),min=Math.min(r,g,b);let h,s;const l=(max+min)/2;if(max===min)h=s=0;else{const d=max-min;switch(s=l>.5?d/(2-max-min):d/(max+min),max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4}h/=6}return values.length>3?[h,s,l,values[3]]:[h,s,l]},exports.rgbToHsv=(...values)=>{if((values=flatten(values)).length<3)throw new Error("values must contain R, G and B values");const r=values[0],g=values[1],b=values[2],max=Math.max(r,g,b),min=Math.min(r,g,b);let h;const v=max,d=max-min,s=0===max?0:d/max;if(max===min)h=0;else{switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4}h/=6}return values.length>3?[h,s,v,values[3]]:[h,s,v]},exports.rotate=rotate,exports.rotateX=(angle,...objects)=>rotate([angle,0,0],...objects),exports.rotateY=(angle,...objects)=>rotate([0,angle,0],...objects),exports.rotateZ=(angle,...objects)=>rotate([0,0,angle],...objects),exports.roundedCuboid=options=>{let{center:center,size:size,roundRadius:roundRadius,segments:segments}=Object.assign({},{center:[0,0,0],size:[2,2,2],roundRadius:.2,segments:32},options);if(!isNumberArray(center,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(size,3))throw new Error("size must be an array of X, Y and Z values");if(!size.every((n=>n>=0)))throw new Error("size values must be positive");if(!isGTE(roundRadius,0))throw new Error("roundRadius must be positive");if(!isGTE(segments,4))throw new Error("segments must be four or more");if(0===size[0]||0===size[1]||0===size[2])return create$8();if(0===roundRadius)return cuboid({center:center,size:size});if(size=size.map((v=>v/2)),roundRadius>size[0]-EPS||roundRadius>size[1]-EPS||roundRadius>size[2]-EPS)throw new Error("roundRadius must be smaller than the radius of all dimensions");segments=Math.floor(segments/4);let prevCornersPos=null,prevCornersNeg=null,polygons=[];for(let slice=0;slice<=segments;slice++){const cornersPos=createCorners(center,size,roundRadius,segments,slice,!0),cornersNeg=createCorners(center,size,roundRadius,segments,slice,!1);if(0===slice&&(polygons=polygons.concat(stitchSides(cornersNeg,cornersPos))),prevCornersPos&&(polygons=polygons.concat(stitchCorners(prevCornersPos,cornersPos),stitchWalls(prevCornersPos,cornersPos))),prevCornersNeg&&(polygons=polygons.concat(stitchCorners(prevCornersNeg,cornersNeg),stitchWalls(prevCornersNeg,cornersNeg))),slice===segments){let vertices=cornersPos.map((corner=>corner[0]));polygons.push(create$7(vertices)),vertices=cornersNeg.map((corner=>corner[0])),polygons.push(create$7(vertices))}prevCornersPos=cornersPos,prevCornersNeg=cornersNeg}return create$8(polygons)},exports.roundedCylinder=options=>{const{center:center,height:height,radius:radius,roundRadius:roundRadius,segments:segments}=Object.assign({},{center:[0,0,0],height:2,radius:1,roundRadius:.2,segments:32},options);if(!isNumberArray(center,3))throw new Error("center must be an array of X, Y and Z values");if(!isGTE(height,0))throw new Error("height must be positive");if(!isGTE(radius,0))throw new Error("radius must be positive");if(!isGTE(roundRadius,0))throw new Error("roundRadius must be positive");if(roundRadius>radius)throw new Error("roundRadius must be smaller than the radius");if(!isGTE(segments,4))throw new Error("segments must be four or more");if(0===height||0===radius)return create$8();if(0===roundRadius)return cylinder({center:center,height:height,radius:radius});const start=[0,0,-height/2],end=[0,0,height/2],direction=subtract$3([0,0,0],end,start);if(2*roundRadius>length$2(direction)-EPS)throw new Error("height must be larger than twice roundRadius");let defaultNormal;defaultNormal=Math.abs(direction[0])>Math.abs(direction[1])?fromValues$3(0,1,0):fromValues$3(1,0,0);const zVector=scale$3([0,0,0],normalize$1([0,0,0],direction),roundRadius),xVector=scale$3([0,0,0],normalize$1([0,0,0],cross$1([0,0,0],zVector,defaultNormal)),radius),yVector=scale$3([0,0,0],normalize$1([0,0,0],cross$1([0,0,0],xVector,zVector)),radius);add$1(start,start,zVector),subtract$3(end,end,zVector);const qSegments=Math.floor(.25*segments),fromVertices=vertices=>{const newVertices=vertices.map((vertex=>add$1(vertex,vertex,center)));return create$7(newVertices)},polygons=[],v1=[0,0,0],v2=[0,0,0];let prevCylinderVertex;for(let slice1=0;slice1<=segments;slice1++){const angle=TAU*slice1/segments,cylinderVertex=add$1([0,0,0],scale$3(v1,xVector,cos(angle)),scale$3(v2,yVector,sin(angle)));if(slice1>0){let prevCosPitch,prevSinPitch,vertex,vertices=[];vertices.push(add$1([0,0,0],start,cylinderVertex)),vertices.push(add$1([0,0,0],start,prevCylinderVertex)),vertices.push(add$1([0,0,0],end,prevCylinderVertex)),vertices.push(add$1([0,0,0],end,cylinderVertex)),polygons.push(fromVertices(vertices));for(let slice2=0;slice2<=qSegments;slice2++){const pitch=TAU/4*slice2/qSegments,cosPitch=cos(pitch),sinPitch=sin(pitch);slice2>0&&(vertices=[],vertex=add$1([0,0,0],start,subtract$3(v1,scale$3(v1,prevCylinderVertex,prevCosPitch),scale$3(v2,zVector,prevSinPitch))),vertices.push(vertex),vertex=add$1([0,0,0],start,subtract$3(v1,scale$3(v1,cylinderVertex,prevCosPitch),scale$3(v2,zVector,prevSinPitch))),vertices.push(vertex),slice2<qSegments&&(vertex=add$1([0,0,0],start,subtract$3(v1,scale$3(v1,cylinderVertex,cosPitch),scale$3(v2,zVector,sinPitch))),vertices.push(vertex)),vertex=add$1([0,0,0],start,subtract$3(v1,scale$3(v1,prevCylinderVertex,cosPitch),scale$3(v2,zVector,sinPitch))),vertices.push(vertex),polygons.push(fromVertices(vertices)),vertices=[],vertex=add$1([0,0,0],scale$3(v1,prevCylinderVertex,prevCosPitch),scale$3(v2,zVector,prevSinPitch)),add$1(vertex,vertex,end),vertices.push(vertex),vertex=add$1([0,0,0],scale$3(v1,cylinderVertex,prevCosPitch),scale$3(v2,zVector,prevSinPitch)),add$1(vertex,vertex,end),vertices.push(vertex),slice2<qSegments&&(vertex=add$1([0,0,0],scale$3(v1,cylinderVertex,cosPitch),scale$3(v2,zVector,sinPitch)),add$1(vertex,vertex,end),vertices.push(vertex)),vertex=add$1([0,0,0],scale$3(v1,prevCylinderVertex,cosPitch),scale$3(v2,zVector,sinPitch)),add$1(vertex,vertex,end),vertices.push(vertex),vertices.reverse(),polygons.push(fromVertices(vertices))),prevCosPitch=cosPitch,prevSinPitch=sinPitch}}prevCylinderVertex=cylinderVertex}return create$8(polygons)},exports.roundedRectangle=options=>{let{center:center,size:size,roundRadius:roundRadius,segments:segments}=Object.assign({},{center:[0,0],size:[2,2],roundRadius:.2,segments:32},options);if(!isNumberArray(center,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(size,2))throw new Error("size must be an array of X and Y values");if(!size.every((n=>n>=0)))throw new Error("size values must be positive");if(!isGTE(roundRadius,0))throw new Error("roundRadius must be positive");if(!isGTE(segments,4))throw new Error("segments must be four or more");if(0===size[0]||0===size[1])return create$a();if(0===roundRadius)return rectangle({center:center,size:size});if(size=size.map((v=>v/2)),roundRadius>size[0]-EPS||roundRadius>size[1]-EPS)throw new Error("roundRadius must be smaller than the radius of all dimensions");const cornerSegments=Math.floor(segments/4),corner0=add([0,0],center,[size[0]-roundRadius,size[1]-roundRadius]),corner1=add([0,0],center,[roundRadius-size[0],size[1]-roundRadius]),corner2=add([0,0],center,[roundRadius-size[0],roundRadius-size[1]]),corner3=add([0,0],center,[size[0]-roundRadius,roundRadius-size[1]]),corner0Points=[],corner1Points=[],corner2Points=[],corner3Points=[];for(let i=0;i<=cornerSegments;i++){const point=fromAngleRadians([0,0],TAU/4*i/cornerSegments);scale$1(point,point,roundRadius),corner0Points.push(add([0,0],corner0,point)),rotate$1(point,point,[0,0],TAU/4),corner1Points.push(add([0,0],corner1,point)),rotate$1(point,point,[0,0],TAU/4),corner2Points.push(add([0,0],corner2,point)),rotate$1(point,point,[0,0],TAU/4),corner3Points.push(add([0,0],corner3,point))}const points=corner0Points.concat(corner1Points,corner2Points,corner3Points);return create$a([points])},exports.scale=scale,exports.scaleX=(factor,...objects)=>scale([factor,1,1],...objects),exports.scaleY=(factor,...objects)=>scale([1,factor,1],...objects),exports.scaleZ=(factor,...objects)=>scale([1,1,factor],...objects),exports.scission=scission,exports.sin=sin,exports.slice=index$2,exports.snap=snap,exports.sphere=sphere,exports.square=options=>{let{center:center,size:size}=Object.assign({},{center:[0,0],size:2},options);if(!isGTE(size,0))throw new Error("size must be positive");return size=[size,size],rectangle({center:center,size:size})},exports.star=options=>{let{center:center,vertices:vertices,outerRadius:outerRadius,innerRadius:innerRadius,density:density,startAngle:startAngle}=Object.assign({},{center:[0,0],vertices:5,outerRadius:1,innerRadius:0,density:2,startAngle:0},options);if(!isNumberArray(center,2))throw new Error("center must be an array of X and Y values");if(!isGTE(vertices,2))throw new Error("vertices must be two or more");if(!isGT(outerRadius,0))throw new Error("outerRadius must be greater than zero");if(!isGTE(innerRadius,0))throw new Error("innerRadius must be greater than zero");if(!isGTE(startAngle,0))throw new Error("startAngle must be greater than zero");if(vertices=Math.floor(vertices),density=Math.floor(density),startAngle%=TAU,0===innerRadius){if(!isGTE(density,2))throw new Error("density must be two or more");innerRadius=outerRadius*((vertices,density)=>vertices>0&&density>1&&density<vertices/2?Math.cos(Math.PI*density/vertices)/Math.cos(Math.PI*(density-1)/vertices):0)(vertices,density)}const centerV=clone$8(center),outerPoints=getPoints(vertices,outerRadius,startAngle,centerV),innerPoints=getPoints(vertices,innerRadius,startAngle+Math.PI/vertices,centerV),allPoints=[];for(let i=0;i<vertices;i++)allPoints.push(outerPoints[i]),allPoints.push(innerPoints[i]);return create$a([allPoints])},exports.subtract=(...geometries)=>{if(0===(geometries=coalesce(geometries)).length)return;if(!areAllShapesTheSameType(geometries))throw new Error("subtract arguments must be the same geometry type");const geometry=geometries[0];if(isA$5(geometry))return(geometries=>{let newGeometry=geometries.shift();return geometries.forEach((geometry=>{newGeometry=boolean(newGeometry,geometry,2)})),newGeometry})(geometries);if(isA$3(geometry))return subtractGeom3(geometries);throw new Error("subtract unsupported geometry type")},exports.torus=options=>{const defaults={innerRadius:1,innerSegments:32,outerRadius:4,outerSegments:32,innerRotation:0,startAngle:0,outerRotation:TAU},{innerRadius:innerRadius,innerSegments:innerSegments,outerRadius:outerRadius,outerSegments:outerSegments,innerRotation:innerRotation,startAngle:startAngle,outerRotation:outerRotation}=Object.assign({},defaults,options);if(!isGT(innerRadius,0))throw new Error("innerRadius must be greater than zero");if(!isGTE(innerSegments,3))throw new Error("innerSegments must be three or more");if(!isGT(outerRadius,0))throw new Error("outerRadius must be greater than zero");if(!isGTE(outerSegments,3))throw new Error("outerSegments must be three or more");if(!isGTE(startAngle,0))throw new Error("startAngle must be positive");if(!isGT(outerRotation,0))throw new Error("outerRotation must be greater than zero");if(innerRadius>=outerRadius)throw new Error("inner circle is too large to rotate about the outer circle");let innerCircle=circle({radius:innerRadius,segments:innerSegments});return 0!==innerRotation&&(innerCircle=rotate([0,0,innerRotation],innerCircle)),innerCircle=translate([outerRadius,0],innerCircle),extrudeRotate({startAngle:startAngle,angle:outerRotation,segments:outerSegments},innerCircle)},exports.transform=transform,exports.translate=translate,exports.translateX=(offset,...objects)=>translate([offset,0,0],...objects),exports.translateY=(offset,...objects)=>translate([0,offset,0],...objects),exports.translateZ=(offset,...objects)=>translate([0,0,offset],...objects),exports.triangle=options=>{let{type:type,values:values}=Object.assign({},{type:"SSS",values:[1,1,1]},options);if("string"!=typeof type)throw new Error("triangle type must be a string");if(type=type.toUpperCase(),"A"!==type[0]&&"S"!==type[0]||"A"!==type[1]&&"S"!==type[1]||"A"!==type[2]&&"S"!==type[2])throw new Error("triangle type must contain three letters; A or S");if(!isNumberArray(values,3))throw new Error("triangle values must contain three values");if(!values.every((n=>n>0)))throw new Error("triangle values must be greater than zero");switch(type){case"AAA":return(angles=>{if(Math.abs(angles[0]+angles[1]+angles[2]-Math.PI)>NEPS)throw new Error("AAA triangles require angles that sum to PI");const A=angles[0],B=angles[1],C=Math.PI-A-B,a=1/Math.sin(C)*Math.sin(A),b=1/Math.sin(C)*Math.sin(B);return createTriangle(A,B,C,a,b,1)})(values);case"AAS":return(values=>{const A=values[0],B=values[1],C=Math.PI+NEPS-A-B;if(C<NEPS)throw new Error("AAS triangles require angles that sum to PI");const a=values[2],b=a/Math.sin(A)*Math.sin(B),c=a/Math.sin(A)*Math.sin(C);return createTriangle(A,B,C,a,b,c)})(values);case"ASA":return(values=>{const A=values[0],B=values[2],C=Math.PI+NEPS-A-B;if(C<NEPS)throw new Error("ASA triangles require angles that sum to PI");const c=values[1],a=c/Math.sin(C)*Math.sin(A),b=c/Math.sin(C)*Math.sin(B);return createTriangle(A,B,C,a,b,c)})(values);case"SAS":return solveSAS(values);case"SSA":return(values=>{const c=values[0],a=values[1],C=values[2],A=Math.asin(a*Math.sin(C)/c),B=Math.PI-A-C,b=c/Math.sin(C)*Math.sin(B);return createTriangle(A,B,C,a,b,c)})(values);case"SSS":return(lengths=>{const a=lengths[1],b=lengths[2],c=lengths[0];if(a+b<=c||b+c<=a||c+a<=b)throw new Error("SSS triangle is incorrect, as the longest side is longer than the sum of the other sides");const A=solveAngleFromSSS(b,c,a),B=solveAngleFromSSS(c,a,b),C=Math.PI-A-B;return createTriangle(A,B,C,a,b,c)})(values);default:throw new Error("invalid triangle type, try again")}},exports.union=union,exports.vec2=index$b,exports.vec3=index$d,exports.vec4=index$8,exports.vectorChar=vectorChar,exports.vectorText=(options,text)=>{const{xOffset:xOffset,yOffset:yOffset,font:font,height:height,align:align,extrudeOffset:extrudeOffset,lineSpacing:lineSpacing,letterSpacing:letterSpacing}=Object.assign({},defaultsVectorParams,options);if("string"!=typeof text)throw new Error("text must be a string");const extraLetterSpacing=height*letterSpacing;let maxWidth=0,line={width:0,height:0,chars:[]},lines=[];const pushLine=()=>{maxWidth=Math.max(maxWidth,line.width),line.chars.length&&lines.push(line),line={width:0,height:0,chars:[]}};let vchar,x=xOffset,y=yOffset;const il=text.length;for(let i=0;i<il;i++){const character=text[i];if("\n"===character){pushLine(),x=xOffset,y-=height*lineSpacing;continue}vchar=vectorChar({xOffset:x,yOffset:y,font:font,height:height,extrudeOffset:extrudeOffset},character);const width=vchar.width+extraLetterSpacing;x+=width,line.width+=width,line.height=Math.max(line.height,vchar.height)," "!==character&&(line.chars=line.chars.concat(vchar))}return line.chars.length&&pushLine(),lines=lines.map((line=>{const diff=maxWidth-line.width;return"right"===align?translateLine({x:diff},line):"center"===align?translateLine({x:diff/2},line):line})),lines},Object.defineProperty(exports,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?factory(exports):"function"==typeof define&&define.amd?define(["exports"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).jscadModeling={});