flo-mat 2.0.2 → 2.0.4

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 (216) hide show
  1. package/browser/index.js +8409 -8358
  2. package/browser/index.min.js +1 -1
  3. package/node/circle.d.ts +20 -20
  4. package/node/circle.js +31 -31
  5. package/node/compare-curvatures-at-interface.d.ts +19 -19
  6. package/node/compare-curvatures-at-interface.js +124 -124
  7. package/node/contact-point.d.ts +26 -26
  8. package/node/contact-point.js +25 -25
  9. package/node/cp-node/clone.d.ts +8 -8
  10. package/node/cp-node/clone.js +31 -31
  11. package/node/cp-node/remove.d.ts +9 -9
  12. package/node/cp-node/remove.js +19 -19
  13. package/node/cp-node.d.ts +202 -202
  14. package/node/cp-node.js +320 -320
  15. package/node/curve.d.ts +46 -46
  16. package/node/curve.js +88 -88
  17. package/node/debug/cp-node-for-debugging.d.ts +11 -11
  18. package/node/debug/cp-node-for-debugging.js +1 -1
  19. package/node/debug/debug-elem-types.d.ts +32 -32
  20. package/node/debug/debug-elem-types.js +1 -1
  21. package/node/debug/debug.d.ts +50 -50
  22. package/node/debug/debug.js +75 -75
  23. package/node/debug/functions/draw-elem/bounding-hull.d.ts +3 -3
  24. package/node/debug/functions/draw-elem/bounding-hull.js +7 -7
  25. package/node/debug/functions/draw-elem/branch.d.ts +4 -4
  26. package/node/debug/functions/draw-elem/branch.js +22 -22
  27. package/node/debug/functions/draw-elem/culls.d.ts +4 -4
  28. package/node/debug/functions/draw-elem/culls.js +21 -21
  29. package/node/debug/functions/draw-elem/draw-circle-percent.d.ts +3 -3
  30. package/node/debug/functions/draw-elem/draw-circle-percent.js +12 -12
  31. package/node/debug/functions/draw-elem/draw-elem.d.ts +8 -8
  32. package/node/debug/functions/draw-elem/draw-elem.js +45 -45
  33. package/node/debug/functions/draw-elem/dull-corner.d.ts +4 -4
  34. package/node/debug/functions/draw-elem/dull-corner.js +10 -10
  35. package/node/debug/functions/draw-elem/leaves.d.ts +4 -4
  36. package/node/debug/functions/draw-elem/leaves.js +12 -12
  37. package/node/debug/functions/draw-elem/loop.d.ts +4 -4
  38. package/node/debug/functions/draw-elem/loop.js +11 -11
  39. package/node/debug/functions/draw-elem/loops.d.ts +4 -4
  40. package/node/debug/functions/draw-elem/loops.js +6 -6
  41. package/node/debug/functions/draw-elem/loose-bounding-box.d.ts +3 -3
  42. package/node/debug/functions/draw-elem/loose-bounding-box.js +9 -9
  43. package/node/debug/functions/draw-elem/mat.d.ts +4 -4
  44. package/node/debug/functions/draw-elem/mat.js +30 -30
  45. package/node/debug/functions/draw-elem/max-vertex.d.ts +4 -4
  46. package/node/debug/functions/draw-elem/max-vertex.js +8 -8
  47. package/node/debug/functions/draw-elem/min-y.d.ts +4 -4
  48. package/node/debug/functions/draw-elem/min-y.js +13 -13
  49. package/node/debug/functions/draw-elem/one-prong-at-dull-corner.d.ts +4 -4
  50. package/node/debug/functions/draw-elem/one-prong-at-dull-corner.js +12 -12
  51. package/node/debug/functions/draw-elem/one-prong.d.ts +4 -4
  52. package/node/debug/functions/draw-elem/one-prong.js +16 -16
  53. package/node/debug/functions/draw-elem/sharp-corner.d.ts +4 -4
  54. package/node/debug/functions/draw-elem/sharp-corner.js +9 -9
  55. package/node/debug/functions/draw-elem/three-prong.d.ts +4 -4
  56. package/node/debug/functions/draw-elem/three-prong.js +16 -16
  57. package/node/debug/functions/draw-elem/tight-bounding-box.d.ts +3 -3
  58. package/node/debug/functions/draw-elem/tight-bounding-box.js +7 -7
  59. package/node/debug/functions/draw-elem/two-prong.d.ts +4 -4
  60. package/node/debug/functions/draw-elem/two-prong.js +36 -36
  61. package/node/debug/functions/draw-elem/vertex.d.ts +4 -4
  62. package/node/debug/functions/draw-elem/vertex.js +27 -27
  63. package/node/debug/functions/general.d.ts +48 -48
  64. package/node/debug/functions/general.js +52 -52
  65. package/node/debug/functions/three-prong.d.ts +11 -11
  66. package/node/debug/functions/three-prong.js +184 -184
  67. package/node/debug/functions/two-prong.d.ts +13 -13
  68. package/node/debug/functions/two-prong.js +117 -117
  69. package/node/debug/three-prong-for-debugging.d.ts +31 -31
  70. package/node/debug/three-prong-for-debugging.js +20 -20
  71. package/node/debug/two-prong-for-debugging.d.ts +26 -26
  72. package/node/debug/two-prong-for-debugging.js +1 -1
  73. package/node/find-mats.d.ts +26 -26
  74. package/node/find-mats.js +122 -122
  75. package/node/get-boundary-bezier-parts-to-next.d.ts +9 -9
  76. package/node/get-boundary-bezier-parts-to-next.js +42 -42
  77. package/node/get-boundary-beziers-to-next.d.ts +8 -8
  78. package/node/get-boundary-beziers-to-next.js +44 -44
  79. package/node/get-bounding-box-.d.ts +2 -2
  80. package/node/get-bounding-box-.js +4 -4
  81. package/node/get-branches.d.ts +12 -12
  82. package/node/get-branches.js +68 -68
  83. package/node/get-curve/get-curve-between.d.ts +9 -9
  84. package/node/get-curve/get-curve-between.js +56 -56
  85. package/node/get-curve/get-edge-direction.d.ts +9 -9
  86. package/node/get-curve/get-edge-direction.js +53 -53
  87. package/node/get-curve-to-next.d.ts +9 -9
  88. package/node/get-curve-to-next.js +11 -11
  89. package/node/get-interface-ccw.d.ts +24 -24
  90. package/node/get-interface-ccw.js +97 -97
  91. package/node/index.d.ts +36 -36
  92. package/node/index.js +32 -32
  93. package/node/loop/get-max-coordinate.d.ts +10 -10
  94. package/node/loop/get-max-coordinate.js +43 -43
  95. package/node/loop.d.ts +16 -16
  96. package/node/loop.js +34 -34
  97. package/node/mat/add-to-cp-graph.d.ts +16 -16
  98. package/node/mat/add-to-cp-graph.js +30 -30
  99. package/node/mat/bezier-piece.d.ts +12 -12
  100. package/node/mat/bezier-piece.js +1 -1
  101. package/node/mat/closest-boundary-point/closest-points-on-curve.d.ts +14 -14
  102. package/node/mat/closest-boundary-point/closest-points-on-curve.js +72 -72
  103. package/node/mat/closest-boundary-point/cull-bezier-pieces.d.ts +9 -9
  104. package/node/mat/closest-boundary-point/cull-bezier-pieces.js +19 -19
  105. package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.d.ts +11 -11
  106. package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.js +24 -24
  107. package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.d.ts +11 -11
  108. package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.js +26 -26
  109. package/node/mat/closest-boundary-point/get-best-distance-squared.d.ts +8 -8
  110. package/node/mat/closest-boundary-point/get-best-distance-squared.js +24 -24
  111. package/node/mat/closest-boundary-point/get-close-boundary-points.d.ts +17 -17
  112. package/node/mat/closest-boundary-point/get-close-boundary-points.js +80 -80
  113. package/node/mat/closest-boundary-point/get-closest-boundary-point.d.ts +18 -18
  114. package/node/mat/closest-boundary-point/get-closest-boundary-point.js +40 -40
  115. package/node/mat/corner.d.ts +37 -37
  116. package/node/mat/corner.js +1 -1
  117. package/node/mat/create-new-cp-tree.d.ts +9 -9
  118. package/node/mat/create-new-cp-tree.js +23 -23
  119. package/node/mat/elem-type-two-prong.d.ts +3 -3
  120. package/node/mat/elem-type-two-prong.js +1 -1
  121. package/node/mat/find-mat/add-1-prong.d.ts +12 -12
  122. package/node/mat/find-mat/add-1-prong.js +42 -42
  123. package/node/mat/find-mat/add-2-prong.d.ts +21 -21
  124. package/node/mat/find-mat/add-2-prong.js +192 -192
  125. package/node/mat/find-mat/add-3-prong.d.ts +19 -19
  126. package/node/mat/find-mat/add-3-prong.js +54 -54
  127. package/node/mat/find-mat/add-debug-info.d.ts +9 -9
  128. package/node/mat/find-mat/add-debug-info.js +67 -67
  129. package/node/mat/find-mat/create-get-interesting-points-on-loop.d.ts +11 -11
  130. package/node/mat/find-mat/create-get-interesting-points-on-loop.js +51 -51
  131. package/node/mat/find-mat/create-initial-cp-graph.d.ts +12 -12
  132. package/node/mat/find-mat/create-initial-cp-graph.js +40 -40
  133. package/node/mat/find-mat/find-2-prong/add-debug-info.d.ts +8 -8
  134. package/node/mat/find-mat/find-2-prong/add-debug-info.js +21 -21
  135. package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.d.ts +11 -11
  136. package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.js +29 -29
  137. package/node/mat/find-mat/find-2-prong/find-2-prong.d.ts +37 -37
  138. package/node/mat/find-mat/find-2-prong/find-2-prong.js +232 -232
  139. package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.d.ts +9 -9
  140. package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.js +39 -39
  141. package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.d.ts +11 -11
  142. package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.js +37 -37
  143. package/node/mat/find-mat/find-2-prong/x-for-debugging.d.ts +9 -9
  144. package/node/mat/find-mat/find-2-prong/x-for-debugging.js +1 -1
  145. package/node/mat/find-mat/find-3-prong/calc-better-x.d.ts +19 -19
  146. package/node/mat/find-mat/find-3-prong/calc-better-x.js +36 -36
  147. package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.d.ts +13 -13
  148. package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.js +25 -25
  149. package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.d.ts +22 -22
  150. package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.js +159 -159
  151. package/node/mat/find-mat/find-3-prong/find-3-prong.d.ts +16 -16
  152. package/node/mat/find-mat/find-3-prong/find-3-prong.js +76 -76
  153. package/node/mat/find-mat/find-3-prong/get-closest-points.d.ts +9 -9
  154. package/node/mat/find-mat/find-3-prong/get-closest-points.js +16 -16
  155. package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.d.ts +15 -15
  156. package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.js +20 -20
  157. package/node/mat/find-mat/find-and-add-2-prongs.d.ts +16 -16
  158. package/node/mat/find-mat/find-and-add-2-prongs.js +73 -73
  159. package/node/mat/find-mat/find-and-add-3-prongs.d.ts +13 -13
  160. package/node/mat/find-mat/find-and-add-3-prongs.js +146 -146
  161. package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.d.ts +14 -14
  162. package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.js +33 -33
  163. package/node/mat/find-mat/get-potential-2-prongs.d.ts +4 -4
  164. package/node/mat/find-mat/get-potential-2-prongs.js +16 -16
  165. package/node/mat/find-mat/get-sharp-corners.d.ts +4 -4
  166. package/node/mat/find-mat/get-sharp-corners.js +17 -17
  167. package/node/mat/geometry/get-closest-square-distance-to-rect.d.ts +5 -5
  168. package/node/mat/geometry/get-closest-square-distance-to-rect.js +49 -49
  169. package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.d.ts +5 -5
  170. package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.js +15 -15
  171. package/node/mat/get-boundary-piece-beziers.d.ts +11 -11
  172. package/node/mat/get-boundary-piece-beziers.js +58 -58
  173. package/node/mat/get-contact-circles-at-interface.d.ts +8 -8
  174. package/node/mat/get-contact-circles-at-interface.js +20 -20
  175. package/node/mat/get-largest-vertex.d.ts +4 -4
  176. package/node/mat/get-largest-vertex.js +9 -9
  177. package/node/mat/get-leaves.d.ts +4 -4
  178. package/node/mat/get-leaves.js +12 -12
  179. package/node/mat/get-neighboring-cps.d.ts +14 -14
  180. package/node/mat/get-neighboring-cps.js +30 -30
  181. package/node/mat/get-two-prong-type.d.ts +5 -5
  182. package/node/mat/get-two-prong-type.js +8 -8
  183. package/node/mat/is-another-cp-closeby.d.ts +20 -20
  184. package/node/mat/is-another-cp-closeby.js +55 -55
  185. package/node/mat/simplify-mat-map-only.d.ts +23 -23
  186. package/node/mat/simplify-mat-map-only.js +80 -80
  187. package/node/mat/to-scale-axis/add-debug-info.d.ts +7 -7
  188. package/node/mat/to-scale-axis/add-debug-info.js +13 -13
  189. package/node/mat/to-scale-axis/cull-non-cycles.d.ts +9 -9
  190. package/node/mat/to-scale-axis/cull-non-cycles.js +51 -51
  191. package/node/mat/to-scale-axis/cull.d.ts +12 -12
  192. package/node/mat/to-scale-axis/cull.js +132 -132
  193. package/node/mat/trim-mat.d.ts +8 -8
  194. package/node/mat/trim-mat.js +16 -16
  195. package/node/mat.d.ts +22 -22
  196. package/node/mat.js +1 -1
  197. package/node/point-on-shape.d.ts +73 -73
  198. package/node/point-on-shape.js +167 -167
  199. package/node/simplify-mat.d.ts +16 -16
  200. package/node/simplify-mat.js +71 -71
  201. package/node/svg/get-loop-bounds.d.ts +12 -12
  202. package/node/svg/get-loop-bounds.js +80 -80
  203. package/node/svg/get-min-y-pos.d.ts +8 -8
  204. package/node/svg/get-min-y-pos.js +9 -9
  205. package/node/svg/get-shape-bounds.d.ts +9 -9
  206. package/node/svg/get-shape-bounds.js +35 -35
  207. package/node/sweep-line/sweep-line.d.ts +18 -18
  208. package/node/sweep-line/sweep-line.js +72 -72
  209. package/node/to-scale-axis.d.ts +16 -16
  210. package/node/to-scale-axis.js +74 -74
  211. package/node/traverse-edges.d.ts +10 -10
  212. package/node/traverse-edges.js +21 -21
  213. package/node/traverse-vertices.d.ts +12 -12
  214. package/node/traverse-vertices.js +27 -27
  215. package/package.json +15 -15
  216. package/tsconfig.json +0 -1
@@ -1,31 +1,31 @@
1
- import { CpNode } from '../cp-node.js';
2
- import { IPointOnShape } from '../point-on-shape.js';
3
- import { Circle } from '../circle.js';
4
- import { Generated } from './debug.js';
5
- /**
6
- * @hidden
7
- * Used for debugging only. A three-prong is a maximally inscribed circle that
8
- * touches the shape boundary (tangentially) at 3 points.
9
- */
10
- interface ThreeProngForDebugging {
11
- generated: Generated;
12
- /** The best fit circle found for the 3-prong. */
13
- circle: Circle;
14
- /** The best fit 3 points found for the 3-prong. */
15
- poss: IPointOnShape[];
16
- /** The 3 boundary pieces on which the three prong points were found. */
17
- cp3ss: CpNode[][];
18
- /** The boundary pieces that were used to search the three prong on. */
19
- cpss: CpNode[][];
20
- bestIndx: number;
21
- /** An array of 3-prongs, each of which may be a best fit 3-prong. */
22
- candidateThreeProngs: {
23
- circle: Circle;
24
- ps: IPointOnShape[];
25
- }[];
26
- visitedCps: CpNode[];
27
- boundaries: number[][][][];
28
- traces: number[][][];
29
- }
30
- declare function createEmptyThreeProngForDebugging(): ThreeProngForDebugging;
31
- export { ThreeProngForDebugging, createEmptyThreeProngForDebugging };
1
+ import { CpNode } from '../cp-node.js';
2
+ import { IPointOnShape } from '../point-on-shape.js';
3
+ import { Circle } from '../circle.js';
4
+ import { Generated } from './debug.js';
5
+ /**
6
+ * @hidden
7
+ * Used for debugging only. A three-prong is a maximally inscribed circle that
8
+ * touches the shape boundary (tangentially) at 3 points.
9
+ */
10
+ interface ThreeProngForDebugging {
11
+ generated: Generated;
12
+ /** The best fit circle found for the 3-prong. */
13
+ circle: Circle;
14
+ /** The best fit 3 points found for the 3-prong. */
15
+ poss: IPointOnShape[];
16
+ /** The 3 boundary pieces on which the three prong points were found. */
17
+ cp3ss: CpNode[][];
18
+ /** The boundary pieces that were used to search the three prong on. */
19
+ cpss: CpNode[][];
20
+ bestIndx: number;
21
+ /** An array of 3-prongs, each of which may be a best fit 3-prong. */
22
+ candidateThreeProngs: {
23
+ circle: Circle;
24
+ ps: IPointOnShape[];
25
+ }[];
26
+ visitedCps: CpNode[];
27
+ boundaries: number[][][][];
28
+ traces: number[][][];
29
+ }
30
+ declare function createEmptyThreeProngForDebugging(): ThreeProngForDebugging;
31
+ export { ThreeProngForDebugging, createEmptyThreeProngForDebugging };
@@ -1,21 +1,21 @@
1
- import { posToHumanString } from '../point-on-shape.js';
2
- function createEmptyThreeProngForDebugging() {
3
- return {
4
- generated: undefined,
5
- circle: undefined,
6
- poss: undefined,
7
- cp3ss: undefined,
8
- cpss: undefined,
9
- bestIndx: undefined,
10
- candidateThreeProngs: undefined,
11
- visitedCps: undefined,
12
- boundaries: undefined,
13
- traces: undefined,
14
- };
15
- }
16
- function cpsSimple(threeProngForDebugging) {
17
- return threeProngForDebugging.cpss.map(δ => [posToHumanString(δ[0].cp.pointOnShape),
18
- posToHumanString(δ[1].cp.pointOnShape)]);
19
- }
20
- export { createEmptyThreeProngForDebugging };
1
+ import { posToHumanString } from '../point-on-shape.js';
2
+ function createEmptyThreeProngForDebugging() {
3
+ return {
4
+ generated: undefined,
5
+ circle: undefined,
6
+ poss: undefined,
7
+ cp3ss: undefined,
8
+ cpss: undefined,
9
+ bestIndx: undefined,
10
+ candidateThreeProngs: undefined,
11
+ visitedCps: undefined,
12
+ boundaries: undefined,
13
+ traces: undefined,
14
+ };
15
+ }
16
+ function cpsSimple(threeProngForDebugging) {
17
+ return threeProngForDebugging.cpss.map(δ => [posToHumanString(δ[0].cp.pointOnShape),
18
+ posToHumanString(δ[1].cp.pointOnShape)]);
19
+ }
20
+ export { createEmptyThreeProngForDebugging };
21
21
  //# sourceMappingURL=three-prong-for-debugging.js.map
@@ -1,26 +1,26 @@
1
- import { CpNode } from '../cp-node.js';
2
- import { IPointOnShape } from '../point-on-shape.js';
3
- import { Circle } from '../circle.js';
4
- import { BezierPiece } from '../mat/bezier-piece.js';
5
- import { Generated } from './debug.js';
6
- /** @hidden */
7
- interface TwoProngForDebugging {
8
- generated: Generated;
9
- bezierPieces: BezierPiece[];
10
- pos: IPointOnShape;
11
- δ: CpNode[];
12
- z: number[];
13
- circle: Circle;
14
- xs: {
15
- x: number[];
16
- y: IPointOnShape;
17
- z: IPointOnShape;
18
- t: number;
19
- }[];
20
- failed: boolean;
21
- holeClosing: boolean;
22
- notAdded: boolean;
23
- deleted: boolean;
24
- cpNode: CpNode;
25
- }
26
- export { TwoProngForDebugging };
1
+ import { CpNode } from '../cp-node.js';
2
+ import { IPointOnShape } from '../point-on-shape.js';
3
+ import { Circle } from '../circle.js';
4
+ import { BezierPiece } from '../mat/bezier-piece.js';
5
+ import { Generated } from './debug.js';
6
+ /** @hidden */
7
+ interface TwoProngForDebugging {
8
+ generated: Generated;
9
+ bezierPieces: BezierPiece[];
10
+ pos: IPointOnShape;
11
+ δ: CpNode[];
12
+ z: number[];
13
+ circle: Circle;
14
+ xs: {
15
+ x: number[];
16
+ y: IPointOnShape;
17
+ z: IPointOnShape;
18
+ t: number;
19
+ }[];
20
+ failed: boolean;
21
+ holeClosing: boolean;
22
+ notAdded: boolean;
23
+ deleted: boolean;
24
+ cpNode: CpNode;
25
+ }
26
+ export { TwoProngForDebugging };
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=two-prong-for-debugging.js.map
@@ -1,26 +1,26 @@
1
- import { Mat } from './mat.js';
2
- /**
3
- * Finds and returns the Medial Axis Transforms (MATs) from the given array of
4
- * bezier loops representing shape boundaries.
5
- *
6
- * @param bezierLoops An array of (possibly intersecting) loops with each loop
7
- * representing one or more piecewise smooth closed curves (i.e. shapes). Each
8
- * loop consists of an array of beziers represented by an array of control
9
- * points with 2,3 or 4 elements corresponding to linear, quadratic and cubic
10
- * beziers respectively. Each point is a two-element array (ordered pair), the
11
- * first of which is the x-coordinate and the second the y-coordinate.
12
- *
13
- * @param maxCurviness The maximum value the 'curviness' of a curve can have
14
- * before an additional MAT point is inserted in between. Defaults to 0.4.
15
- * (Curviness is measured as the total angle in radians between the consecutive
16
- * vectors formed by the ordered control points of th bezier curve). The value
17
- * is clipped in the range `[0.05,3]`.
18
- * @param maxLength The maximum length a curve can have before an additional MAT
19
- * point is inserted. This value is scaled to a reference 1024 x 1024
20
- * grid (e.g. if the shape fits in a 512 x 512 axis-aligned box the value will be
21
- * halved, e.g. from 10 to 5). Together with maxCurviness it represents a
22
- * tolerance for the accuracy of the MAT. Defaults to 4. The value is clipped
23
- * in [1,100].
24
- */
25
- declare function findMats(bezierLoops: number[][][][], maxCurviness?: number, maxLength?: number): Mat[];
26
- export { findMats };
1
+ import { Mat } from './mat.js';
2
+ /**
3
+ * Finds and returns the Medial Axis Transforms (MATs) from the given array of
4
+ * bezier loops representing shape boundaries.
5
+ *
6
+ * @param bezierLoops An array of (possibly intersecting) loops with each loop
7
+ * representing one or more piecewise smooth closed curves (i.e. shapes). Each
8
+ * loop consists of an array of beziers represented by an array of control
9
+ * points with 2,3 or 4 elements corresponding to linear, quadratic and cubic
10
+ * beziers respectively. Each point is a two-element array (ordered pair), the
11
+ * first of which is the x-coordinate and the second the y-coordinate.
12
+ *
13
+ * @param maxCurviness The maximum value the 'curviness' of a curve can have
14
+ * before an additional MAT point is inserted in between. Defaults to 0.4.
15
+ * (Curviness is measured as the total angle in radians between the consecutive
16
+ * vectors formed by the ordered control points of th bezier curve). The value
17
+ * is clipped in the range `[0.05,3]`.
18
+ * @param maxLength The maximum length a curve can have before an additional MAT
19
+ * point is inserted. This value is scaled to a reference 1024 x 1024
20
+ * grid (e.g. if the shape fits in a 512 x 512 axis-aligned box the value will be
21
+ * halved, e.g. from 10 to 5). Together with maxCurviness it represents a
22
+ * tolerance for the accuracy of the MAT. Defaults to 4. The value is clipped
23
+ * in [1,100].
24
+ */
25
+ declare function findMats(bezierLoops: number[][][][], maxCurviness?: number, maxLength?: number): Mat[];
26
+ export { findMats };
package/node/find-mats.js CHANGED
@@ -1,123 +1,123 @@
1
- import { simplifyPaths } from 'flo-boolean';
2
- import { findAndAddAll3Prongs } from './mat/find-mat/find-and-add-3-prongs.js';
3
- import { createInitialCpGraph } from './mat/find-mat/create-initial-cp-graph.js';
4
- import { addDebugInfo1, addDebugInfo2, addDebugInfo3, addDebugInfo4 } from './mat/find-mat/add-debug-info.js';
5
- import { getPotential2Prongs } from './mat/find-mat/get-potential-2-prongs.js';
6
- import { getSharpCorners } from './mat/find-mat/get-sharp-corners.js';
7
- import { findAndAdd2ProngsOnAllPaths } from './mat/find-mat/find-and-add-2-prongs-on-all-paths.js';
8
- import { getInterestingPointsOnLoop } from './mat/find-mat/create-get-interesting-points-on-loop.js';
9
- import { findAndAddHoleClosing2Prongs } from './mat/find-mat/find-and-add-hole-closing-2-prongs.js';
10
- import { getLoopsMetrics } from './loop/get-max-coordinate.js';
11
- /**
12
- * Finds and returns the Medial Axis Transforms (MATs) from the given array of
13
- * bezier loops representing shape boundaries.
14
- *
15
- * @param bezierLoops An array of (possibly intersecting) loops with each loop
16
- * representing one or more piecewise smooth closed curves (i.e. shapes). Each
17
- * loop consists of an array of beziers represented by an array of control
18
- * points with 2,3 or 4 elements corresponding to linear, quadratic and cubic
19
- * beziers respectively. Each point is a two-element array (ordered pair), the
20
- * first of which is the x-coordinate and the second the y-coordinate.
21
- *
22
- * @param maxCurviness The maximum value the 'curviness' of a curve can have
23
- * before an additional MAT point is inserted in between. Defaults to 0.4.
24
- * (Curviness is measured as the total angle in radians between the consecutive
25
- * vectors formed by the ordered control points of th bezier curve). The value
26
- * is clipped in the range `[0.05,3]`.
27
- * @param maxLength The maximum length a curve can have before an additional MAT
28
- * point is inserted. This value is scaled to a reference 1024 x 1024
29
- * grid (e.g. if the shape fits in a 512 x 512 axis-aligned box the value will be
30
- * halved, e.g. from 10 to 5). Together with maxCurviness it represents a
31
- * tolerance for the accuracy of the MAT. Defaults to 4. The value is clipped
32
- * in [1,100].
33
- */
34
- function findMats(bezierLoops, maxCurviness = 0.4, maxLength = 4) {
35
- // if (typeof _debug_ !== 'undefined') { var timingStart = performance.now(); }
36
- let maxCoordinate;
37
- let minBezLength;
38
- ({ maxCurviness, maxLength, maxCoordinate, minBezLength } =
39
- getSizeParams(bezierLoops, maxCurviness, maxLength));
40
- const loopss = simplifyPaths(bezierLoops, maxCoordinate);
41
- const mats = [];
42
- for (const loops of loopss) {
43
- const mat = findMat(loops, minBezLength, maxCurviness, maxLength, maxCoordinate);
44
- if (mat) {
45
- mats.push(mat);
46
- }
47
- }
48
- return mats;
49
- }
50
- function getSizeParams(bezierLoops, maxCurviness, maxLength) {
51
- // Gather some shape metrics
52
- const { maxCoordinate, maxRadius } = getLoopsMetrics(bezierLoops);
53
- const expMax = Math.ceil(Math.log2(maxCoordinate));
54
- const minBezLengthSigBits = 14;
55
- /**
56
- * If a curve is shorter than this value then no points on it will be
57
- * selected for the purpose of finding the MAT.
58
- */
59
- const minBezLength = 2 ** expMax * 2 ** (-minBezLengthSigBits);
60
- // Limit the tolerance to a reasonable level
61
- if (maxCurviness < 0.05) {
62
- maxCurviness = 0.05;
63
- }
64
- if (maxCurviness > 3) {
65
- maxCurviness = 3;
66
- }
67
- // Limit the tolerance to a reasonable level
68
- if (maxLength < 0.1) {
69
- maxLength = 0.1;
70
- }
71
- if (maxLength > 100) {
72
- maxLength = 100;
73
- }
74
- // Adjust length tolerance according to a reference max coordinate
75
- const expMaxRadius = Math.ceil(Math.log2(maxRadius));
76
- const maxLengthSigBits = 10; // 1024 x 1024
77
- maxLength = maxLength * (2 ** expMaxRadius * 2 ** (-maxLengthSigBits));
78
- return { maxCurviness, maxLength, maxCoordinate, minBezLength };
79
- }
80
- /**
81
- * @hidden
82
- * Find the MAT of the given loops.
83
- * @param loops The loops (that as a precondition must be ordered from highest
84
- * (i.e. smallest y-value) topmost point loops to lowest)
85
- */
86
- function findMat(loops, minBezLength, maxCurviness, maxLength, maxCoordinate) {
87
- addDebugInfo1(loops);
88
- // Gets interesting points on the shape, i.e. those that makes sense to use
89
- // for the 2-prong procedure.
90
- const pointsPerLoop = loops.map(getInterestingPointsOnLoop(minBezLength, maxCurviness, maxLength));
91
- const for2ProngsPerLoop = getPotential2Prongs(pointsPerLoop);
92
- const sharpCornersPerLoop = getSharpCorners(pointsPerLoop);
93
- const cpTrees = new Map();
94
- let cpNode = createInitialCpGraph(loops, cpTrees, sharpCornersPerLoop);
95
- findAndAddHoleClosing2Prongs(loops, cpTrees, maxCoordinate);
96
- if (typeof _debug_ !== 'undefined') {
97
- if (_debug_.directives.stopAfterHoleClosers) {
98
- return undefined;
99
- }
100
- }
101
- addDebugInfo2();
102
- cpNode = findAndAdd2ProngsOnAllPaths(loops, cpTrees, for2ProngsPerLoop, maxCoordinate);
103
- addDebugInfo3();
104
- if (typeof _debug_ !== 'undefined') {
105
- if (_debug_.directives.stopAfterTwoProngs) {
106
- return undefined;
107
- }
108
- }
109
- if (cpNode === undefined) {
110
- return undefined;
111
- }
112
- findAndAddAll3Prongs(cpTrees, cpNode, maxCoordinate);
113
- if (typeof _debug_ !== 'undefined') {
114
- if (_debug_.directives.stopAfterThreeProngs) {
115
- return undefined;
116
- }
117
- }
118
- const mat = { cpNode, cpTrees };
119
- addDebugInfo4(mat);
120
- return mat;
121
- }
122
- export { findMats };
1
+ import { simplifyPaths } from 'flo-boolean';
2
+ import { findAndAddAll3Prongs } from './mat/find-mat/find-and-add-3-prongs.js';
3
+ import { createInitialCpGraph } from './mat/find-mat/create-initial-cp-graph.js';
4
+ import { addDebugInfo1, addDebugInfo2, addDebugInfo3, addDebugInfo4 } from './mat/find-mat/add-debug-info.js';
5
+ import { getPotential2Prongs } from './mat/find-mat/get-potential-2-prongs.js';
6
+ import { getSharpCorners } from './mat/find-mat/get-sharp-corners.js';
7
+ import { findAndAdd2ProngsOnAllPaths } from './mat/find-mat/find-and-add-2-prongs-on-all-paths.js';
8
+ import { getInterestingPointsOnLoop } from './mat/find-mat/create-get-interesting-points-on-loop.js';
9
+ import { findAndAddHoleClosing2Prongs } from './mat/find-mat/find-and-add-hole-closing-2-prongs.js';
10
+ import { getLoopsMetrics } from './loop/get-max-coordinate.js';
11
+ /**
12
+ * Finds and returns the Medial Axis Transforms (MATs) from the given array of
13
+ * bezier loops representing shape boundaries.
14
+ *
15
+ * @param bezierLoops An array of (possibly intersecting) loops with each loop
16
+ * representing one or more piecewise smooth closed curves (i.e. shapes). Each
17
+ * loop consists of an array of beziers represented by an array of control
18
+ * points with 2,3 or 4 elements corresponding to linear, quadratic and cubic
19
+ * beziers respectively. Each point is a two-element array (ordered pair), the
20
+ * first of which is the x-coordinate and the second the y-coordinate.
21
+ *
22
+ * @param maxCurviness The maximum value the 'curviness' of a curve can have
23
+ * before an additional MAT point is inserted in between. Defaults to 0.4.
24
+ * (Curviness is measured as the total angle in radians between the consecutive
25
+ * vectors formed by the ordered control points of th bezier curve). The value
26
+ * is clipped in the range `[0.05,3]`.
27
+ * @param maxLength The maximum length a curve can have before an additional MAT
28
+ * point is inserted. This value is scaled to a reference 1024 x 1024
29
+ * grid (e.g. if the shape fits in a 512 x 512 axis-aligned box the value will be
30
+ * halved, e.g. from 10 to 5). Together with maxCurviness it represents a
31
+ * tolerance for the accuracy of the MAT. Defaults to 4. The value is clipped
32
+ * in [1,100].
33
+ */
34
+ function findMats(bezierLoops, maxCurviness = 0.4, maxLength = 4) {
35
+ // if (typeof _debug_ !== 'undefined') { var timingStart = performance.now(); }
36
+ let maxCoordinate;
37
+ let minBezLength;
38
+ ({ maxCurviness, maxLength, maxCoordinate, minBezLength } =
39
+ getSizeParams(bezierLoops, maxCurviness, maxLength));
40
+ const loopss = simplifyPaths(bezierLoops, maxCoordinate);
41
+ const mats = [];
42
+ for (const loops of loopss) {
43
+ const mat = findMat(loops, minBezLength, maxCurviness, maxLength, maxCoordinate);
44
+ if (mat) {
45
+ mats.push(mat);
46
+ }
47
+ }
48
+ return mats;
49
+ }
50
+ function getSizeParams(bezierLoops, maxCurviness, maxLength) {
51
+ // Gather some shape metrics
52
+ const { maxCoordinate, maxRadius } = getLoopsMetrics(bezierLoops);
53
+ const expMax = Math.ceil(Math.log2(maxCoordinate));
54
+ const minBezLengthSigBits = 14;
55
+ /**
56
+ * If a curve is shorter than this value then no points on it will be
57
+ * selected for the purpose of finding the MAT.
58
+ */
59
+ const minBezLength = 2 ** expMax * 2 ** (-minBezLengthSigBits);
60
+ // Limit the tolerance to a reasonable level
61
+ if (maxCurviness < 0.05) {
62
+ maxCurviness = 0.05;
63
+ }
64
+ if (maxCurviness > 3) {
65
+ maxCurviness = 3;
66
+ }
67
+ // Limit the tolerance to a reasonable level
68
+ if (maxLength < 0.1) {
69
+ maxLength = 0.1;
70
+ }
71
+ if (maxLength > 100) {
72
+ maxLength = 100;
73
+ }
74
+ // Adjust length tolerance according to a reference max coordinate
75
+ const expMaxRadius = Math.ceil(Math.log2(maxRadius));
76
+ const maxLengthSigBits = 10; // 1024 x 1024
77
+ maxLength = maxLength * (2 ** expMaxRadius * 2 ** (-maxLengthSigBits));
78
+ return { maxCurviness, maxLength, maxCoordinate, minBezLength };
79
+ }
80
+ /**
81
+ * @hidden
82
+ * Find the MAT of the given loops.
83
+ * @param loops The loops (that as a precondition must be ordered from highest
84
+ * (i.e. smallest y-value) topmost point loops to lowest)
85
+ */
86
+ function findMat(loops, minBezLength, maxCurviness, maxLength, maxCoordinate) {
87
+ addDebugInfo1(loops);
88
+ // Gets interesting points on the shape, i.e. those that makes sense to use
89
+ // for the 2-prong procedure.
90
+ const pointsPerLoop = loops.map(getInterestingPointsOnLoop(minBezLength, maxCurviness, maxLength));
91
+ const for2ProngsPerLoop = getPotential2Prongs(pointsPerLoop);
92
+ const sharpCornersPerLoop = getSharpCorners(pointsPerLoop);
93
+ const cpTrees = new Map();
94
+ let cpNode = createInitialCpGraph(loops, cpTrees, sharpCornersPerLoop);
95
+ findAndAddHoleClosing2Prongs(loops, cpTrees, maxCoordinate);
96
+ if (typeof _debug_ !== 'undefined') {
97
+ if (_debug_.directives.stopAfterHoleClosers) {
98
+ return undefined;
99
+ }
100
+ }
101
+ addDebugInfo2();
102
+ cpNode = findAndAdd2ProngsOnAllPaths(loops, cpTrees, for2ProngsPerLoop, maxCoordinate);
103
+ addDebugInfo3();
104
+ if (typeof _debug_ !== 'undefined') {
105
+ if (_debug_.directives.stopAfterTwoProngs) {
106
+ return undefined;
107
+ }
108
+ }
109
+ if (cpNode === undefined) {
110
+ return undefined;
111
+ }
112
+ findAndAddAll3Prongs(cpTrees, cpNode, maxCoordinate);
113
+ if (typeof _debug_ !== 'undefined') {
114
+ if (_debug_.directives.stopAfterThreeProngs) {
115
+ return undefined;
116
+ }
117
+ }
118
+ const mat = { cpNode, cpTrees };
119
+ addDebugInfo4(mat);
120
+ return mat;
121
+ }
122
+ export { findMats };
123
123
  //# sourceMappingURL=find-mats.js.map
@@ -1,9 +1,9 @@
1
- import { BezierPiece } from 'flo-bezier3';
2
- import { CpNode } from './cp-node.js';
3
- /**
4
- * Returns the ordered bezier curves from this CpNode to the next CpNode
5
- * on the boundary.
6
- * @param cpNode
7
- */
8
- declare function getBoundaryBezierPartsToNext(cpNode: CpNode): BezierPiece[];
9
- export { getBoundaryBezierPartsToNext };
1
+ import { BezierPiece } from 'flo-bezier3';
2
+ import { CpNode } from './cp-node.js';
3
+ /**
4
+ * Returns the ordered bezier curves from this CpNode to the next CpNode
5
+ * on the boundary.
6
+ * @param cpNode
7
+ */
8
+ declare function getBoundaryBezierPartsToNext(cpNode: CpNode): BezierPiece[];
9
+ export { getBoundaryBezierPartsToNext };
@@ -1,43 +1,43 @@
1
- /**
2
- * Returns the ordered bezier curves from this CpNode to the next CpNode
3
- * on the boundary.
4
- * @param cpNode
5
- */
6
- function getBoundaryBezierPartsToNext(cpNode) {
7
- const cpThis = cpNode;
8
- const cpNext = cpNode.next;
9
- const posThis = cpThis.cp.pointOnShape;
10
- const posNext = cpNext.cp.pointOnShape;
11
- const curveThis = posThis.curve;
12
- const curveNext = posNext.curve;
13
- if (curveThis.loop !== curveNext.loop) {
14
- // It is a hole-closer going over to the other loop - a kind of terminal
15
- // CpNode.
16
- return undefined;
17
- }
18
- const bezierParts = [];
19
- if (curveNext === curveThis) {
20
- bezierParts.push({ ps: posThis.curve.ps, ts: [posThis.t, posNext.t] });
21
- }
22
- else {
23
- bezierParts.push({ ps: posThis.curve.ps, ts: [posThis.t, 1] });
24
- addSkippedBeziers(bezierParts, posThis.curve, posNext.curve, posNext.t);
25
- }
26
- return bezierParts;
27
- }
28
- /**
29
- * @hidden
30
- * Adds pieces of skipped beziers.
31
- */
32
- function addSkippedBeziers(bezierParts, curveStart, curveEnd, t1) {
33
- let curveThis = curveStart;
34
- do {
35
- curveThis = curveThis.next;
36
- const bezierPart = curveThis === curveEnd
37
- ? { ps: curveThis.ps, ts: [0, t1] }
38
- : { ps: curveThis.ps, ts: [0, 1] };
39
- bezierParts.push(bezierPart);
40
- } while (curveThis !== curveEnd);
41
- }
42
- export { getBoundaryBezierPartsToNext };
1
+ /**
2
+ * Returns the ordered bezier curves from this CpNode to the next CpNode
3
+ * on the boundary.
4
+ * @param cpNode
5
+ */
6
+ function getBoundaryBezierPartsToNext(cpNode) {
7
+ const cpThis = cpNode;
8
+ const cpNext = cpNode.next;
9
+ const posThis = cpThis.cp.pointOnShape;
10
+ const posNext = cpNext.cp.pointOnShape;
11
+ const curveThis = posThis.curve;
12
+ const curveNext = posNext.curve;
13
+ if (curveThis.loop !== curveNext.loop) {
14
+ // It is a hole-closer going over to the other loop - a kind of terminal
15
+ // CpNode.
16
+ return undefined;
17
+ }
18
+ const bezierParts = [];
19
+ if (curveNext === curveThis) {
20
+ bezierParts.push({ ps: posThis.curve.ps, ts: [posThis.t, posNext.t] });
21
+ }
22
+ else {
23
+ bezierParts.push({ ps: posThis.curve.ps, ts: [posThis.t, 1] });
24
+ addSkippedBeziers(bezierParts, posThis.curve, posNext.curve, posNext.t);
25
+ }
26
+ return bezierParts;
27
+ }
28
+ /**
29
+ * @hidden
30
+ * Adds pieces of skipped beziers.
31
+ */
32
+ function addSkippedBeziers(bezierParts, curveStart, curveEnd, t1) {
33
+ let curveThis = curveStart;
34
+ do {
35
+ curveThis = curveThis.next;
36
+ const bezierPart = curveThis === curveEnd
37
+ ? { ps: curveThis.ps, ts: [0, t1] }
38
+ : { ps: curveThis.ps, ts: [0, 1] };
39
+ bezierParts.push(bezierPart);
40
+ } while (curveThis !== curveEnd);
41
+ }
42
+ export { getBoundaryBezierPartsToNext };
43
43
  //# sourceMappingURL=get-boundary-bezier-parts-to-next.js.map
@@ -1,8 +1,8 @@
1
- import { CpNode } from './cp-node.js';
2
- /**
3
- * Returns the ordered bezier curves from this CpNode to the next CpNode
4
- * on the boundary.
5
- * @param cpNode
6
- */
7
- declare function getBoundaryBeziersToNext(cpNode: CpNode): number[][][];
8
- export { getBoundaryBeziersToNext };
1
+ import { CpNode } from './cp-node.js';
2
+ /**
3
+ * Returns the ordered bezier curves from this CpNode to the next CpNode
4
+ * on the boundary.
5
+ * @param cpNode
6
+ */
7
+ declare function getBoundaryBeziersToNext(cpNode: CpNode): number[][][];
8
+ export { getBoundaryBeziersToNext };