@jscad/modeling 2.9.2 → 2.9.5

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 (114) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +4 -4
  3. package/dist/jscad-modeling.min.js +435 -444
  4. package/package.json +3 -2
  5. package/src/colors/colorize.d.ts +6 -5
  6. package/src/colors/colorize.test.js +1 -1
  7. package/src/geometries/geom2/toOutlines.js +66 -52
  8. package/src/geometries/geom2/type.d.ts +3 -2
  9. package/src/geometries/geom3/applyTransforms.js +1 -2
  10. package/src/geometries/geom3/create.js +1 -1
  11. package/src/geometries/geom3/create.test.js +1 -1
  12. package/src/geometries/geom3/fromPoints.js +1 -1
  13. package/src/geometries/geom3/type.d.ts +3 -2
  14. package/src/geometries/path2/index.d.ts +0 -1
  15. package/src/geometries/path2/index.js +0 -1
  16. package/src/geometries/path2/type.d.ts +3 -2
  17. package/src/geometries/poly3/create.js +1 -1
  18. package/src/geometries/poly3/measureBoundingSphere.d.ts +2 -2
  19. package/src/geometries/poly3/measureBoundingSphere.js +46 -8
  20. package/src/geometries/poly3/measureBoundingSphere.test.js +16 -26
  21. package/src/geometries/poly3/type.d.ts +3 -2
  22. package/src/geometries/poly3/validate.js +14 -0
  23. package/src/geometries/types.d.ts +4 -2
  24. package/src/maths/constants.d.ts +1 -0
  25. package/src/maths/constants.js +11 -0
  26. package/src/maths/mat4/fromRotation.js +9 -7
  27. package/src/maths/mat4/fromTaitBryanRotation.js +8 -6
  28. package/src/maths/mat4/fromXRotation.js +4 -2
  29. package/src/maths/mat4/fromYRotation.js +4 -2
  30. package/src/maths/mat4/fromZRotation.js +4 -2
  31. package/src/maths/mat4/isMirroring.js +11 -11
  32. package/src/maths/mat4/rotate.js +9 -5
  33. package/src/maths/mat4/rotateX.js +4 -2
  34. package/src/maths/mat4/rotateY.js +4 -2
  35. package/src/maths/mat4/rotateZ.js +4 -2
  36. package/src/maths/mat4/translate.test.js +2 -3
  37. package/src/maths/utils/aboutEqualNormals.js +1 -5
  38. package/src/maths/utils/index.d.ts +1 -0
  39. package/src/maths/utils/index.js +2 -0
  40. package/src/{utils → maths/utils}/trigonometry.d.ts +0 -0
  41. package/src/{utils → maths/utils}/trigonometry.js +1 -2
  42. package/src/{utils → maths/utils}/trigonometry.test.js +0 -0
  43. package/src/maths/vec2/distance.js +1 -1
  44. package/src/maths/vec2/fromAngleRadians.js +4 -2
  45. package/src/maths/vec2/length.js +1 -1
  46. package/src/maths/vec2/length.test.js +0 -10
  47. package/src/maths/vec3/angle.js +2 -2
  48. package/src/maths/vec3/angle.test.js +0 -12
  49. package/src/maths/vec3/distance.js +1 -1
  50. package/src/maths/vec3/length.js +1 -1
  51. package/src/maths/vec3/length.test.js +0 -10
  52. package/src/operations/booleans/intersectGeom2.test.js +69 -0
  53. package/src/operations/booleans/intersectGeom3.js +2 -1
  54. package/src/operations/booleans/{intersect.test.js → intersectGeom3.test.js} +3 -71
  55. package/src/operations/booleans/subtractGeom2.test.js +72 -0
  56. package/src/operations/booleans/subtractGeom3.js +2 -1
  57. package/src/operations/booleans/{subtract.test.js → subtractGeom3.test.js} +3 -74
  58. package/src/operations/booleans/to3DWalls.js +1 -1
  59. package/src/operations/booleans/trees/PolygonTreeNode.js +2 -2
  60. package/src/operations/booleans/unionGeom2.test.js +166 -0
  61. package/src/operations/booleans/unionGeom3.js +2 -1
  62. package/src/operations/booleans/{union.test.js → unionGeom3.test.js} +3 -168
  63. package/src/operations/expansions/expandGeom3.test.js +14 -14
  64. package/src/operations/expansions/expandShell.js +5 -4
  65. package/src/operations/expansions/extrudePolygon.js +7 -7
  66. package/src/operations/extrusions/extrudeFromSlices.js +3 -2
  67. package/src/operations/extrusions/extrudeFromSlices.test.js +2 -2
  68. package/src/operations/extrusions/extrudeRotate.js +5 -1
  69. package/src/operations/extrusions/extrudeRotate.test.js +47 -47
  70. package/src/operations/extrusions/extrudeWalls.js +2 -2
  71. package/src/operations/extrusions/project.js +11 -14
  72. package/src/operations/extrusions/project.test.js +49 -49
  73. package/src/operations/extrusions/slice/repair.js +62 -0
  74. package/src/operations/hulls/hullChain.test.js +4 -4
  75. package/src/operations/hulls/hullGeom2.js +6 -18
  76. package/src/operations/hulls/hullGeom3.js +5 -18
  77. package/src/operations/hulls/hullPath2.js +4 -14
  78. package/src/operations/hulls/hullPoints2.js +43 -92
  79. package/src/operations/hulls/toUniquePoints.js +34 -0
  80. package/src/operations/modifiers/generalize.js +2 -13
  81. package/src/operations/modifiers/generalize.test.js +0 -32
  82. package/src/operations/modifiers/insertTjunctions.js +1 -1
  83. package/src/operations/modifiers/insertTjunctions.test.js +21 -21
  84. package/src/operations/modifiers/mergePolygons.js +11 -14
  85. package/src/operations/{booleans → modifiers}/reTesselateCoplanarPolygons.js +33 -32
  86. package/src/operations/{booleans → modifiers}/reTesselateCoplanarPolygons.test.js +5 -5
  87. package/src/operations/{booleans → modifiers}/retessellate.js +2 -9
  88. package/src/operations/{booleans → modifiers}/retessellate.test.js +0 -0
  89. package/src/operations/modifiers/snapPolygons.test.js +12 -12
  90. package/src/operations/modifiers/triangulatePolygons.js +3 -3
  91. package/src/operations/transforms/center.js +1 -1
  92. package/src/primitives/circle.test.js +7 -0
  93. package/src/primitives/cuboid.js +1 -1
  94. package/src/primitives/cylinderElliptic.js +5 -3
  95. package/src/primitives/cylinderElliptic.test.js +7 -1
  96. package/src/primitives/ellipse.js +1 -1
  97. package/src/primitives/ellipse.test.js +7 -0
  98. package/src/primitives/ellipsoid.js +3 -3
  99. package/src/primitives/geodesicSphere.js +3 -2
  100. package/src/primitives/polyhedron.js +1 -1
  101. package/src/primitives/roundedCuboid.js +10 -8
  102. package/src/primitives/roundedCylinder.js +2 -2
  103. package/src/primitives/torus.test.js +11 -7
  104. package/src/primitives/triangle.js +1 -2
  105. package/src/utils/index.d.ts +0 -1
  106. package/src/utils/index.js +1 -3
  107. package/src/geometries/path2/eachPoint.d.ts +0 -9
  108. package/src/geometries/path2/eachPoint.js +0 -17
  109. package/src/geometries/path2/eachPoint.test.js +0 -11
  110. package/src/maths/mat4/constants.d.ts +0 -1
  111. package/src/maths/mat4/constants.js +0 -5
  112. package/src/operations/extrusions/slice/repairSlice.js +0 -47
  113. package/src/operations/modifiers/edges.js +0 -195
  114. package/src/operations/modifiers/repairTjunctions.js +0 -44
@@ -1,195 +0,0 @@
1
- const vec3 = require('../../maths/vec3')
2
- const line3 = require('../../maths/line3')
3
-
4
- const poly3 = require('../../geometries/poly3')
5
-
6
- /*
7
- * Add a unique edge to the given list of edges.
8
- * Each edge has a list of associated polygons.
9
- * Edges with two polygons are complete, while edges with one polygon are open, i.e hole or t-junction..
10
- */
11
- const addEdge = (edges, edge, polygon) => {
12
- const ei = edges.findIndex((element) => {
13
- if (element) {
14
- if (vec3.equals(element[0], edge[0]) && vec3.equals(element[1], edge[1])) return true
15
- if (vec3.equals(element[0], edge[1]) && vec3.equals(element[1], edge[0])) return true
16
- }
17
- return false
18
- })
19
- if (ei >= 0) {
20
- edge = edges[ei]
21
- edge.polygons.push(polygon)
22
- } else {
23
- edge.polygons = [polygon]
24
- edges.push(edge)
25
- }
26
- }
27
-
28
- /*
29
- * Remove the edge from the given list of edges.
30
- */
31
- const removeEdge = (edges, edge) => {
32
- const ei = edges.findIndex((element) => {
33
- if (element) {
34
- if (vec3.equals(element[0], edge[0]) && vec3.equals(element[1], edge[1])) return true
35
- if (vec3.equals(element[0], edge[1]) && vec3.equals(element[1], edge[0])) return true
36
- }
37
- return false
38
- })
39
- if (ei >= 0) {
40
- edges[ei].polygons = []
41
- edges[ei] = null
42
- }
43
- }
44
-
45
- /*
46
- * Add all edges of the polygon to the given list of edges.
47
- */
48
- const addPolygon = (edges, polygon) => {
49
- const vertices = polygon.vertices
50
- const nv = vertices.length
51
-
52
- let edge = [vertices[nv - 1], vertices[0]]
53
- addEdge(edges, edge, polygon)
54
-
55
- for (let i = 0; i < (nv - 1); i++) {
56
- edge = [vertices[i], vertices[i + 1]]
57
- addEdge(edges, edge, polygon)
58
- }
59
- }
60
-
61
- /*
62
- * Remove all polygons associated with the old edge from the given list of edges.
63
- */
64
- const removePolygons = (edges, oldedge) => {
65
- // console.log('removePolygons',oldedge)
66
- const polygons = oldedge.polygons
67
- polygons.forEach((polygon) => {
68
- const vertices = polygon.vertices
69
- const nv = vertices.length
70
-
71
- let edge = [vertices[nv - 1], vertices[0]]
72
- removeEdge(edges, edge)
73
-
74
- for (let i = 0; i < (nv - 1); i++) {
75
- edge = [vertices[i], vertices[i + 1]]
76
- removeEdge(edges, edge)
77
- }
78
- })
79
- }
80
-
81
- /*
82
- * Split the polygon, ensuring one polygon includes the open edge.
83
- */
84
- const splitPolygon = (openedge, polygon, eps) => {
85
- // console.log('splitPolygon',openedge,polygon)
86
- const vertices = polygon.vertices
87
- const i = vertices.findIndex((point) => almostEquals(eps, point, openedge[0]))
88
- const polygon1 = poly3.fromPoints([vertices[(i + 0) % 3], vertices[(i + 1) % 3], openedge[1]])
89
- const polygon2 = poly3.fromPoints([openedge[1], vertices[(i + 1) % 3], vertices[(i + 2) % 3]])
90
- if (polygon.color) {
91
- polygon1.color = polygon.color
92
- polygon2.color = polygon.color
93
- }
94
- // console.log('polygon1',polygon1)
95
- // console.log('polygon2',polygon2)
96
- return [polygon1, polygon2]
97
- }
98
-
99
- /*
100
- * TBD This should be part of vec3.
101
- */
102
- const almostEquals = (eps, v1, v2) => (Math.abs(v1[0] - v2[0]) <= eps && Math.abs(v1[1] - v2[1]) <= eps && Math.abs(v1[2] - v2[2]) <= eps)
103
-
104
- const enclosedEdge = (openedge, edge, eps) => {
105
- if (openedge.distance < edge.distance) {
106
- // only look for opposing edges
107
- if (vec3.equals(openedge[0], edge[1])) {
108
- // only opposing open edges enclosed by the edge
109
- const distanceE0O0 = vec3.squaredDistance(openedge[0], edge[0])
110
- const distanceE0O1 = vec3.squaredDistance(openedge[1], edge[0])
111
- const distanceE1O0 = vec3.squaredDistance(openedge[0], edge[1])
112
- const distanceE1O1 = vec3.squaredDistance(openedge[1], edge[1])
113
- if (distanceE0O0 <= edge.distance && distanceE0O1 < edge.distance && distanceE1O0 < edge.distance && distanceE1O1 < edge.distance) {
114
- // only look for paralell open edges
115
- const line3d = line3.fromPoints(edge[0], edge[1])
116
- const closest0 = vec3.snap(vec3.create(), eps, line3.closestPoint(openedge[0], line3d))
117
- const closest1 = vec3.snap(vec3.create(), eps, line3.closestPoint(openedge[1], line3d))
118
- if (almostEquals(eps, closest0, openedge[0]) && almostEquals(eps, closest1, openedge[1])) {
119
- return true
120
- }
121
- }
122
- }
123
- }
124
- return false
125
- }
126
-
127
- /*
128
- * Split the edge if posssible from the list of open edges.
129
- * Return a list of new polygons, or null if not possible
130
- */
131
- const splitEdge = (openedges, edge, eps) => {
132
- // console.log('splitEdge',edge)
133
- for (let i = 0; i < openedges.length; i++) {
134
- const openedge = openedges[i]
135
- if (openedge) {
136
- if (enclosedEdge(openedge, edge, eps)) {
137
- // spit the polygon associated with the edge
138
- const polygon = edge.polygons[0]
139
- const newpolygons = splitPolygon(openedge, polygon, eps)
140
- return newpolygons
141
- }
142
- }
143
- }
144
- return null
145
- }
146
-
147
- /*
148
- * Cull a list of open edges (see above) from the list of edges.
149
- */
150
- const cullOpenEdges = (edges) => {
151
- const openedges = []
152
- edges.forEach((edge) => {
153
- const polygons = edge.polygons
154
- if (polygons.length === 1) {
155
- // console.log('open edge: ',edge[0],'<-->',edge[1])
156
- edge.distance = vec3.squaredDistance(edge[0], edge[1])
157
- openedges.push(edge)
158
- }
159
- })
160
- // console.log('open edges:',openedges.length)
161
- // console.log('**********OPEN*********')
162
- // console.log(openedges)
163
- // console.log('**********OPEN*********')
164
- return openedges
165
- }
166
-
167
- /*
168
- * Convert the list of edges into a list of polygons.
169
- */
170
- const edgesToPolygons = (edges) => {
171
- const polygons = []
172
- edges.forEach((edge) => {
173
- if (edge && edge.polygons) {
174
- edge.polygons.forEach((polygon) => {
175
- if (polygon.visited) return
176
- polygon.visited = true
177
- polygons.push(polygon)
178
- })
179
- }
180
- })
181
- return polygons
182
- }
183
-
184
- /*
185
- * Convert the given list of polygons to a list of edges.
186
- */
187
- const polygonsToEdges = (polygons) => {
188
- const edges = []
189
- polygons.forEach((polygon) => {
190
- addPolygon(edges, polygon)
191
- })
192
- return edges
193
- }
194
-
195
- module.exports = { polygonsToEdges, edgesToPolygons, cullOpenEdges, splitEdge, removePolygons, addPolygon }
@@ -1,44 +0,0 @@
1
- const { polygonsToEdges, edgesToPolygons, cullOpenEdges, splitEdge, removePolygons, addPolygon } = require('./edges')
2
-
3
- /*
4
- */
5
- const repairTjunctions = (epsilon, polygons) => {
6
- const edges = polygonsToEdges(polygons)
7
- let openedges = cullOpenEdges(edges)
8
- if (openedges.length === 0) return polygons
9
-
10
- // split open edges until no longer possible
11
- let splitting = true
12
- while (splitting) {
13
- let splitcount = 0
14
- for (let i = 0; i < openedges.length; i++) {
15
- const edge = openedges[i]
16
- if (edge && edge.polygons && edge.polygons.length === 1) {
17
- const newpolygons = splitEdge(openedges, edge, epsilon)
18
- if (newpolygons) {
19
- openedges[i] = null
20
- addPolygon(openedges, newpolygons[0])
21
- addPolygon(openedges, newpolygons[1])
22
-
23
- // adjust the master list as well
24
- removePolygons(edges, edge)
25
- // add edges for each new polygon
26
- addPolygon(edges, newpolygons[0])
27
- addPolygon(edges, newpolygons[1])
28
-
29
- splitcount++
30
- break // start again
31
- }
32
- }
33
- }
34
- splitting = (splitcount > 0)
35
- }
36
- openedges = openedges.filter((edge) => (edge && edge.polygons && edge.polygons.length === 1))
37
- if (openedges.length > 0) console.warn('Repair of all T-junctions failed:', openedges.length)
38
-
39
- // rebuild the list of polygons from the edges
40
- polygons = edgesToPolygons(edges)
41
- return polygons
42
- }
43
-
44
- module.exports = repairTjunctions