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.
Files changed (80) hide show
  1. package/README.md +8 -0
  2. package/dist/index.esm.js +527 -53
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.esm.min.js +1 -1
  5. package/dist/index.esm.min.js.map +1 -1
  6. package/dist/plotboilerplate.browser.min.js +1 -1
  7. package/dist/plotboilerplate.browser.min.js.map +1 -1
  8. package/dist/plotboilerplate.js +528 -51
  9. package/dist/plotboilerplate.min.js +1 -1
  10. package/package.json +1 -1
  11. package/src/cjs/Circle.d.ts +86 -3
  12. package/src/cjs/Circle.js +179 -4
  13. package/src/cjs/Circle.js.map +1 -1
  14. package/src/cjs/CubicBezierCurve.d.ts +34 -3
  15. package/src/cjs/CubicBezierCurve.js +79 -12
  16. package/src/cjs/CubicBezierCurve.js.map +1 -1
  17. package/src/cjs/Line.d.ts +46 -1
  18. package/src/cjs/Line.js +80 -1
  19. package/src/cjs/Line.js.map +1 -1
  20. package/src/cjs/Triangle.d.ts +40 -4
  21. package/src/cjs/Triangle.js +127 -31
  22. package/src/cjs/Triangle.js.map +1 -1
  23. package/src/cjs/VertTuple.d.ts +16 -2
  24. package/src/cjs/VertTuple.js +20 -2
  25. package/src/cjs/VertTuple.js.map +1 -1
  26. package/src/cjs/Vertex.d.ts +25 -2
  27. package/src/cjs/Vertex.js +43 -1
  28. package/src/cjs/Vertex.js.map +1 -1
  29. package/src/cjs/utils/algorithms/minimalContainingCircleFromPoints.d.ts +21 -0
  30. package/src/cjs/utils/algorithms/minimalContainingCircleFromPoints.js +73 -0
  31. package/src/cjs/utils/algorithms/minimalContainingCircleFromPoints.js.map +1 -0
  32. package/src/cjs/utils/algorithms/minimalEnclosingCircleFromPoints.d.ts +21 -0
  33. package/src/cjs/utils/algorithms/minimalEnclosingCircleFromPoints.js +73 -0
  34. package/src/cjs/utils/algorithms/minimalEnclosingCircleFromPoints.js.map +1 -0
  35. package/src/cjs/utils/algorithms/pointsMinimalContainingCircle.d.ts +21 -0
  36. package/src/cjs/utils/algorithms/pointsMinimalContainingCircle.js +73 -0
  37. package/src/cjs/utils/algorithms/pointsMinimalContainingCircle.js.map +1 -0
  38. package/src/cjs/utils/algorithms/solveApollonius3.d.ts +69 -0
  39. package/src/cjs/utils/algorithms/solveApollonius3.js +118 -0
  40. package/src/cjs/utils/algorithms/solveApollonius3.js.map +1 -0
  41. package/src/esm/Circle.d.ts +86 -3
  42. package/src/esm/Circle.js +179 -4
  43. package/src/esm/Circle.js.map +1 -1
  44. package/src/esm/CubicBezierCurve.d.ts +34 -3
  45. package/src/esm/CubicBezierCurve.js +79 -12
  46. package/src/esm/CubicBezierCurve.js.map +1 -1
  47. package/src/esm/Line.d.ts +46 -1
  48. package/src/esm/Line.js +80 -1
  49. package/src/esm/Line.js.map +1 -1
  50. package/src/esm/Triangle.d.ts +40 -4
  51. package/src/esm/Triangle.js +128 -32
  52. package/src/esm/Triangle.js.map +1 -1
  53. package/src/esm/VertTuple.d.ts +16 -2
  54. package/src/esm/VertTuple.js +20 -2
  55. package/src/esm/VertTuple.js.map +1 -1
  56. package/src/esm/Vertex.d.ts +25 -2
  57. package/src/esm/Vertex.js +44 -2
  58. package/src/esm/Vertex.js.map +1 -1
  59. package/src/esm/utils/algorithms/minimalContainingCircleFromPoints.d.ts +21 -0
  60. package/src/esm/utils/algorithms/minimalContainingCircleFromPoints.js +69 -0
  61. package/src/esm/utils/algorithms/minimalContainingCircleFromPoints.js.map +1 -0
  62. package/src/esm/utils/algorithms/minimalEnclosingCircleFromPoints.d.ts +21 -0
  63. package/src/esm/utils/algorithms/minimalEnclosingCircleFromPoints.js +69 -0
  64. package/src/esm/utils/algorithms/minimalEnclosingCircleFromPoints.js.map +1 -0
  65. package/src/esm/utils/algorithms/pointsMinimalContainingCircle.d.ts +21 -0
  66. package/src/esm/utils/algorithms/pointsMinimalContainingCircle.js +69 -0
  67. package/src/esm/utils/algorithms/pointsMinimalContainingCircle.js.map +1 -0
  68. package/src/esm/utils/algorithms/solveApollonius3.d.ts +69 -0
  69. package/src/esm/utils/algorithms/solveApollonius3.js +114 -0
  70. package/src/esm/utils/algorithms/solveApollonius3.js.map +1 -0
  71. package/src/index-gl.js +6 -4
  72. package/src/index.js +25 -17
  73. package/src/ts/Circle.ts +200 -5
  74. package/src/ts/CubicBezierCurve.ts +133 -48
  75. package/src/ts/Line.ts +84 -1
  76. package/src/ts/Triangle.ts +148 -41
  77. package/src/ts/VertTuple.ts +29 -2
  78. package/src/ts/Vertex.ts +44 -2
  79. package/src/ts/utils/algorithms/minimalEnclosingCircleFromPoints.ts +69 -0
  80. 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
- pb.createGUI();
77
- // END init dat.gui
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.canvasSize, "example-image.png", function () {
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
- pb.createGUI();
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
- var stats = {
90
- mouseX: 0,
91
- mouseY: 0
92
- };
93
- var uiStats = new UIStats(stats);
94
- stats = uiStats.proxy;
95
- uiStats.add("mouseX");
96
- uiStats.add("mouseY");
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
- // | Add a mouse listener to track the mouse position.
100
- // +-------------------------------
101
- new MouseHandler(pb.eventCatcher).move(function (e) {
102
- var relPos = pb.transformMousePosition(e.params.pos.x, e.params.pos.y);
103
- stats.mouseX = relPos.x;
104
- stats.mouseY = relPos.y;
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 () {