@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.
- package/CHANGELOG.md +50 -0
- package/README.md +4 -4
- package/dist/jscad-modeling.min.js +435 -444
- package/package.json +3 -2
- package/src/colors/colorize.d.ts +6 -5
- package/src/colors/colorize.test.js +1 -1
- package/src/geometries/geom2/toOutlines.js +66 -52
- package/src/geometries/geom2/type.d.ts +3 -2
- package/src/geometries/geom3/applyTransforms.js +1 -2
- package/src/geometries/geom3/create.js +1 -1
- package/src/geometries/geom3/create.test.js +1 -1
- package/src/geometries/geom3/fromPoints.js +1 -1
- package/src/geometries/geom3/type.d.ts +3 -2
- package/src/geometries/path2/index.d.ts +0 -1
- package/src/geometries/path2/index.js +0 -1
- package/src/geometries/path2/type.d.ts +3 -2
- package/src/geometries/poly3/create.js +1 -1
- package/src/geometries/poly3/measureBoundingSphere.d.ts +2 -2
- package/src/geometries/poly3/measureBoundingSphere.js +46 -8
- package/src/geometries/poly3/measureBoundingSphere.test.js +16 -26
- package/src/geometries/poly3/type.d.ts +3 -2
- package/src/geometries/poly3/validate.js +14 -0
- package/src/geometries/types.d.ts +4 -2
- package/src/maths/constants.d.ts +1 -0
- package/src/maths/constants.js +11 -0
- package/src/maths/mat4/fromRotation.js +9 -7
- package/src/maths/mat4/fromTaitBryanRotation.js +8 -6
- package/src/maths/mat4/fromXRotation.js +4 -2
- package/src/maths/mat4/fromYRotation.js +4 -2
- package/src/maths/mat4/fromZRotation.js +4 -2
- package/src/maths/mat4/isMirroring.js +11 -11
- package/src/maths/mat4/rotate.js +9 -5
- package/src/maths/mat4/rotateX.js +4 -2
- package/src/maths/mat4/rotateY.js +4 -2
- package/src/maths/mat4/rotateZ.js +4 -2
- package/src/maths/mat4/translate.test.js +2 -3
- package/src/maths/utils/aboutEqualNormals.js +1 -5
- package/src/maths/utils/index.d.ts +1 -0
- package/src/maths/utils/index.js +2 -0
- package/src/{utils → maths/utils}/trigonometry.d.ts +0 -0
- package/src/{utils → maths/utils}/trigonometry.js +1 -2
- package/src/{utils → maths/utils}/trigonometry.test.js +0 -0
- package/src/maths/vec2/distance.js +1 -1
- package/src/maths/vec2/fromAngleRadians.js +4 -2
- package/src/maths/vec2/length.js +1 -1
- package/src/maths/vec2/length.test.js +0 -10
- package/src/maths/vec3/angle.js +2 -2
- package/src/maths/vec3/angle.test.js +0 -12
- package/src/maths/vec3/distance.js +1 -1
- package/src/maths/vec3/length.js +1 -1
- package/src/maths/vec3/length.test.js +0 -10
- package/src/operations/booleans/intersectGeom2.test.js +69 -0
- package/src/operations/booleans/intersectGeom3.js +2 -1
- package/src/operations/booleans/{intersect.test.js → intersectGeom3.test.js} +3 -71
- package/src/operations/booleans/subtractGeom2.test.js +72 -0
- package/src/operations/booleans/subtractGeom3.js +2 -1
- package/src/operations/booleans/{subtract.test.js → subtractGeom3.test.js} +3 -74
- package/src/operations/booleans/to3DWalls.js +1 -1
- package/src/operations/booleans/trees/PolygonTreeNode.js +2 -2
- package/src/operations/booleans/unionGeom2.test.js +166 -0
- package/src/operations/booleans/unionGeom3.js +2 -1
- package/src/operations/booleans/{union.test.js → unionGeom3.test.js} +3 -168
- package/src/operations/expansions/expandGeom3.test.js +14 -14
- package/src/operations/expansions/expandShell.js +5 -4
- package/src/operations/expansions/extrudePolygon.js +7 -7
- package/src/operations/extrusions/extrudeFromSlices.js +3 -2
- package/src/operations/extrusions/extrudeFromSlices.test.js +2 -2
- package/src/operations/extrusions/extrudeRotate.js +5 -1
- package/src/operations/extrusions/extrudeRotate.test.js +47 -47
- package/src/operations/extrusions/extrudeWalls.js +2 -2
- package/src/operations/extrusions/project.js +11 -14
- package/src/operations/extrusions/project.test.js +49 -49
- package/src/operations/extrusions/slice/repair.js +62 -0
- package/src/operations/hulls/hullChain.test.js +4 -4
- package/src/operations/hulls/hullGeom2.js +6 -18
- package/src/operations/hulls/hullGeom3.js +5 -18
- package/src/operations/hulls/hullPath2.js +4 -14
- package/src/operations/hulls/hullPoints2.js +43 -92
- package/src/operations/hulls/toUniquePoints.js +34 -0
- package/src/operations/modifiers/generalize.js +2 -13
- package/src/operations/modifiers/generalize.test.js +0 -32
- package/src/operations/modifiers/insertTjunctions.js +1 -1
- package/src/operations/modifiers/insertTjunctions.test.js +21 -21
- package/src/operations/modifiers/mergePolygons.js +11 -14
- package/src/operations/{booleans → modifiers}/reTesselateCoplanarPolygons.js +33 -32
- package/src/operations/{booleans → modifiers}/reTesselateCoplanarPolygons.test.js +5 -5
- package/src/operations/{booleans → modifiers}/retessellate.js +2 -9
- package/src/operations/{booleans → modifiers}/retessellate.test.js +0 -0
- package/src/operations/modifiers/snapPolygons.test.js +12 -12
- package/src/operations/modifiers/triangulatePolygons.js +3 -3
- package/src/operations/transforms/center.js +1 -1
- package/src/primitives/circle.test.js +7 -0
- package/src/primitives/cuboid.js +1 -1
- package/src/primitives/cylinderElliptic.js +5 -3
- package/src/primitives/cylinderElliptic.test.js +7 -1
- package/src/primitives/ellipse.js +1 -1
- package/src/primitives/ellipse.test.js +7 -0
- package/src/primitives/ellipsoid.js +3 -3
- package/src/primitives/geodesicSphere.js +3 -2
- package/src/primitives/polyhedron.js +1 -1
- package/src/primitives/roundedCuboid.js +10 -8
- package/src/primitives/roundedCylinder.js +2 -2
- package/src/primitives/torus.test.js +11 -7
- package/src/primitives/triangle.js +1 -2
- package/src/utils/index.d.ts +0 -1
- package/src/utils/index.js +1 -3
- package/src/geometries/path2/eachPoint.d.ts +0 -9
- package/src/geometries/path2/eachPoint.js +0 -17
- package/src/geometries/path2/eachPoint.test.js +0 -11
- package/src/maths/mat4/constants.d.ts +0 -1
- package/src/maths/mat4/constants.js +0 -5
- package/src/operations/extrusions/slice/repairSlice.js +0 -47
- package/src/operations/modifiers/edges.js +0 -195
- 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
|