@js-draw/math 1.7.0 → 1.9.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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 Henry Heino
3
+ Copyright (c) 2023 Henry Heino
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -46,6 +46,15 @@ export declare class Vec3 {
46
46
  * Return this' angle in the XY plane (treats this as a Vec2).
47
47
  *
48
48
  * This is equivalent to `Math.atan2(vec.y, vec.x)`.
49
+ *
50
+ * As such, observing that `Math.atan2(-0, -1)` $\approx -\pi$ and `Math.atan2(0, -1)`$\approx \pi$
51
+ * the resultant angle is in the range $[-\pi, pi]$.
52
+ *
53
+ * ```ts,runnable,console
54
+ * import { Vec2 } from '@js-draw/math';
55
+ * console.log(Vec2.of(-1, -0).angle()); // atan2(-0, -1)
56
+ * console.log(Vec2.of(-1, 0).angle()); // atan2(0, -1)
57
+ * ```
49
58
  */
50
59
  angle(): number;
51
60
  /**
package/dist/cjs/Vec3.js CHANGED
@@ -71,6 +71,15 @@ class Vec3 {
71
71
  * Return this' angle in the XY plane (treats this as a Vec2).
72
72
  *
73
73
  * This is equivalent to `Math.atan2(vec.y, vec.x)`.
74
+ *
75
+ * As such, observing that `Math.atan2(-0, -1)` $\approx -\pi$ and `Math.atan2(0, -1)`$\approx \pi$
76
+ * the resultant angle is in the range $[-\pi, pi]$.
77
+ *
78
+ * ```ts,runnable,console
79
+ * import { Vec2 } from '@js-draw/math';
80
+ * console.log(Vec2.of(-1, -0).angle()); // atan2(-0, -1)
81
+ * console.log(Vec2.of(-1, 0).angle()); // atan2(0, -1)
82
+ * ```
74
83
  */
75
84
  angle() {
76
85
  return Math.atan2(this.y, this.x);
@@ -63,6 +63,8 @@ export declare class Path {
63
63
  private cachedPolylineApproximation;
64
64
  polylineApproximation(): LineSegment2[];
65
65
  static computeBBoxForSegment(startPoint: Point2, part: PathCommand): Rect2;
66
+ /** **Note**: `strokeRadius = strokeWidth / 2` */
67
+ signedDistance(point: Point2, strokeRadius: number): number;
66
68
  /**
67
69
  * Let `S` be a closed path a distance `strokeRadius` from this path.
68
70
  *
@@ -154,6 +154,17 @@ class Path {
154
154
  }
155
155
  return Rect2_1.default.bboxOf(points);
156
156
  }
157
+ /** **Note**: `strokeRadius = strokeWidth / 2` */
158
+ signedDistance(point, strokeRadius) {
159
+ let minDist = Infinity;
160
+ for (const part of this.geometry) {
161
+ const currentDist = part.signedDistance(point) - strokeRadius;
162
+ if (currentDist < minDist) {
163
+ minDist = currentDist;
164
+ }
165
+ }
166
+ return minDist;
167
+ }
157
168
  /**
158
169
  * Let `S` be a closed path a distance `strokeRadius` from this path.
159
170
  *
@@ -43,6 +43,7 @@ export declare class Rect2 extends Abstract2DShape {
43
43
  isWithinRadiusOf(radius: number, point: Point2): boolean;
44
44
  get corners(): Point2[];
45
45
  get maxDimension(): number;
46
+ get minDimension(): number;
46
47
  get bottomRight(): Vec3;
47
48
  get topRight(): Vec3;
48
49
  get bottomLeft(): Vec3;
@@ -164,6 +164,9 @@ class Rect2 extends Abstract2DShape_1.default {
164
164
  get maxDimension() {
165
165
  return Math.max(this.w, this.h);
166
166
  }
167
+ get minDimension() {
168
+ return Math.min(this.w, this.h);
169
+ }
167
170
  get bottomRight() {
168
171
  return this.topLeft.plus(this.size);
169
172
  }
@@ -46,6 +46,15 @@ export declare class Vec3 {
46
46
  * Return this' angle in the XY plane (treats this as a Vec2).
47
47
  *
48
48
  * This is equivalent to `Math.atan2(vec.y, vec.x)`.
49
+ *
50
+ * As such, observing that `Math.atan2(-0, -1)` $\approx -\pi$ and `Math.atan2(0, -1)`$\approx \pi$
51
+ * the resultant angle is in the range $[-\pi, pi]$.
52
+ *
53
+ * ```ts,runnable,console
54
+ * import { Vec2 } from '@js-draw/math';
55
+ * console.log(Vec2.of(-1, -0).angle()); // atan2(-0, -1)
56
+ * console.log(Vec2.of(-1, 0).angle()); // atan2(0, -1)
57
+ * ```
49
58
  */
50
59
  angle(): number;
51
60
  /**
package/dist/mjs/Vec3.mjs CHANGED
@@ -68,6 +68,15 @@ export class Vec3 {
68
68
  * Return this' angle in the XY plane (treats this as a Vec2).
69
69
  *
70
70
  * This is equivalent to `Math.atan2(vec.y, vec.x)`.
71
+ *
72
+ * As such, observing that `Math.atan2(-0, -1)` $\approx -\pi$ and `Math.atan2(0, -1)`$\approx \pi$
73
+ * the resultant angle is in the range $[-\pi, pi]$.
74
+ *
75
+ * ```ts,runnable,console
76
+ * import { Vec2 } from '@js-draw/math';
77
+ * console.log(Vec2.of(-1, -0).angle()); // atan2(-0, -1)
78
+ * console.log(Vec2.of(-1, 0).angle()); // atan2(0, -1)
79
+ * ```
71
80
  */
72
81
  angle() {
73
82
  return Math.atan2(this.y, this.x);
@@ -63,6 +63,8 @@ export declare class Path {
63
63
  private cachedPolylineApproximation;
64
64
  polylineApproximation(): LineSegment2[];
65
65
  static computeBBoxForSegment(startPoint: Point2, part: PathCommand): Rect2;
66
+ /** **Note**: `strokeRadius = strokeWidth / 2` */
67
+ signedDistance(point: Point2, strokeRadius: number): number;
66
68
  /**
67
69
  * Let `S` be a closed path a distance `strokeRadius` from this path.
68
70
  *
@@ -148,6 +148,17 @@ export class Path {
148
148
  }
149
149
  return Rect2.bboxOf(points);
150
150
  }
151
+ /** **Note**: `strokeRadius = strokeWidth / 2` */
152
+ signedDistance(point, strokeRadius) {
153
+ let minDist = Infinity;
154
+ for (const part of this.geometry) {
155
+ const currentDist = part.signedDistance(point) - strokeRadius;
156
+ if (currentDist < minDist) {
157
+ minDist = currentDist;
158
+ }
159
+ }
160
+ return minDist;
161
+ }
151
162
  /**
152
163
  * Let `S` be a closed path a distance `strokeRadius` from this path.
153
164
  *
@@ -43,6 +43,7 @@ export declare class Rect2 extends Abstract2DShape {
43
43
  isWithinRadiusOf(radius: number, point: Point2): boolean;
44
44
  get corners(): Point2[];
45
45
  get maxDimension(): number;
46
+ get minDimension(): number;
46
47
  get bottomRight(): Vec3;
47
48
  get topRight(): Vec3;
48
49
  get bottomLeft(): Vec3;
@@ -158,6 +158,9 @@ export class Rect2 extends Abstract2DShape {
158
158
  get maxDimension() {
159
159
  return Math.max(this.w, this.h);
160
160
  }
161
+ get minDimension() {
162
+ return Math.min(this.w, this.h);
163
+ }
161
164
  get bottomRight() {
162
165
  return this.topLeft.plus(this.size);
163
166
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@js-draw/math",
3
- "version": "1.7.0",
3
+ "version": "1.9.0",
4
4
  "description": "A math library for js-draw. ",
5
5
  "types": "./dist/mjs/lib.d.ts",
6
6
  "main": "./dist/cjs/lib.js",
@@ -19,7 +19,7 @@
19
19
  "license": "MIT",
20
20
  "private": false,
21
21
  "scripts": {
22
- "dist-test": "npm run build && cd dist-test/test_imports && npm install && npm run test",
22
+ "dist-test": "cd dist-test/test_imports && npm install && npm run test",
23
23
  "dist": "npm run build && npm run dist-test",
24
24
  "build": "rm -rf ./dist && mkdir dist && build-tool build",
25
25
  "watch": "rm -rf ./dist/* && mkdir -p dist && build-tool watch"
@@ -45,5 +45,5 @@
45
45
  "svg",
46
46
  "math"
47
47
  ],
48
- "gitHead": "e7d8a68e6a5ae3063de9c1f033ed8f08c567b393"
48
+ "gitHead": "e824c37e9f216852cf096976e3a74fb4f177ead3"
49
49
  }
package/src/Vec3.ts CHANGED
@@ -77,6 +77,15 @@ export class Vec3 {
77
77
  * Return this' angle in the XY plane (treats this as a Vec2).
78
78
  *
79
79
  * This is equivalent to `Math.atan2(vec.y, vec.x)`.
80
+ *
81
+ * As such, observing that `Math.atan2(-0, -1)` $\approx -\pi$ and `Math.atan2(0, -1)`$\approx \pi$
82
+ * the resultant angle is in the range $[-\pi, pi]$.
83
+ *
84
+ * ```ts,runnable,console
85
+ * import { Vec2 } from '@js-draw/math';
86
+ * console.log(Vec2.of(-1, -0).angle()); // atan2(-0, -1)
87
+ * console.log(Vec2.of(-1, 0).angle()); // atan2(0, -1)
88
+ * ```
80
89
  */
81
90
  public angle(): number {
82
91
  return Math.atan2(this.y, this.x);
@@ -225,6 +225,20 @@ export class Path {
225
225
  return Rect2.bboxOf(points);
226
226
  }
227
227
 
228
+ /** **Note**: `strokeRadius = strokeWidth / 2` */
229
+ public signedDistance(point: Point2, strokeRadius: number) {
230
+ let minDist = Infinity;
231
+
232
+ for (const part of this.geometry) {
233
+ const currentDist = part.signedDistance(point) - strokeRadius;
234
+ if (currentDist < minDist) {
235
+ minDist = currentDist;
236
+ }
237
+ }
238
+
239
+ return minDist;
240
+ }
241
+
228
242
  /**
229
243
  * Let `S` be a closed path a distance `strokeRadius` from this path.
230
244
  *
@@ -220,6 +220,10 @@ export class Rect2 extends Abstract2DShape {
220
220
  return Math.max(this.w, this.h);
221
221
  }
222
222
 
223
+ public get minDimension() {
224
+ return Math.min(this.w, this.h);
225
+ }
226
+
223
227
  public get bottomRight() {
224
228
  return this.topLeft.plus(this.size);
225
229
  }