@js-draw/math 1.22.0 → 1.24.1
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/dist/cjs/Color4.d.ts +24 -1
- package/dist/cjs/Color4.js +33 -1
- package/dist/cjs/Mat33.d.ts +20 -0
- package/dist/cjs/Mat33.js +23 -1
- package/dist/cjs/Vec3.d.ts +14 -5
- package/dist/cjs/Vec3.js +11 -2
- package/dist/cjs/lib.d.ts +3 -0
- package/dist/cjs/lib.js +3 -0
- package/dist/cjs/rounding/cleanUpNumber.js +1 -1
- package/dist/cjs/shapes/BezierJSWrapper.d.ts +9 -1
- package/dist/cjs/shapes/BezierJSWrapper.js +2 -0
- package/dist/cjs/shapes/Path.d.ts +1 -0
- package/dist/cjs/shapes/Path.js +1 -0
- package/dist/cjs/shapes/QuadraticBezier.d.ts +19 -2
- package/dist/cjs/shapes/QuadraticBezier.js +26 -3
- package/dist/cjs/shapes/Rect2.d.ts +13 -0
- package/dist/cjs/shapes/Rect2.js +22 -1
- package/dist/mjs/Color4.d.ts +24 -1
- package/dist/mjs/Color4.mjs +33 -1
- package/dist/mjs/Mat33.d.ts +20 -0
- package/dist/mjs/Mat33.mjs +23 -1
- package/dist/mjs/Vec3.d.ts +14 -5
- package/dist/mjs/Vec3.mjs +11 -2
- package/dist/mjs/lib.d.ts +3 -0
- package/dist/mjs/lib.mjs +3 -0
- package/dist/mjs/rounding/cleanUpNumber.mjs +1 -1
- package/dist/mjs/shapes/BezierJSWrapper.d.ts +9 -1
- package/dist/mjs/shapes/BezierJSWrapper.mjs +2 -0
- package/dist/mjs/shapes/Path.d.ts +1 -0
- package/dist/mjs/shapes/Path.mjs +1 -0
- package/dist/mjs/shapes/QuadraticBezier.d.ts +19 -2
- package/dist/mjs/shapes/QuadraticBezier.mjs +26 -3
- package/dist/mjs/shapes/Rect2.d.ts +13 -0
- package/dist/mjs/shapes/Rect2.mjs +22 -1
- package/dist-test/test_imports/test-require.cjs +1 -0
- package/package.json +3 -3
- package/src/Color4.test.ts +5 -0
- package/src/Color4.ts +39 -1
- package/src/Mat33.fromCSSMatrix.test.ts +4 -1
- package/src/Mat33.test.ts +6 -6
- package/src/Mat33.ts +23 -1
- package/src/Vec3.ts +14 -5
- package/src/lib.ts +3 -0
- package/src/rounding/cleanUpNumber.test.ts +2 -0
- package/src/rounding/cleanUpNumber.ts +1 -1
- package/src/shapes/BezierJSWrapper.ts +11 -4
- package/src/shapes/Path.ts +1 -0
- package/src/shapes/QuadraticBezier.ts +22 -2
- package/src/shapes/Rect2.ts +17 -0
@@ -4,6 +4,11 @@ import LineSegment2 from './LineSegment2';
|
|
4
4
|
import Rect2 from './Rect2';
|
5
5
|
import Parameterized2DShape from './Parameterized2DShape';
|
6
6
|
|
7
|
+
// The typings for Bezier are incorrect in some cases:
|
8
|
+
interface CorrectedBezierType extends Bezier {
|
9
|
+
dderivative(t: number): { x: number; y: number };
|
10
|
+
}
|
11
|
+
|
7
12
|
/**
|
8
13
|
* A lazy-initializing wrapper around Bezier-js.
|
9
14
|
*
|
@@ -14,13 +19,13 @@ import Parameterized2DShape from './Parameterized2DShape';
|
|
14
19
|
* @internal
|
15
20
|
*/
|
16
21
|
export abstract class BezierJSWrapper extends Parameterized2DShape {
|
17
|
-
#bezierJs:
|
22
|
+
#bezierJs: CorrectedBezierType | null = null;
|
18
23
|
|
19
24
|
protected constructor(bezierJsBezier?: Bezier) {
|
20
25
|
super();
|
21
26
|
|
22
27
|
if (bezierJsBezier) {
|
23
|
-
this.#bezierJs = bezierJsBezier;
|
28
|
+
this.#bezierJs = bezierJsBezier as CorrectedBezierType;
|
24
29
|
}
|
25
30
|
}
|
26
31
|
|
@@ -29,7 +34,7 @@ export abstract class BezierJSWrapper extends Parameterized2DShape {
|
|
29
34
|
|
30
35
|
protected getBezier() {
|
31
36
|
if (!this.#bezierJs) {
|
32
|
-
this.#bezierJs = new Bezier(this.getPoints().map((p) => p.xy));
|
37
|
+
this.#bezierJs = new Bezier(this.getPoints().map((p) => p.xy)) as CorrectedBezierType;
|
33
38
|
}
|
34
39
|
return this.#bezierJs;
|
35
40
|
}
|
@@ -56,14 +61,16 @@ export abstract class BezierJSWrapper extends Parameterized2DShape {
|
|
56
61
|
return Vec2.ofXY(this.getBezier().get(t));
|
57
62
|
}
|
58
63
|
|
64
|
+
/** @returns the curve's directional derivative at `t`. */
|
59
65
|
public derivativeAt(t: number): Point2 {
|
60
66
|
return Vec2.ofXY(this.getBezier().derivative(t));
|
61
67
|
}
|
62
68
|
|
63
69
|
public secondDerivativeAt(t: number): Point2 {
|
64
|
-
return Vec2.ofXY(
|
70
|
+
return Vec2.ofXY(this.getBezier().dderivative(t));
|
65
71
|
}
|
66
72
|
|
73
|
+
/** @returns the [normal vector](https://en.wikipedia.org/wiki/Normal_(geometry)) to this curve at `t`. */
|
67
74
|
public normal(t: number): Vec2 {
|
68
75
|
return Vec2.ofXY(this.getBezier().normal(t));
|
69
76
|
}
|
package/src/shapes/Path.ts
CHANGED
@@ -11,6 +11,7 @@ import Parameterized2DShape from './Parameterized2DShape';
|
|
11
11
|
import BezierJSWrapper from './BezierJSWrapper';
|
12
12
|
import convexHull2Of from '../utils/convexHull2Of';
|
13
13
|
|
14
|
+
/** Identifiers for different path commands. These commands can make up a {@link Path}. */
|
14
15
|
export enum PathCommandType {
|
15
16
|
LineTo,
|
16
17
|
MoveTo,
|
@@ -4,14 +4,34 @@ import BezierJSWrapper from './BezierJSWrapper';
|
|
4
4
|
import Rect2 from './Rect2';
|
5
5
|
|
6
6
|
/**
|
7
|
-
* Represents a 2D Bézier curve.
|
7
|
+
* Represents a 2D [Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve).
|
8
8
|
*
|
9
|
-
*
|
9
|
+
* Example:
|
10
|
+
* ```ts,runnable,console
|
11
|
+
* import { QuadraticBezier, Vec2 } from '@js-draw/math';
|
12
|
+
*
|
13
|
+
* const startPoint = Vec2.of(4, 3);
|
14
|
+
* const controlPoint = Vec2.of(1, 1);
|
15
|
+
* const endPoint = Vec2.of(1, 3);
|
16
|
+
*
|
17
|
+
* const curve = new QuadraticBezier(
|
18
|
+
* startPoint,
|
19
|
+
* controlPoint,
|
20
|
+
* endPoint,
|
21
|
+
* );
|
22
|
+
*
|
23
|
+
* console.log('Curve:', curve);
|
24
|
+
* ```
|
25
|
+
*
|
26
|
+
* **Note**: Some Bézier operations internally use the `bezier-js` library.
|
10
27
|
*/
|
11
28
|
export class QuadraticBezier extends BezierJSWrapper {
|
12
29
|
public constructor(
|
30
|
+
// Start point
|
13
31
|
public readonly p0: Point2,
|
32
|
+
// Control point
|
14
33
|
public readonly p1: Point2,
|
34
|
+
// End point
|
15
35
|
public readonly p2: Point2,
|
16
36
|
) {
|
17
37
|
super();
|
package/src/shapes/Rect2.ts
CHANGED
@@ -17,6 +17,18 @@ export interface RectTemplate {
|
|
17
17
|
/**
|
18
18
|
* Represents a rectangle in 2D space, parallel to the XY axes.
|
19
19
|
*
|
20
|
+
* **Example**:
|
21
|
+
* ```ts,runnable,console
|
22
|
+
* import { Rect2, Vec2 } from '@js-draw/math';
|
23
|
+
*
|
24
|
+
* const rect = Rect2.fromCorners(
|
25
|
+
* Vec2.of(0, 0),
|
26
|
+
* Vec2.of(10, 10),
|
27
|
+
* );
|
28
|
+
* console.log('area', rect.area);
|
29
|
+
* console.log('topLeft', rect.topLeft);
|
30
|
+
* ```
|
31
|
+
*
|
20
32
|
* `invariant: w ≥ 0, h ≥ 0, immutable`
|
21
33
|
*/
|
22
34
|
export class Rect2 extends Abstract2DShape {
|
@@ -28,9 +40,13 @@ export class Rect2 extends Abstract2DShape {
|
|
28
40
|
public readonly area: number;
|
29
41
|
|
30
42
|
public constructor(
|
43
|
+
// Top left x coordinate
|
31
44
|
public readonly x: number,
|
45
|
+
// Top left y coordinate
|
32
46
|
public readonly y: number,
|
47
|
+
// Width
|
33
48
|
public readonly w: number,
|
49
|
+
// Height
|
34
50
|
public readonly h: number,
|
35
51
|
) {
|
36
52
|
super();
|
@@ -69,6 +85,7 @@ export class Rect2 extends Abstract2DShape {
|
|
69
85
|
);
|
70
86
|
}
|
71
87
|
|
88
|
+
/** @returns true iff `other` is completely within this `Rect2`. */
|
72
89
|
public containsRect(other: Rect2): boolean {
|
73
90
|
return (
|
74
91
|
this.x <= other.x &&
|