@immugio/three-math-extensions 0.0.16 → 0.1.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/CHANGELOG.md +16 -1
- package/cjs/Polygon.js +88 -0
- package/cjs/Size2.js +12 -0
- package/cjs/Vec2.js +1 -1
- package/cjs/Vec3.js +1 -1
- package/esm/Polygon.js +84 -0
- package/esm/Size2.js +8 -0
- package/esm/Vec2.js +1 -1
- package/esm/Vec3.js +1 -1
- package/package.json +1 -1
- package/src/Polygon.ts +99 -0
- package/src/Size2.ts +4 -0
- package/src/Vec2.ts +1 -1
- package/src/Vec3.ts +1 -1
- package/types/Polygon.d.ts +22 -0
- package/types/Size2.d.ts +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
9
9
|
|
|
10
|
-
## [0.0
|
|
10
|
+
## [0.1.0](https://github.com/Immugio/three-math-extensions/compare/16.15.10...0.1.0)
|
|
11
|
+
|
|
12
|
+
### Commits
|
|
13
|
+
|
|
14
|
+
- Add Polygon [`629cff8`](https://github.com/Immugio/three-math-extensions/commit/629cff8ecbb963477e8ea76d7f8b16d95435cbad)
|
|
15
|
+
- Vec2.fromPoint and Vec3.fromPoint should accept null [`4b871af`](https://github.com/Immugio/three-math-extensions/commit/4b871af297bdcbe8584f1e2b99d602247b77687c)
|
|
16
|
+
|
|
17
|
+
## [16.15.10](https://github.com/Immugio/three-math-extensions/compare/0.0.17...16.15.10) - 2023-01-02
|
|
18
|
+
|
|
19
|
+
## [0.0.17](https://github.com/Immugio/three-math-extensions/compare/0.0.16...0.0.17) - 2023-01-02
|
|
20
|
+
|
|
21
|
+
### Commits
|
|
22
|
+
|
|
23
|
+
- Vec2.fromPoint and Vec3.fromPoint should accept null [`4b871af`](https://github.com/Immugio/three-math-extensions/commit/4b871af297bdcbe8584f1e2b99d602247b77687c)
|
|
24
|
+
|
|
25
|
+
## [0.0.16](https://github.com/Immugio/three-math-extensions/compare/0.0.15...0.0.16) - 2022-12-28
|
|
11
26
|
|
|
12
27
|
### Commits
|
|
13
28
|
|
package/cjs/Polygon.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Polygon = void 0;
|
|
4
|
+
const Vec2_1 = require("./Vec2");
|
|
5
|
+
const Size2_1 = require("./Size2");
|
|
6
|
+
class Polygon {
|
|
7
|
+
contour;
|
|
8
|
+
holes;
|
|
9
|
+
constructor(contour, holes) {
|
|
10
|
+
this.contour = contour;
|
|
11
|
+
this.holes = holes;
|
|
12
|
+
}
|
|
13
|
+
static fromPoints(contour, holes) {
|
|
14
|
+
return new Polygon(contour.map(p => Vec2_1.Vec2.fromPoint(p)), holes?.map(h => h.map(p => Vec2_1.Vec2.fromPoint(p))));
|
|
15
|
+
}
|
|
16
|
+
get size() {
|
|
17
|
+
const { minX, maxX, minY, maxY } = this.boundingBox();
|
|
18
|
+
return new Size2_1.Size2(maxX - minX, maxY - minY);
|
|
19
|
+
}
|
|
20
|
+
centerOnOrigin() {
|
|
21
|
+
const center = this.center();
|
|
22
|
+
function centerPoints(points) {
|
|
23
|
+
for (const point of points) {
|
|
24
|
+
point.x -= center.x;
|
|
25
|
+
point.y -= center.y;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
centerPoints(this.contour);
|
|
29
|
+
for (const hole of this.holes || []) {
|
|
30
|
+
centerPoints(hole);
|
|
31
|
+
}
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
center() {
|
|
35
|
+
const { minX, maxX, minY, maxY } = this.boundingBox();
|
|
36
|
+
const x = (maxX + minX) / 2;
|
|
37
|
+
const y = (maxY + minY) / 2;
|
|
38
|
+
return new Vec2_1.Vec2(x, y);
|
|
39
|
+
}
|
|
40
|
+
ensureLastPoint() {
|
|
41
|
+
function ensure(points) {
|
|
42
|
+
if (points[0].x !== points.at(-1).x || points[0].y !== points.at(-1).y) {
|
|
43
|
+
points.push(points[0].clone());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
ensure(this.contour);
|
|
47
|
+
for (const hole of this.holes || []) {
|
|
48
|
+
ensure(hole);
|
|
49
|
+
}
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
boundingBox() {
|
|
53
|
+
let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
|
|
54
|
+
for (const p of this.contour) {
|
|
55
|
+
if (minX > p.x)
|
|
56
|
+
minX = p.x;
|
|
57
|
+
if (maxX < p.x)
|
|
58
|
+
maxX = p.x;
|
|
59
|
+
if (minY > p.y)
|
|
60
|
+
minY = p.y;
|
|
61
|
+
if (maxY < p.y)
|
|
62
|
+
maxY = p.y;
|
|
63
|
+
}
|
|
64
|
+
return { minX, maxX, minY, maxY };
|
|
65
|
+
}
|
|
66
|
+
toBoundingPolygon() {
|
|
67
|
+
const bounding = this.boundingBox();
|
|
68
|
+
return new Polygon([
|
|
69
|
+
new Vec2_1.Vec2(bounding.minX, bounding.minY),
|
|
70
|
+
new Vec2_1.Vec2(bounding.maxX, bounding.minY),
|
|
71
|
+
new Vec2_1.Vec2(bounding.maxX, bounding.maxY),
|
|
72
|
+
new Vec2_1.Vec2(bounding.minX, bounding.maxY),
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
flip() {
|
|
76
|
+
const centerX = this.center().x;
|
|
77
|
+
this.flipSingle(centerX, this.contour);
|
|
78
|
+
this.holes?.forEach(hole => this.flipSingle(centerX, hole));
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
flipSingle(centerX, poly) {
|
|
82
|
+
for (const point of poly) {
|
|
83
|
+
const xDistanceToCenter = Math.abs(centerX - point.x);
|
|
84
|
+
point.x = point.x < centerX ? centerX + xDistanceToCenter : centerX - xDistanceToCenter;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.Polygon = Polygon;
|
package/cjs/Size2.js
ADDED
package/cjs/Vec2.js
CHANGED
|
@@ -13,7 +13,7 @@ class Vec2 extends three_1.Vector2 {
|
|
|
13
13
|
* @returns A new Vec2 instance.
|
|
14
14
|
*/
|
|
15
15
|
static fromPoint(point) {
|
|
16
|
-
return new Vec2(point
|
|
16
|
+
return new Vec2(point?.x, point?.y);
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Moves this Vec2 instance towards the target Vec2 by the given amount.
|
package/cjs/Vec3.js
CHANGED
|
@@ -14,7 +14,7 @@ class Vec3 extends three_1.Vector3 {
|
|
|
14
14
|
* @returns A new Vec3 instance.
|
|
15
15
|
*/
|
|
16
16
|
static fromPoint(point) {
|
|
17
|
-
return new Vec3(point
|
|
17
|
+
return new Vec3(point?.x, point?.y, point?.z);
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* Moves this Vec3 instance towards the target Vec3 by the given amount.
|
package/esm/Polygon.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Vec2 } from "./Vec2";
|
|
2
|
+
import { Size2 } from "./Size2";
|
|
3
|
+
export class Polygon {
|
|
4
|
+
contour;
|
|
5
|
+
holes;
|
|
6
|
+
constructor(contour, holes) {
|
|
7
|
+
this.contour = contour;
|
|
8
|
+
this.holes = holes;
|
|
9
|
+
}
|
|
10
|
+
static fromPoints(contour, holes) {
|
|
11
|
+
return new Polygon(contour.map(p => Vec2.fromPoint(p)), holes?.map(h => h.map(p => Vec2.fromPoint(p))));
|
|
12
|
+
}
|
|
13
|
+
get size() {
|
|
14
|
+
const { minX, maxX, minY, maxY } = this.boundingBox();
|
|
15
|
+
return new Size2(maxX - minX, maxY - minY);
|
|
16
|
+
}
|
|
17
|
+
centerOnOrigin() {
|
|
18
|
+
const center = this.center();
|
|
19
|
+
function centerPoints(points) {
|
|
20
|
+
for (const point of points) {
|
|
21
|
+
point.x -= center.x;
|
|
22
|
+
point.y -= center.y;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
centerPoints(this.contour);
|
|
26
|
+
for (const hole of this.holes || []) {
|
|
27
|
+
centerPoints(hole);
|
|
28
|
+
}
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
center() {
|
|
32
|
+
const { minX, maxX, minY, maxY } = this.boundingBox();
|
|
33
|
+
const x = (maxX + minX) / 2;
|
|
34
|
+
const y = (maxY + minY) / 2;
|
|
35
|
+
return new Vec2(x, y);
|
|
36
|
+
}
|
|
37
|
+
ensureLastPoint() {
|
|
38
|
+
function ensure(points) {
|
|
39
|
+
if (points[0].x !== points.at(-1).x || points[0].y !== points.at(-1).y) {
|
|
40
|
+
points.push(points[0].clone());
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
ensure(this.contour);
|
|
44
|
+
for (const hole of this.holes || []) {
|
|
45
|
+
ensure(hole);
|
|
46
|
+
}
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
boundingBox() {
|
|
50
|
+
let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
|
|
51
|
+
for (const p of this.contour) {
|
|
52
|
+
if (minX > p.x)
|
|
53
|
+
minX = p.x;
|
|
54
|
+
if (maxX < p.x)
|
|
55
|
+
maxX = p.x;
|
|
56
|
+
if (minY > p.y)
|
|
57
|
+
minY = p.y;
|
|
58
|
+
if (maxY < p.y)
|
|
59
|
+
maxY = p.y;
|
|
60
|
+
}
|
|
61
|
+
return { minX, maxX, minY, maxY };
|
|
62
|
+
}
|
|
63
|
+
toBoundingPolygon() {
|
|
64
|
+
const bounding = this.boundingBox();
|
|
65
|
+
return new Polygon([
|
|
66
|
+
new Vec2(bounding.minX, bounding.minY),
|
|
67
|
+
new Vec2(bounding.maxX, bounding.minY),
|
|
68
|
+
new Vec2(bounding.maxX, bounding.maxY),
|
|
69
|
+
new Vec2(bounding.minX, bounding.maxY),
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
flip() {
|
|
73
|
+
const centerX = this.center().x;
|
|
74
|
+
this.flipSingle(centerX, this.contour);
|
|
75
|
+
this.holes?.forEach(hole => this.flipSingle(centerX, hole));
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
flipSingle(centerX, poly) {
|
|
79
|
+
for (const point of poly) {
|
|
80
|
+
const xDistanceToCenter = Math.abs(centerX - point.x);
|
|
81
|
+
point.x = point.x < centerX ? centerX + xDistanceToCenter : centerX - xDistanceToCenter;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
package/esm/Size2.js
ADDED
package/esm/Vec2.js
CHANGED
|
@@ -10,7 +10,7 @@ export class Vec2 extends Vector2 {
|
|
|
10
10
|
* @returns A new Vec2 instance.
|
|
11
11
|
*/
|
|
12
12
|
static fromPoint(point) {
|
|
13
|
-
return new Vec2(point
|
|
13
|
+
return new Vec2(point?.x, point?.y);
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Moves this Vec2 instance towards the target Vec2 by the given amount.
|
package/esm/Vec3.js
CHANGED
|
@@ -11,7 +11,7 @@ export class Vec3 extends Vector3 {
|
|
|
11
11
|
* @returns A new Vec3 instance.
|
|
12
12
|
*/
|
|
13
13
|
static fromPoint(point) {
|
|
14
|
-
return new Vec3(point
|
|
14
|
+
return new Vec3(point?.x, point?.y, point?.z);
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* Moves this Vec3 instance towards the target Vec3 by the given amount.
|
package/package.json
CHANGED
package/src/Polygon.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Point2 } from "./Point2";
|
|
2
|
+
import { Vec2 } from "./Vec2";
|
|
3
|
+
import { Size2 } from "./Size2";
|
|
4
|
+
|
|
5
|
+
export class Polygon {
|
|
6
|
+
|
|
7
|
+
constructor(public contour: Vec2[], public holes?: Vec2[][]) {
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public static fromPoints(contour: Point2[], holes?: Point2[][]) {
|
|
11
|
+
return new Polygon(contour.map(p => Vec2.fromPoint(p)), holes?.map(h => h.map(p => Vec2.fromPoint(p))));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public get size(): Size2 {
|
|
15
|
+
const {minX, maxX, minY, maxY} = this.boundingBox();
|
|
16
|
+
return new Size2(maxX - minX, maxY - minY);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public centerOnOrigin(): Polygon {
|
|
20
|
+
const center = this.center();
|
|
21
|
+
|
|
22
|
+
function centerPoints(points: Vec2[]): void {
|
|
23
|
+
for (const point of points) {
|
|
24
|
+
point.x -= center.x;
|
|
25
|
+
point.y -= center.y;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
centerPoints(this.contour);
|
|
30
|
+
|
|
31
|
+
for (const hole of this.holes || []) {
|
|
32
|
+
centerPoints(hole);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public center(): Vec2 {
|
|
39
|
+
const {minX, maxX, minY, maxY} = this.boundingBox();
|
|
40
|
+
|
|
41
|
+
const x = (maxX + minX) / 2;
|
|
42
|
+
const y = (maxY + minY) / 2;
|
|
43
|
+
|
|
44
|
+
return new Vec2(x, y);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public ensureLastPoint(): Polygon {
|
|
48
|
+
function ensure(points: Vec2[]): void {
|
|
49
|
+
if (points[0].x !== points.at(-1).x || points[0].y !== points.at(-1).y) {
|
|
50
|
+
points.push(points[0].clone());
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
ensure(this.contour);
|
|
55
|
+
|
|
56
|
+
for (const hole of this.holes || []) {
|
|
57
|
+
ensure(hole);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public boundingBox(): { minX: number, maxX: number, minY: number, maxY: number } {
|
|
64
|
+
let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
|
|
65
|
+
|
|
66
|
+
for (const p of this.contour) {
|
|
67
|
+
if (minX > p.x) minX = p.x;
|
|
68
|
+
if (maxX < p.x) maxX = p.x;
|
|
69
|
+
if (minY > p.y) minY = p.y;
|
|
70
|
+
if (maxY < p.y) maxY = p.y;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {minX, maxX, minY, maxY};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public toBoundingPolygon(): Polygon {
|
|
77
|
+
const bounding = this.boundingBox();
|
|
78
|
+
return new Polygon([
|
|
79
|
+
new Vec2(bounding.minX, bounding.minY),
|
|
80
|
+
new Vec2(bounding.maxX, bounding.minY),
|
|
81
|
+
new Vec2(bounding.maxX, bounding.maxY),
|
|
82
|
+
new Vec2(bounding.minX, bounding.maxY),
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public flip(): Polygon {
|
|
87
|
+
const centerX = this.center().x;
|
|
88
|
+
this.flipSingle(centerX, this.contour);
|
|
89
|
+
this.holes?.forEach(hole => this.flipSingle(centerX, hole));
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private flipSingle(centerX: number, poly: Vec2[]) {
|
|
94
|
+
for (const point of poly) {
|
|
95
|
+
const xDistanceToCenter = Math.abs(centerX - point.x);
|
|
96
|
+
point.x = point.x < centerX ? centerX + xDistanceToCenter : centerX - xDistanceToCenter;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/Size2.ts
ADDED
package/src/Vec2.ts
CHANGED
package/src/Vec3.ts
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Point2 } from "./Point2";
|
|
2
|
+
import { Vec2 } from "./Vec2";
|
|
3
|
+
import { Size2 } from "./Size2";
|
|
4
|
+
export declare class Polygon {
|
|
5
|
+
contour: Vec2[];
|
|
6
|
+
holes?: Vec2[][];
|
|
7
|
+
constructor(contour: Vec2[], holes?: Vec2[][]);
|
|
8
|
+
static fromPoints(contour: Point2[], holes?: Point2[][]): Polygon;
|
|
9
|
+
get size(): Size2;
|
|
10
|
+
centerOnOrigin(): Polygon;
|
|
11
|
+
center(): Vec2;
|
|
12
|
+
ensureLastPoint(): Polygon;
|
|
13
|
+
boundingBox(): {
|
|
14
|
+
minX: number;
|
|
15
|
+
maxX: number;
|
|
16
|
+
minY: number;
|
|
17
|
+
maxY: number;
|
|
18
|
+
};
|
|
19
|
+
toBoundingPolygon(): Polygon;
|
|
20
|
+
flip(): Polygon;
|
|
21
|
+
private flipSingle;
|
|
22
|
+
}
|