plotboilerplate 1.28.1 → 1.30.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/README.md +8 -0
- package/dist/index.esm.js +527 -53
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/plotboilerplate.browser.min.js +1 -1
- package/dist/plotboilerplate.browser.min.js.map +1 -1
- package/dist/plotboilerplate.js +528 -51
- package/dist/plotboilerplate.min.js +1 -1
- package/package.json +1 -1
- package/src/cjs/Circle.d.ts +86 -3
- package/src/cjs/Circle.js +179 -4
- package/src/cjs/Circle.js.map +1 -1
- package/src/cjs/CubicBezierCurve.d.ts +34 -3
- package/src/cjs/CubicBezierCurve.js +79 -12
- package/src/cjs/CubicBezierCurve.js.map +1 -1
- package/src/cjs/Line.d.ts +46 -1
- package/src/cjs/Line.js +80 -1
- package/src/cjs/Line.js.map +1 -1
- package/src/cjs/Triangle.d.ts +40 -4
- package/src/cjs/Triangle.js +127 -31
- package/src/cjs/Triangle.js.map +1 -1
- package/src/cjs/VertTuple.d.ts +16 -2
- package/src/cjs/VertTuple.js +20 -2
- package/src/cjs/VertTuple.js.map +1 -1
- package/src/cjs/Vertex.d.ts +25 -2
- package/src/cjs/Vertex.js +43 -1
- package/src/cjs/Vertex.js.map +1 -1
- package/src/cjs/utils/algorithms/minimalContainingCircleFromPoints.d.ts +21 -0
- package/src/cjs/utils/algorithms/minimalContainingCircleFromPoints.js +73 -0
- package/src/cjs/utils/algorithms/minimalContainingCircleFromPoints.js.map +1 -0
- package/src/cjs/utils/algorithms/minimalEnclosingCircleFromPoints.d.ts +21 -0
- package/src/cjs/utils/algorithms/minimalEnclosingCircleFromPoints.js +73 -0
- package/src/cjs/utils/algorithms/minimalEnclosingCircleFromPoints.js.map +1 -0
- package/src/cjs/utils/algorithms/pointsMinimalContainingCircle.d.ts +21 -0
- package/src/cjs/utils/algorithms/pointsMinimalContainingCircle.js +73 -0
- package/src/cjs/utils/algorithms/pointsMinimalContainingCircle.js.map +1 -0
- package/src/cjs/utils/algorithms/solveApollonius3.d.ts +69 -0
- package/src/cjs/utils/algorithms/solveApollonius3.js +118 -0
- package/src/cjs/utils/algorithms/solveApollonius3.js.map +1 -0
- package/src/esm/Circle.d.ts +86 -3
- package/src/esm/Circle.js +179 -4
- package/src/esm/Circle.js.map +1 -1
- package/src/esm/CubicBezierCurve.d.ts +34 -3
- package/src/esm/CubicBezierCurve.js +79 -12
- package/src/esm/CubicBezierCurve.js.map +1 -1
- package/src/esm/Line.d.ts +46 -1
- package/src/esm/Line.js +80 -1
- package/src/esm/Line.js.map +1 -1
- package/src/esm/Triangle.d.ts +40 -4
- package/src/esm/Triangle.js +128 -32
- package/src/esm/Triangle.js.map +1 -1
- package/src/esm/VertTuple.d.ts +16 -2
- package/src/esm/VertTuple.js +20 -2
- package/src/esm/VertTuple.js.map +1 -1
- package/src/esm/Vertex.d.ts +25 -2
- package/src/esm/Vertex.js +44 -2
- package/src/esm/Vertex.js.map +1 -1
- package/src/esm/utils/algorithms/minimalContainingCircleFromPoints.d.ts +21 -0
- package/src/esm/utils/algorithms/minimalContainingCircleFromPoints.js +69 -0
- package/src/esm/utils/algorithms/minimalContainingCircleFromPoints.js.map +1 -0
- package/src/esm/utils/algorithms/minimalEnclosingCircleFromPoints.d.ts +21 -0
- package/src/esm/utils/algorithms/minimalEnclosingCircleFromPoints.js +69 -0
- package/src/esm/utils/algorithms/minimalEnclosingCircleFromPoints.js.map +1 -0
- package/src/esm/utils/algorithms/pointsMinimalContainingCircle.d.ts +21 -0
- package/src/esm/utils/algorithms/pointsMinimalContainingCircle.js +69 -0
- package/src/esm/utils/algorithms/pointsMinimalContainingCircle.js.map +1 -0
- package/src/esm/utils/algorithms/solveApollonius3.d.ts +69 -0
- package/src/esm/utils/algorithms/solveApollonius3.js +114 -0
- package/src/esm/utils/algorithms/solveApollonius3.js.map +1 -0
- package/src/index-gl.js +6 -4
- package/src/index.js +25 -17
- package/src/ts/Circle.ts +200 -5
- package/src/ts/CubicBezierCurve.ts +133 -48
- package/src/ts/Line.ts +84 -1
- package/src/ts/Triangle.ts +148 -41
- package/src/ts/VertTuple.ts +29 -2
- package/src/ts/Vertex.ts +44 -2
- package/src/ts/utils/algorithms/minimalEnclosingCircleFromPoints.ts +69 -0
- package/src/ts/utils/algorithms/solveApollonius3.ts +132 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate the minimal containing circle from a set of points.
|
|
3
|
+
*
|
|
4
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
5
|
+
*
|
|
6
|
+
* Inspired by https://github.com/rowanwins/smallest-enclosing-circle.
|
|
7
|
+
*
|
|
8
|
+
* @param {XYCoords[]} points
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
import { Circle } from "../../Circle";
|
|
12
|
+
import { Triangle } from "../../Triangle";
|
|
13
|
+
import { VertTuple } from "../../VertTuple";
|
|
14
|
+
import { Vertex } from "../../Vertex";
|
|
15
|
+
/**
|
|
16
|
+
* Calculate the minimal containing circle from a set of points.
|
|
17
|
+
*
|
|
18
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
19
|
+
*
|
|
20
|
+
* @param {XYCoords[]} points
|
|
21
|
+
* @returns {Circle | null} The minimal containing circle or null if the point count is lower than 2.
|
|
22
|
+
*/
|
|
23
|
+
export const minimalContainingCircleFromPoints = (points) => {
|
|
24
|
+
if (points.length <= 1) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const circleObject = wetzlsAlgorithm(points);
|
|
28
|
+
return new Circle(new Vertex(circleObject.center.x, circleObject.center.y), circleObject.radius);
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* This initiates the actual algorithm but return a shallow circle representation.
|
|
32
|
+
*
|
|
33
|
+
* @param points
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
36
|
+
const wetzlsAlgorithm = (points) => {
|
|
37
|
+
return minimumContainingCircle(points, points.length, [], 0);
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Pre: points.length >= 2
|
|
41
|
+
* @param {Vertex[]} points
|
|
42
|
+
* @param n
|
|
43
|
+
* @param boundary
|
|
44
|
+
* @param boundaryLength
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
const minimumContainingCircle = (points, n, boundary, boundaryLength) => {
|
|
48
|
+
if (boundaryLength === 3) {
|
|
49
|
+
return Triangle.utils.calcCircumcircle(boundary[0], boundary[1], boundary[2]);
|
|
50
|
+
}
|
|
51
|
+
else if (n === 1 && boundaryLength === 0) {
|
|
52
|
+
return { center: { x: points[0].x, y: points[0].y }, radius: 0 };
|
|
53
|
+
}
|
|
54
|
+
else if (n === 0 && boundaryLength === 2) {
|
|
55
|
+
return VertTuple.vtutils.calcCircumcircle(boundary[0], boundary[1]);
|
|
56
|
+
}
|
|
57
|
+
else if (n === 1 && boundaryLength === 1) {
|
|
58
|
+
return VertTuple.vtutils.calcCircumcircle(boundary[0], points[0]);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const localCircle = minimumContainingCircle(points, n - 1, boundary, boundaryLength);
|
|
62
|
+
if (!Circle.circleUtils.containsPoint(localCircle.center, localCircle.radius, points[n - 1])) {
|
|
63
|
+
boundary[boundaryLength++] = points[n - 1];
|
|
64
|
+
return minimumContainingCircle(points, n - 1, boundary, boundaryLength);
|
|
65
|
+
}
|
|
66
|
+
return localCircle;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=minimalContainingCircleFromPoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimalContainingCircleFromPoints.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/minimalContainingCircleFromPoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAW,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,MAAkB,EAAiB,EAAE;IACrF,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAkB,EAAE;IAC7D,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,uBAAuB,GAAG,CAAC,MAAkB,EAAE,CAAS,EAAE,QAAoB,EAAE,cAAsB,EAAW,EAAE;IACvH,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAY,uBAAuB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC9F,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7F,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO,uBAAuB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate the minimal containing circle from a set of points.
|
|
3
|
+
*
|
|
4
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
5
|
+
*
|
|
6
|
+
* Inspired by https://github.com/rowanwins/smallest-enclosing-circle.
|
|
7
|
+
*
|
|
8
|
+
* @param {XYCoords[]} points
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
import { Circle } from "../../Circle";
|
|
12
|
+
import { XYCoords } from "../../interfaces";
|
|
13
|
+
/**
|
|
14
|
+
* Calculate the minimal containing circle from a set of points.
|
|
15
|
+
*
|
|
16
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
17
|
+
*
|
|
18
|
+
* @param {XYCoords[]} points
|
|
19
|
+
* @returns {Circle | null} The minimal containing circle or null if the point count is lower than 2.
|
|
20
|
+
*/
|
|
21
|
+
export declare const minimalEnclosingCircleFromPoints: (points: XYCoords[]) => Circle | null;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate the minimal containing circle from a set of points.
|
|
3
|
+
*
|
|
4
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
5
|
+
*
|
|
6
|
+
* Inspired by https://github.com/rowanwins/smallest-enclosing-circle.
|
|
7
|
+
*
|
|
8
|
+
* @param {XYCoords[]} points
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
import { Circle } from "../../Circle";
|
|
12
|
+
import { Triangle } from "../../Triangle";
|
|
13
|
+
import { VertTuple } from "../../VertTuple";
|
|
14
|
+
import { Vertex } from "../../Vertex";
|
|
15
|
+
/**
|
|
16
|
+
* Calculate the minimal containing circle from a set of points.
|
|
17
|
+
*
|
|
18
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
19
|
+
*
|
|
20
|
+
* @param {XYCoords[]} points
|
|
21
|
+
* @returns {Circle | null} The minimal containing circle or null if the point count is lower than 2.
|
|
22
|
+
*/
|
|
23
|
+
export const minimalEnclosingCircleFromPoints = (points) => {
|
|
24
|
+
if (points.length <= 1) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const circleObject = wetzlsAlgorithm(points);
|
|
28
|
+
return new Circle(new Vertex(circleObject.center.x, circleObject.center.y), circleObject.radius);
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* This initiates the actual algorithm but return a shallow circle representation.
|
|
32
|
+
*
|
|
33
|
+
* @param points
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
36
|
+
const wetzlsAlgorithm = (points) => {
|
|
37
|
+
return minimumContainingCircle(points, points.length, [], 0);
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Pre: points.length >= 2
|
|
41
|
+
* @param {Vertex[]} points
|
|
42
|
+
* @param n
|
|
43
|
+
* @param boundary
|
|
44
|
+
* @param boundaryLength
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
const minimumContainingCircle = (points, n, boundary, boundaryLength) => {
|
|
48
|
+
if (boundaryLength === 3) {
|
|
49
|
+
return Triangle.utils.calcCircumcircle(boundary[0], boundary[1], boundary[2]);
|
|
50
|
+
}
|
|
51
|
+
else if (n === 1 && boundaryLength === 0) {
|
|
52
|
+
return { center: { x: points[0].x, y: points[0].y }, radius: 0 };
|
|
53
|
+
}
|
|
54
|
+
else if (n === 0 && boundaryLength === 2) {
|
|
55
|
+
return VertTuple.vtutils.calcCircumcircle(boundary[0], boundary[1]);
|
|
56
|
+
}
|
|
57
|
+
else if (n === 1 && boundaryLength === 1) {
|
|
58
|
+
return VertTuple.vtutils.calcCircumcircle(boundary[0], points[0]);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const localCircle = minimumContainingCircle(points, n - 1, boundary, boundaryLength);
|
|
62
|
+
if (!Circle.circleUtils.containsPoint(localCircle.center, localCircle.radius, points[n - 1])) {
|
|
63
|
+
boundary[boundaryLength++] = points[n - 1];
|
|
64
|
+
return minimumContainingCircle(points, n - 1, boundary, boundaryLength);
|
|
65
|
+
}
|
|
66
|
+
return localCircle;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=minimalEnclosingCircleFromPoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimalEnclosingCircleFromPoints.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/minimalEnclosingCircleFromPoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAW,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,MAAkB,EAAiB,EAAE;IACpF,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAkB,EAAE;IAC7D,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,uBAAuB,GAAG,CAAC,MAAkB,EAAE,CAAS,EAAE,QAAoB,EAAE,cAAsB,EAAW,EAAE;IACvH,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAY,uBAAuB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC9F,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7F,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO,uBAAuB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate the minimal containing circle from a set of points.
|
|
3
|
+
*
|
|
4
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
5
|
+
*
|
|
6
|
+
* Inspired by https://github.com/rowanwins/smallest-enclosing-circle.
|
|
7
|
+
*
|
|
8
|
+
* @param {XYCoords[]} points
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
import { Circle } from "../../Circle";
|
|
12
|
+
import { XYCoords } from "../../interfaces";
|
|
13
|
+
/**
|
|
14
|
+
* Calculate the minimal containing circle from a set of points.
|
|
15
|
+
*
|
|
16
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
17
|
+
*
|
|
18
|
+
* @param {XYCoords[]} points
|
|
19
|
+
* @returns {Circle | null} The minimal containing circle or null if the point count is lower than 2.
|
|
20
|
+
*/
|
|
21
|
+
export declare const pointsMinimalContainingCircle: (points: XYCoords[]) => Circle | null;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate the minimal containing circle from a set of points.
|
|
3
|
+
*
|
|
4
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
5
|
+
*
|
|
6
|
+
* Inspired by https://github.com/rowanwins/smallest-enclosing-circle.
|
|
7
|
+
*
|
|
8
|
+
* @param {XYCoords[]} points
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
import { Circle } from "../../Circle";
|
|
12
|
+
import { Triangle } from "../../Triangle";
|
|
13
|
+
import { VertTuple } from "../../VertTuple";
|
|
14
|
+
import { Vertex } from "../../Vertex";
|
|
15
|
+
/**
|
|
16
|
+
* Calculate the minimal containing circle from a set of points.
|
|
17
|
+
*
|
|
18
|
+
* The number of points must be at least 2. Otherwise the function returns null.
|
|
19
|
+
*
|
|
20
|
+
* @param {XYCoords[]} points
|
|
21
|
+
* @returns {Circle | null} The minimal containing circle or null if the point count is lower than 2.
|
|
22
|
+
*/
|
|
23
|
+
export const pointsMinimalContainingCircle = (points) => {
|
|
24
|
+
if (points.length <= 1) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const circleObject = wetzlsAlgorithm(points);
|
|
28
|
+
return new Circle(new Vertex(circleObject.center.x, circleObject.center.y), circleObject.radius);
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* This initiates the actual algorithm but return a shallow circle representation.
|
|
32
|
+
*
|
|
33
|
+
* @param points
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
36
|
+
const wetzlsAlgorithm = (points) => {
|
|
37
|
+
return minimumContainingCircle(points, points.length, [], 0);
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Pre: points.length >= 2
|
|
41
|
+
* @param {Vertex[]} points
|
|
42
|
+
* @param n
|
|
43
|
+
* @param boundary
|
|
44
|
+
* @param boundaryLength
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
const minimumContainingCircle = (points, n, boundary, boundaryLength) => {
|
|
48
|
+
if (boundaryLength === 3) {
|
|
49
|
+
return Triangle.utils.calcCircumcircle(boundary[0], boundary[1], boundary[2]);
|
|
50
|
+
}
|
|
51
|
+
else if (n === 1 && boundaryLength === 0) {
|
|
52
|
+
return { center: { x: points[0].x, y: points[0].y }, radius: 0 };
|
|
53
|
+
}
|
|
54
|
+
else if (n === 0 && boundaryLength === 2) {
|
|
55
|
+
return VertTuple.vtutils.calcCircumcircle(boundary[0], boundary[1]);
|
|
56
|
+
}
|
|
57
|
+
else if (n === 1 && boundaryLength === 1) {
|
|
58
|
+
return VertTuple.vtutils.calcCircumcircle(boundary[0], points[0]);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const localCircle = minimumContainingCircle(points, n - 1, boundary, boundaryLength);
|
|
62
|
+
if (!Circle.circleUtils.containsPoint(points[n - 1], localCircle)) {
|
|
63
|
+
boundary[boundaryLength++] = points[n - 1];
|
|
64
|
+
return minimumContainingCircle(points, n - 1, boundary, boundaryLength);
|
|
65
|
+
}
|
|
66
|
+
return localCircle;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=pointsMinimalContainingCircle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointsMinimalContainingCircle.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/pointsMinimalContainingCircle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAW,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,MAAkB,EAAiB,EAAE;IACjF,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAkB,EAAE;IAC7D,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,uBAAuB,GAAG,CAAC,MAAkB,EAAE,CAAS,EAAE,QAAoB,EAAE,cAAsB,EAAW,EAAE;IACvH,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAY,uBAAuB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC9F,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;YAClE,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO,uBAAuB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A solver for the Apollonian circle problem:
|
|
3
|
+
* find the circle that touches three other circles in extactly one point (each).
|
|
4
|
+
* The solution is not necesarily unique.
|
|
5
|
+
*
|
|
6
|
+
* For each of the three circles a boolean attribute can be passed that determines if the
|
|
7
|
+
* resultint circle should touch the input circle should be touched on the inside or outside.
|
|
8
|
+
*
|
|
9
|
+
* Not that there can be condition when the circle cannot be calculated (e.g. all circles
|
|
10
|
+
* have the same size and are colinear).
|
|
11
|
+
*
|
|
12
|
+
* Found at
|
|
13
|
+
* https://stackoverflow.com/questions/79281573/algorithm-for-finding-enclosing-circles-for-3-other-circles
|
|
14
|
+
*
|
|
15
|
+
* solveApollonius(Coord c1, Coord c2, Coord c3, int s1, int s2, int s3) {
|
|
16
|
+
// https://github.com/DIKU-Steiner/ProGAL/blob/master/src/ProGAL/geom2d/ApolloniusSolver.java
|
|
17
|
+
|
|
18
|
+
var x1 = c1.x;
|
|
19
|
+
var y1 = c1.y;
|
|
20
|
+
var r1 = c1.z;
|
|
21
|
+
var x2 = c2.x;
|
|
22
|
+
var y2 = c2.y;
|
|
23
|
+
var r2 = c2.z;
|
|
24
|
+
var x3 = c3.x;
|
|
25
|
+
var y3 = c3.y;
|
|
26
|
+
var r3 = c3.z;
|
|
27
|
+
|
|
28
|
+
// Currently optimized for fewest multiplications.
|
|
29
|
+
var v11 = 2 * x2 - 2 * x1;
|
|
30
|
+
var v12 = 2 * y2 - 2 * y1;
|
|
31
|
+
var v13 = x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2 - r1 * r1 + r2 * r2;
|
|
32
|
+
var v14 = 2 * s2 * r2 - 2 * s1 * r1;
|
|
33
|
+
|
|
34
|
+
var v21 = 2 * x3 - 2 * x2;
|
|
35
|
+
var v22 = 2 * y3 - 2 * y2;
|
|
36
|
+
var v23 = x2 * x2 - x3 * x3 + y2 * y2 - y3 * y3 - r2 * r2 + r3 * r3;
|
|
37
|
+
var v24 = 2 * s3 * r3 - 2 * s2 * r2;
|
|
38
|
+
|
|
39
|
+
var w12 = v12 / v11;
|
|
40
|
+
var w13 = v13 / v11;
|
|
41
|
+
var w14 = v14 / v11;
|
|
42
|
+
|
|
43
|
+
var w22 = v22 / v21 - w12;
|
|
44
|
+
var w23 = v23 / v21 - w13;
|
|
45
|
+
var w24 = v24 / v21 - w14;
|
|
46
|
+
|
|
47
|
+
var P = -w23 / w22;
|
|
48
|
+
var Q = w24 / w22;
|
|
49
|
+
var M = -w12 * P - w13;
|
|
50
|
+
var N = w14 - w12 * Q;
|
|
51
|
+
|
|
52
|
+
var a = N * N + Q * Q - 1;
|
|
53
|
+
var b = 2 * M * N - 2 * N * x1 + 2 * P * Q - 2 * Q * y1 + 2 * s1 * r1;
|
|
54
|
+
var c = x1 * x1 + M * M - 2 * M * x1 + P * P + y1 * y1 - 2 * P * y1 - r1 * r1;
|
|
55
|
+
|
|
56
|
+
// Find a root of a quadratic equation. This requires the circle centers not
|
|
57
|
+
// to be e.g. colinear
|
|
58
|
+
var D = b * b - 4 * a * c;
|
|
59
|
+
var rs = (-b - Math.sqrt(D)) / (2 * a);
|
|
60
|
+
var xs = M + N * rs;
|
|
61
|
+
var ys = P + Q * rs;
|
|
62
|
+
|
|
63
|
+
return (xs, ys, rs);
|
|
64
|
+
}
|
|
65
|
+
*
|
|
66
|
+
* @date 2026-07-03
|
|
67
|
+
*/
|
|
68
|
+
import { Circle, ICircle } from "../../Circle";
|
|
69
|
+
export declare const solveApollonius3: (c1: ICircle, c2: ICircle, c3: ICircle, circle1Inside?: boolean, circle2Inside?: boolean, circle3Inside?: boolean) => Circle;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A solver for the Apollonian circle problem:
|
|
3
|
+
* find the circle that touches three other circles in extactly one point (each).
|
|
4
|
+
* The solution is not necesarily unique.
|
|
5
|
+
*
|
|
6
|
+
* For each of the three circles a boolean attribute can be passed that determines if the
|
|
7
|
+
* resultint circle should touch the input circle should be touched on the inside or outside.
|
|
8
|
+
*
|
|
9
|
+
* Not that there can be condition when the circle cannot be calculated (e.g. all circles
|
|
10
|
+
* have the same size and are colinear).
|
|
11
|
+
*
|
|
12
|
+
* Found at
|
|
13
|
+
* https://stackoverflow.com/questions/79281573/algorithm-for-finding-enclosing-circles-for-3-other-circles
|
|
14
|
+
*
|
|
15
|
+
* solveApollonius(Coord c1, Coord c2, Coord c3, int s1, int s2, int s3) {
|
|
16
|
+
// https://github.com/DIKU-Steiner/ProGAL/blob/master/src/ProGAL/geom2d/ApolloniusSolver.java
|
|
17
|
+
|
|
18
|
+
var x1 = c1.x;
|
|
19
|
+
var y1 = c1.y;
|
|
20
|
+
var r1 = c1.z;
|
|
21
|
+
var x2 = c2.x;
|
|
22
|
+
var y2 = c2.y;
|
|
23
|
+
var r2 = c2.z;
|
|
24
|
+
var x3 = c3.x;
|
|
25
|
+
var y3 = c3.y;
|
|
26
|
+
var r3 = c3.z;
|
|
27
|
+
|
|
28
|
+
// Currently optimized for fewest multiplications.
|
|
29
|
+
var v11 = 2 * x2 - 2 * x1;
|
|
30
|
+
var v12 = 2 * y2 - 2 * y1;
|
|
31
|
+
var v13 = x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2 - r1 * r1 + r2 * r2;
|
|
32
|
+
var v14 = 2 * s2 * r2 - 2 * s1 * r1;
|
|
33
|
+
|
|
34
|
+
var v21 = 2 * x3 - 2 * x2;
|
|
35
|
+
var v22 = 2 * y3 - 2 * y2;
|
|
36
|
+
var v23 = x2 * x2 - x3 * x3 + y2 * y2 - y3 * y3 - r2 * r2 + r3 * r3;
|
|
37
|
+
var v24 = 2 * s3 * r3 - 2 * s2 * r2;
|
|
38
|
+
|
|
39
|
+
var w12 = v12 / v11;
|
|
40
|
+
var w13 = v13 / v11;
|
|
41
|
+
var w14 = v14 / v11;
|
|
42
|
+
|
|
43
|
+
var w22 = v22 / v21 - w12;
|
|
44
|
+
var w23 = v23 / v21 - w13;
|
|
45
|
+
var w24 = v24 / v21 - w14;
|
|
46
|
+
|
|
47
|
+
var P = -w23 / w22;
|
|
48
|
+
var Q = w24 / w22;
|
|
49
|
+
var M = -w12 * P - w13;
|
|
50
|
+
var N = w14 - w12 * Q;
|
|
51
|
+
|
|
52
|
+
var a = N * N + Q * Q - 1;
|
|
53
|
+
var b = 2 * M * N - 2 * N * x1 + 2 * P * Q - 2 * Q * y1 + 2 * s1 * r1;
|
|
54
|
+
var c = x1 * x1 + M * M - 2 * M * x1 + P * P + y1 * y1 - 2 * P * y1 - r1 * r1;
|
|
55
|
+
|
|
56
|
+
// Find a root of a quadratic equation. This requires the circle centers not
|
|
57
|
+
// to be e.g. colinear
|
|
58
|
+
var D = b * b - 4 * a * c;
|
|
59
|
+
var rs = (-b - Math.sqrt(D)) / (2 * a);
|
|
60
|
+
var xs = M + N * rs;
|
|
61
|
+
var ys = P + Q * rs;
|
|
62
|
+
|
|
63
|
+
return (xs, ys, rs);
|
|
64
|
+
}
|
|
65
|
+
*
|
|
66
|
+
* @date 2026-07-03
|
|
67
|
+
*/
|
|
68
|
+
import { Circle } from "../../Circle";
|
|
69
|
+
import { Vertex } from "../../Vertex";
|
|
70
|
+
export const solveApollonius3 = (c1, c2, c3, circle1Inside, circle2Inside, circle3Inside) => {
|
|
71
|
+
// https://github.com/DIKU-Steiner/ProGAL/blob/master/src/ProGAL/geom2d/ApolloniusSolver.java
|
|
72
|
+
var x1 = c1.center.x;
|
|
73
|
+
var y1 = c1.center.y;
|
|
74
|
+
var r1 = c1.radius;
|
|
75
|
+
var x2 = c2.center.x;
|
|
76
|
+
var y2 = c2.center.y;
|
|
77
|
+
var r2 = c2.radius;
|
|
78
|
+
var x3 = c3.center.x;
|
|
79
|
+
var y3 = c3.center.y;
|
|
80
|
+
var r3 = c3.radius;
|
|
81
|
+
var s1 = Boolean(circle1Inside) ? 1 : -1;
|
|
82
|
+
var s2 = Boolean(circle2Inside) ? 1 : -1;
|
|
83
|
+
var s3 = Boolean(circle3Inside) ? 1 : -1;
|
|
84
|
+
// Currently optimized for fewest multiplications.
|
|
85
|
+
var v11 = 2 * x2 - 2 * x1;
|
|
86
|
+
var v12 = 2 * y2 - 2 * y1;
|
|
87
|
+
var v13 = x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2 - r1 * r1 + r2 * r2;
|
|
88
|
+
var v14 = 2 * s2 * r2 - 2 * s1 * r1;
|
|
89
|
+
var v21 = 2 * x3 - 2 * x2;
|
|
90
|
+
var v22 = 2 * y3 - 2 * y2;
|
|
91
|
+
var v23 = x2 * x2 - x3 * x3 + y2 * y2 - y3 * y3 - r2 * r2 + r3 * r3;
|
|
92
|
+
var v24 = 2 * s3 * r3 - 2 * s2 * r2;
|
|
93
|
+
var w12 = v12 / v11;
|
|
94
|
+
var w13 = v13 / v11;
|
|
95
|
+
var w14 = v14 / v11;
|
|
96
|
+
var w22 = v22 / v21 - w12;
|
|
97
|
+
var w23 = v23 / v21 - w13;
|
|
98
|
+
var w24 = v24 / v21 - w14;
|
|
99
|
+
var P = -w23 / w22;
|
|
100
|
+
var Q = w24 / w22;
|
|
101
|
+
var M = -w12 * P - w13;
|
|
102
|
+
var N = w14 - w12 * Q;
|
|
103
|
+
var a = N * N + Q * Q - 1;
|
|
104
|
+
var b = 2 * M * N - 2 * N * x1 + 2 * P * Q - 2 * Q * y1 + 2 * s1 * r1;
|
|
105
|
+
var c = x1 * x1 + M * M - 2 * M * x1 + P * P + y1 * y1 - 2 * P * y1 - r1 * r1;
|
|
106
|
+
// Find a root of a quadratic equation. This requires the circle centers not
|
|
107
|
+
// to be e.g. colinear
|
|
108
|
+
var D = b * b - 4 * a * c;
|
|
109
|
+
var rs = (-b - Math.sqrt(D)) / (2 * a);
|
|
110
|
+
var xs = M + N * rs;
|
|
111
|
+
var ys = P + Q * rs;
|
|
112
|
+
return new Circle(new Vertex(xs, ys), Math.abs(rs));
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=solveApollonius3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solveApollonius3.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/solveApollonius3.ts"],"names":[],"mappings":"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"}
|
package/src/index-gl.js
CHANGED
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
// Fetch the GET params
|
|
17
17
|
let GUP = gup();
|
|
18
18
|
var isDarkmode = detectDarkMode(GUP);
|
|
19
|
-
var isDarkmode = detectDarkMode(GUP);
|
|
20
19
|
|
|
21
20
|
window.addEventListener("load", function () {
|
|
22
21
|
// All config params are optional.
|
|
@@ -73,8 +72,11 @@
|
|
|
73
72
|
// +---------------------------------------------------------------------------------
|
|
74
73
|
// | Initialize dat.gui
|
|
75
74
|
// +-------------------------------
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
try {
|
|
76
|
+
pb.createGUI();
|
|
77
|
+
} catch (e) {
|
|
78
|
+
console.error("Failed to initialize GUI", e);
|
|
79
|
+
}
|
|
78
80
|
|
|
79
81
|
// +---------------------------------------------------------------------------------
|
|
80
82
|
// | Add a mouse listener to track the mouse position.
|
|
@@ -88,7 +90,7 @@
|
|
|
88
90
|
});
|
|
89
91
|
|
|
90
92
|
// Use a helper function to build all demo-drawables.
|
|
91
|
-
var drawables = createDemoDrawables(pb
|
|
93
|
+
var drawables = createDemoDrawables(pb, "example-image.png", function () {
|
|
92
94
|
pb.redraw();
|
|
93
95
|
});
|
|
94
96
|
pb.add(drawables);
|
package/src/index.js
CHANGED
|
@@ -81,28 +81,36 @@
|
|
|
81
81
|
// +---------------------------------------------------------------------------------
|
|
82
82
|
// | Initialize dat.gui
|
|
83
83
|
// +-------------------------------
|
|
84
|
-
|
|
84
|
+
try {
|
|
85
|
+
pb.createGUI();
|
|
86
|
+
} catch (e) {
|
|
87
|
+
console.error("Failed to initialize GUI", e);
|
|
88
|
+
}
|
|
85
89
|
|
|
86
90
|
// +---------------------------------------------------------------------------------
|
|
87
91
|
// | Add stats.
|
|
88
92
|
// +-------------------------------
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
try {
|
|
94
|
+
var stats = {
|
|
95
|
+
mouseX: 0,
|
|
96
|
+
mouseY: 0
|
|
97
|
+
};
|
|
98
|
+
var uiStats = new UIStats(stats);
|
|
99
|
+
stats = uiStats.proxy;
|
|
100
|
+
uiStats.add("mouseX");
|
|
101
|
+
uiStats.add("mouseY");
|
|
97
102
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
// +---------------------------------------------------------------------------------
|
|
104
|
+
// | Add a mouse listener to track the mouse position.
|
|
105
|
+
// +-------------------------------
|
|
106
|
+
new MouseHandler(pb.eventCatcher).move(function (e) {
|
|
107
|
+
var relPos = pb.transformMousePosition(e.params.pos.x, e.params.pos.y);
|
|
108
|
+
stats.mouseX = relPos.x;
|
|
109
|
+
stats.mouseY = relPos.y;
|
|
110
|
+
});
|
|
111
|
+
} catch (e) {
|
|
112
|
+
console.error("Failed to initialize stats and/or mouse handler.", e);
|
|
113
|
+
}
|
|
106
114
|
|
|
107
115
|
// Use a helper function to build all demo-drawables.
|
|
108
116
|
var drawables = createDemoDrawables(pb, "example-image.png", function () {
|