@jscad/modeling 2.9.6 → 2.10.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 (67) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +12 -2
  3. package/dist/jscad-modeling.min.js +28 -28
  4. package/package.json +2 -2
  5. package/src/geometries/path2/appendArc.js +6 -5
  6. package/src/geometries/path2/appendArc.test.js +3 -1
  7. package/src/geometries/path2/appendBezier.js +2 -1
  8. package/src/geometries/path2/transform.js +1 -1
  9. package/src/index.d.ts +1 -0
  10. package/src/maths/constants.js +10 -0
  11. package/src/maths/mat4/fromRotation.js +1 -1
  12. package/src/maths/mat4/fromTaitBryanRotation.js +1 -1
  13. package/src/maths/mat4/fromXRotation.js +1 -1
  14. package/src/maths/mat4/fromYRotation.js +1 -1
  15. package/src/maths/mat4/fromZRotation.js +1 -1
  16. package/src/maths/mat4/invert.test.js +5 -2
  17. package/src/maths/mat4/isOnlyTransformScale.js +1 -1
  18. package/src/maths/mat4/isOnlyTransformScale.test.js +3 -1
  19. package/src/maths/rotation.test.js +5 -2
  20. package/src/maths/utils/trigonometry.js +6 -6
  21. package/src/maths/utils/trigonometry.test.js +10 -8
  22. package/src/maths/vec2/fromAngleDegrees.js +1 -1
  23. package/src/maths/vec2/fromAngleRadians.test.js +4 -1
  24. package/src/maths/vec2/normal.js +3 -1
  25. package/src/maths/vec2/rotate.test.js +4 -1
  26. package/src/maths/vec3/rotateX.test.js +4 -1
  27. package/src/maths/vec3/rotateY.test.js +4 -1
  28. package/src/maths/vec3/rotateZ.test.js +4 -1
  29. package/src/operations/expansions/expand.test.js +3 -1
  30. package/src/operations/expansions/expandShell.js +4 -4
  31. package/src/operations/expansions/offsetFromPoints.js +2 -2
  32. package/src/operations/extrusions/extrudeFromSlices.test.js +3 -2
  33. package/src/operations/extrusions/extrudeLinear.test.js +5 -3
  34. package/src/operations/extrusions/extrudeRectangular.js +1 -1
  35. package/src/operations/extrusions/extrudeRectangular.test.js +5 -3
  36. package/src/operations/extrusions/extrudeRotate.js +14 -13
  37. package/src/operations/extrusions/extrudeRotate.test.js +7 -5
  38. package/src/operations/extrusions/slice/calculatePlane.test.js +3 -2
  39. package/src/operations/extrusions/slice/index.js +2 -0
  40. package/src/operations/modifiers/generalize.d.ts +12 -0
  41. package/src/operations/modifiers/generalize.test.js +3 -1
  42. package/src/operations/modifiers/index.d.ts +2 -0
  43. package/src/operations/modifiers/snap.d.ts +6 -0
  44. package/src/operations/modifiers/snap.test.js +5 -3
  45. package/src/operations/transforms/rotate.js +1 -1
  46. package/src/operations/transforms/rotate.test.js +13 -11
  47. package/src/operations/transforms/transform.js +1 -1
  48. package/src/primitives/arc.js +8 -8
  49. package/src/primitives/arc.test.js +9 -8
  50. package/src/primitives/circle.js +4 -2
  51. package/src/primitives/circle.test.js +6 -5
  52. package/src/primitives/cylinderElliptic.js +11 -11
  53. package/src/primitives/cylinderElliptic.test.js +3 -2
  54. package/src/primitives/ellipse.js +10 -10
  55. package/src/primitives/ellipse.test.js +6 -5
  56. package/src/primitives/ellipsoid.js +3 -2
  57. package/src/primitives/roundedCuboid.js +6 -6
  58. package/src/primitives/roundedCylinder.js +3 -3
  59. package/src/primitives/roundedRectangle.js +5 -5
  60. package/src/primitives/star.js +3 -2
  61. package/src/primitives/torus.js +4 -2
  62. package/src/primitives/torus.test.js +5 -3
  63. package/src/primitives/triangle.test.js +2 -1
  64. package/src/utils/degToRad.test.js +5 -5
  65. package/src/utils/radToDeg.test.js +6 -6
  66. package/src/utils/radiusToSegments.js +6 -4
  67. package/src/utils/radiusToSegments.test.js +5 -3
@@ -2,6 +2,8 @@ const test = require('ava')
2
2
 
3
3
  const geom3 = require('../geometries/geom3')
4
4
  const measureBoundingBox = require('../measurements/measureBoundingBox')
5
+ const { TAU } = require('../maths/constants')
6
+
5
7
  const comparePoints = require('../../test/helpers/comparePoints')
6
8
 
7
9
  const { torus } = require('./index')
@@ -30,7 +32,7 @@ test('torus (simple options)', (t) => {
30
32
  })
31
33
 
32
34
  test('torus (complex options)', (t) => {
33
- const obs = torus({ innerRadius: 1, outerRadius: 5, innerSegments: 32, outerSegments: 72, startAngle: Math.PI / 2, outerRotation: Math.PI / 2 })
35
+ const obs = torus({ innerRadius: 1, outerRadius: 5, innerSegments: 32, outerSegments: 72, startAngle: TAU / 4, outerRotation: TAU / 4 })
34
36
  const pts = geom3.toPoints(obs)
35
37
  t.notThrows(() => geom3.validate(obs))
36
38
  t.is(pts.length, 1212)
@@ -41,14 +43,14 @@ test('torus (complex options)', (t) => {
41
43
  })
42
44
 
43
45
  test('torus (startAngle)', (t) => {
44
- const obs = torus({ startAngle: 1, endAngle: 1 + 2 * Math.PI })
46
+ const obs = torus({ startAngle: 1, endAngle: 1 + TAU })
45
47
  const pts = geom3.toPoints(obs)
46
48
  t.notThrows(() => geom3.validate(obs))
47
49
  t.is(pts.length, 2048)
48
50
  })
49
51
 
50
52
  test('torus (square by square)', (t) => {
51
- const obs = torus({ innerSegments: 4, outerSegments: 4, innerRotation: Math.PI / 2 })
53
+ const obs = torus({ innerSegments: 4, outerSegments: 4, innerRotation: TAU / 4 })
52
54
 
53
55
  const bounds = measureBoundingBox(obs)
54
56
  const expectedBounds = [[-5, -5, -1], [5, 5, 1]]
@@ -4,6 +4,7 @@ const { triangle } = require('./index')
4
4
 
5
5
  const degToRad = require('../utils/degToRad')
6
6
  const geom2 = require('../geometries/geom2')
7
+ const { TAU } = require('../maths/constants')
7
8
 
8
9
  const comparePoints = require('../../test/helpers/comparePoints')
9
10
 
@@ -36,7 +37,7 @@ test('triangle (options)', (t) => {
36
37
  t.true(comparePoints(obs, exp))
37
38
 
38
39
  // test AAA
39
- geometry = triangle({ type: 'AAA', values: [Math.PI / 2, Math.PI / 4, Math.PI / 4] })
40
+ geometry = triangle({ type: 'AAA', values: [TAU / 4, TAU / 8, TAU / 8] })
40
41
  obs = geom2.toPoints(geometry)
41
42
  exp = [
42
43
  [0, 0],
@@ -1,19 +1,19 @@
1
1
  const test = require('ava')
2
2
 
3
+ const { TAU } = require('../maths/constants')
4
+
3
5
  const { degToRad } = require('./index')
4
6
 
5
7
  test('utils: degToRad() should return correct values', (t) => {
6
- const radians = Math.PI / 180
7
-
8
8
  const obs1 = degToRad(0)
9
9
  t.true(obs1 === 0)
10
10
 
11
11
  const obs2 = degToRad(90)
12
- t.true(obs2 === (90 * radians))
12
+ t.true(obs2 === (TAU / 4))
13
13
 
14
14
  const obs3 = degToRad(180)
15
- t.true(obs3 === (180 * radians))
15
+ t.true(obs3 === (TAU / 2))
16
16
 
17
17
  const obs4 = degToRad(270)
18
- t.true(obs4 === (270 * radians))
18
+ t.true(obs4 === (TAU * 0.75))
19
19
  })
@@ -1,19 +1,19 @@
1
1
  const test = require('ava')
2
2
 
3
+ const { TAU } = require('../maths/constants')
4
+
3
5
  const { radToDeg } = require('./index')
4
6
 
5
7
  test('utils: radToDeg() should return correct values', (t) => {
6
- const radians = Math.PI / 180
7
-
8
- const obs1 = radToDeg(radians * 0)
8
+ const obs1 = radToDeg(0)
9
9
  t.true(obs1 === 0)
10
10
 
11
- const obs2 = radToDeg(radians * 90)
11
+ const obs2 = radToDeg(TAU / 4)
12
12
  t.true(obs2 === 90)
13
13
 
14
- const obs3 = radToDeg(radians * 180)
14
+ const obs3 = radToDeg(TAU / 2)
15
15
  t.true(obs3 === 180)
16
16
 
17
- const obs4 = radToDeg(radians * 270)
17
+ const obs4 = radToDeg(TAU * 0.75)
18
18
  t.true(obs4 === 270)
19
19
  })
@@ -1,14 +1,16 @@
1
+ const { TAU } = require('../maths/constants')
2
+
1
3
  /**
2
4
  * Calculate the number of segments from the given radius based on minimum length or angle.
3
5
  * @param {Number} radius - radius of the requested shape
4
- * @param {Number} minimumLength - minimum length of segments; 0 > length
5
- * @param {Number} minimumAngle - minimum angle (radians) between segments; 0 > angle < Math.PI * 2
6
+ * @param {Number} minimumLength - minimum length of segments; length > 0
7
+ * @param {Number} minimumAngle - minimum angle (radians) between segments; 0 > angle < TAU
6
8
  * @returns {Number} number of segments to complete the radius
7
9
  * @alias module:modeling/utils.radiusToSegments
8
10
  */
9
11
  const radiusToSegments = (radius, minimumLength, minimumAngle) => {
10
- const ss = minimumLength > 0 ? radius * 2 * Math.PI / minimumLength : 0
11
- const as = minimumAngle > 0 ? Math.PI * 2 / minimumAngle : 0
12
+ const ss = minimumLength > 0 ? radius * TAU / minimumLength : 0
13
+ const as = minimumAngle > 0 ? TAU / minimumAngle : 0
12
14
  // minimum segments is four(4) for round primitives
13
15
  return Math.ceil(Math.max(ss, as, 4))
14
16
  }
@@ -1,5 +1,7 @@
1
1
  const test = require('ava')
2
2
 
3
+ const { TAU } = require('../maths/constants')
4
+
3
5
  const { radiusToSegments } = require('./index')
4
6
 
5
7
  test('utils: radiusToSegments() should return correct values', (t) => {
@@ -14,13 +16,13 @@ test('utils: radiusToSegments() should return correct values', (t) => {
14
16
  segments = radiusToSegments(100.0, 2.0, 0)
15
17
  t.is(segments, 315)
16
18
 
17
- segments = radiusToSegments(100.0, 0, Math.PI * 2 / 20.0)
19
+ segments = radiusToSegments(100.0, 0, TAU / 20.0)
18
20
  t.is(segments, 20.0)
19
21
 
20
22
  // test minimum length versus minimum angle
21
- segments = radiusToSegments(100.0, 31, Math.PI * 2 / 20.0)
23
+ segments = radiusToSegments(100.0, 31, TAU / 20.0)
22
24
  t.is(segments, 21.0)
23
25
 
24
- segments = radiusToSegments(100.0, 32, Math.PI * 2 / 20.0)
26
+ segments = radiusToSegments(100.0, 32, TAU / 20.0)
25
27
  t.is(segments, 20.0)
26
28
  })