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,98 +1,98 @@
1
- import { orient2d } from 'big-float-ts';
2
- import { dot } from "flo-vector2d";
3
- import { compareCurvaturesAtInterface } from "./compare-curvatures-at-interface.js";
4
- /**
5
- * Returns a positive value if the second bezier (of order 1, 2 or 3) curves
6
- * anti-clockwise with respect to the first at the point where the first bezier
7
- * ends and the second one starts. Returns a negative number if the turn is
8
- * clockwise. Returns 0 otherwise.
9
- *
10
- * The algorithm is a generalization of `ccw`, a.k.a `orient2d`.
11
- *
12
- * The above obviously necessitates that their endpoints coincide as described.
13
- *
14
- * Preconditions (for robustness):
15
- * * The beziers has control points with max bit-length of 25 and bit-aligned.
16
- * * The bezier does not have infinite curvature at either endpoint
17
- *
18
- * This is so the vectors between control points can be
19
- * calculated exactly without resorting to adaptive infinite precision floating
20
- * point operations. Note: aligned to 'grid' here means if you bitwise-and all
21
- * values together the resulting bitlength === the max bithlength of any value.
22
- *
23
- * @param psI The incoming bezier that ends at the interface
24
- * @param psO The outgoing bezier that starts at the interface
25
- */
26
- // TODO - improve and make at least 46-bitlength precondition
27
- function getInterfaceCcw(psI, psO) {
28
- const lenI = psI.length;
29
- // second last control point of incoming curve
30
- const p0 = psI[lenI - 2];
31
- // last control point of incoming curve / first control point of outgoing
32
- const p1 = psO[0];
33
- // second control point of outgoing curve
34
- const p2 = psO[1];
35
- /*
36
- if (typeof _bez_debug_ !== 'undefined') {
37
- let maxBitLength = 25;
38
- let p1_ = psI[lenI-1];
39
- // ---- precondition: does endpoints coincide
40
- if (p1_[0] !== p1[0] || p1_[1] !== p1[1]) {
41
- throw new Error('Curve endpoints must coincide.');
42
- }
43
- // ---- precondition: are coordinates grid-aligned
44
- // Get all coordinate values into an array
45
- let xs: number[] = [];
46
- [psI, psO].forEach(ps => ps.forEach(p => p.forEach(x => {
47
- xs.push(x);
48
- })));
49
-
50
- let msb = xs.reduce((prevX, x) => Math.max(prevX, msbExponent(x)), Number.NEGATIVE_INFINITY);
51
- let lsb = xs.reduce((prevX, x) => Math.min(prevX, lsbExponent(x)), Number.POSITIVE_INFINITY);
52
- let bitlengthAll = msb - lsb + 1;
53
- if (bitlengthAll > maxBitLength) {
54
- throw new Error(
55
- `Curve control point coordinates must be bit-aligned and <= ${maxBitLength}. bitlength === ${bitlengthAll}, coordinates: ${xs}`
56
- );
57
- }
58
- }
59
- */
60
- // Max one bit can be added in the calculations below due to bit-alignment
61
- const xE = p1[0] - p0[0]; // tangent x-coordinate
62
- const yE = p1[1] - p0[1]; // tangent y-coordinate
63
- const xS = p2[0] - p1[0]; // tangent x-coordinate
64
- const yS = p2[1] - p1[1]; // tangent y-coordinate
65
- // If the tangent is to be found at t === 0 or t === 1 then using a basic
66
- // property of bezier curves we can find the tangents easily as below
67
- // (non-normalized) tangent of incoming curve at t === 1
68
- const tangentAtEnd = [xE, yE];
69
- // (non-normalized) tangent of outgoing curve at t === 0
70
- const tangentAtStart = [xS, yS];
71
- // The cross calculated below will have a max bitlength of
72
- // (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
73
- // If the preconditions are met it is exact
74
- //let crossTangents = cross(tangentAtEnd, tangentAtStart);
75
- // The cross below is exact by adaptive infinite precision
76
- const crossTangents = orient2d(p0, p1, p2);
77
- if (crossTangents !== 0) {
78
- return crossTangents;
79
- }
80
- // The dot calculated below will have a max bitlength of
81
- // (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
82
- // If the preconditions are met it is exact
83
- const dotTangents = dot(tangentAtEnd, tangentAtStart);
84
- if (dotTangents > 0) {
85
- // Curves go in same direction at interface - neither clock or
86
- // anti-clockwise.
87
- // Note: The above comment is not strictly true but as this case is not
88
- // important for the algorithm we return 0
89
- return 0;
90
- }
91
- // Curves go in opposite directions at interface starting off with the exact
92
- // same tangent - look now at curvature to see which has the largest
93
- // curvature so we can base the clock or anti-clockwise result on that
94
- // Look at curvature
95
- return compareCurvaturesAtInterface(psI.slice().reverse(), psO);
96
- }
97
- export { getInterfaceCcw };
1
+ import { orient2d } from 'big-float-ts';
2
+ import { dot } from "flo-vector2d";
3
+ import { compareCurvaturesAtInterface } from "./compare-curvatures-at-interface.js";
4
+ /**
5
+ * Returns a positive value if the second bezier (of order 1, 2 or 3) curves
6
+ * anti-clockwise with respect to the first at the point where the first bezier
7
+ * ends and the second one starts. Returns a negative number if the turn is
8
+ * clockwise. Returns 0 otherwise.
9
+ *
10
+ * The algorithm is a generalization of `ccw`, a.k.a `orient2d`.
11
+ *
12
+ * The above obviously necessitates that their endpoints coincide as described.
13
+ *
14
+ * Preconditions (for robustness):
15
+ * * The beziers has control points with max bit-length of 25 and bit-aligned.
16
+ * * The bezier does not have infinite curvature at either endpoint
17
+ *
18
+ * This is so the vectors between control points can be
19
+ * calculated exactly without resorting to adaptive infinite precision floating
20
+ * point operations. Note: aligned to 'grid' here means if you bitwise-and all
21
+ * values together the resulting bitlength === the max bithlength of any value.
22
+ *
23
+ * @param psI The incoming bezier that ends at the interface
24
+ * @param psO The outgoing bezier that starts at the interface
25
+ */
26
+ // TODO - improve and make at least 46-bitlength precondition
27
+ function getInterfaceCcw(psI, psO) {
28
+ const lenI = psI.length;
29
+ // second last control point of incoming curve
30
+ const p0 = psI[lenI - 2];
31
+ // last control point of incoming curve / first control point of outgoing
32
+ const p1 = psO[0];
33
+ // second control point of outgoing curve
34
+ const p2 = psO[1];
35
+ /*
36
+ if (typeof _bez_debug_ !== 'undefined') {
37
+ let maxBitLength = 25;
38
+ let p1_ = psI[lenI-1];
39
+ // ---- precondition: does endpoints coincide
40
+ if (p1_[0] !== p1[0] || p1_[1] !== p1[1]) {
41
+ throw new Error('Curve endpoints must coincide.');
42
+ }
43
+ // ---- precondition: are coordinates grid-aligned
44
+ // Get all coordinate values into an array
45
+ let xs: number[] = [];
46
+ [psI, psO].forEach(ps => ps.forEach(p => p.forEach(x => {
47
+ xs.push(x);
48
+ })));
49
+
50
+ let msb = xs.reduce((prevX, x) => Math.max(prevX, msbExponent(x)), Number.NEGATIVE_INFINITY);
51
+ let lsb = xs.reduce((prevX, x) => Math.min(prevX, lsbExponent(x)), Number.POSITIVE_INFINITY);
52
+ let bitlengthAll = msb - lsb + 1;
53
+ if (bitlengthAll > maxBitLength) {
54
+ throw new Error(
55
+ `Curve control point coordinates must be bit-aligned and <= ${maxBitLength}. bitlength === ${bitlengthAll}, coordinates: ${xs}`
56
+ );
57
+ }
58
+ }
59
+ */
60
+ // Max one bit can be added in the calculations below due to bit-alignment
61
+ const xE = p1[0] - p0[0]; // tangent x-coordinate
62
+ const yE = p1[1] - p0[1]; // tangent y-coordinate
63
+ const xS = p2[0] - p1[0]; // tangent x-coordinate
64
+ const yS = p2[1] - p1[1]; // tangent y-coordinate
65
+ // If the tangent is to be found at t === 0 or t === 1 then using a basic
66
+ // property of bezier curves we can find the tangents easily as below
67
+ // (non-normalized) tangent of incoming curve at t === 1
68
+ const tangentAtEnd = [xE, yE];
69
+ // (non-normalized) tangent of outgoing curve at t === 0
70
+ const tangentAtStart = [xS, yS];
71
+ // The cross calculated below will have a max bitlength of
72
+ // (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
73
+ // If the preconditions are met it is exact
74
+ //let crossTangents = cross(tangentAtEnd, tangentAtStart);
75
+ // The cross below is exact by adaptive infinite precision
76
+ const crossTangents = orient2d(p0, p1, p2);
77
+ if (crossTangents !== 0) {
78
+ return crossTangents;
79
+ }
80
+ // The dot calculated below will have a max bitlength of
81
+ // (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
82
+ // If the preconditions are met it is exact
83
+ const dotTangents = dot(tangentAtEnd, tangentAtStart);
84
+ if (dotTangents > 0) {
85
+ // Curves go in same direction at interface - neither clock or
86
+ // anti-clockwise.
87
+ // Note: The above comment is not strictly true but as this case is not
88
+ // important for the algorithm we return 0
89
+ return 0;
90
+ }
91
+ // Curves go in opposite directions at interface starting off with the exact
92
+ // same tangent - look now at curvature to see which has the largest
93
+ // curvature so we can base the clock or anti-clockwise result on that
94
+ // Look at curvature
95
+ return compareCurvaturesAtInterface(psI.slice().reverse(), psO);
96
+ }
97
+ export { getInterfaceCcw };
98
98
  //# sourceMappingURL=get-interface-ccw.js.map
package/node/index.d.ts CHANGED
@@ -1,36 +1,36 @@
1
- import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
2
- import { Mat } from './mat.js';
3
- import { Loop } from './loop.js';
4
- import { Curve } from './curve.js';
5
- import { CpNode } from './cp-node.js';
6
- import { PointOnShape, IPointOnShape } from './point-on-shape.js';
7
- import { Circle } from './circle.js';
8
- import { ContactPoint } from './contact-point.js';
9
- import { BezierPiece } from './mat/bezier-piece.js';
10
- import { findMats } from './find-mats.js';
11
- import { trimMat } from './mat/trim-mat.js';
12
- import { toScaleAxis } from './to-scale-axis.js';
13
- import { traverseEdges } from './traverse-edges.js';
14
- import { getBranches } from './get-branches.js';
15
- import { traverseVertices } from './traverse-vertices.js';
16
- import { Debug, enableDebugForMat } from './debug/debug.js';
17
- import { drawBranch } from './debug/functions/draw-elem/branch.js';
18
- import { drawMat } from './debug/functions/draw-elem/mat.js';
19
- import { IDebugElems } from './debug/debug-elem-types.js';
20
- import { TDrawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
21
- import { ICpNodeForDebugging } from './debug/cp-node-for-debugging.js';
22
- import { ITiming } from './debug/debug.js';
23
- import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
24
- import { getShapeBounds } from './svg/get-shape-bounds.js';
25
- import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
26
- import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
27
- import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
28
- import { simplifyMat } from './simplify-mat.js';
29
- import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
30
- import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
31
- import { getCurveToNext } from './get-curve-to-next.js';
32
- import { getCurveBetween } from './get-curve/get-curve-between.js';
33
- import { sweepLine } from './sweep-line/sweep-line.js';
34
- import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
35
- import { loopFromBeziers } from './loop.js';
36
- export { Mat, PointOnShape, IPointOnShape, Curve, Loop, CpNode, Circle, ContactPoint, BezierPiece, findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly, beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat, getClosestBoundaryPoint, getCurveToNext, getCurveBetween, Debug, IDebugElems, TDrawElemFunctions, ICpNodeForDebugging, ITiming, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
1
+ import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
2
+ import { Mat } from './mat.js';
3
+ import { Loop } from './loop.js';
4
+ import { Curve } from './curve.js';
5
+ import { CpNode } from './cp-node.js';
6
+ import { PointOnShape, IPointOnShape } from './point-on-shape.js';
7
+ import { Circle } from './circle.js';
8
+ import { ContactPoint } from './contact-point.js';
9
+ import { BezierPiece } from './mat/bezier-piece.js';
10
+ import { findMats } from './find-mats.js';
11
+ import { trimMat } from './mat/trim-mat.js';
12
+ import { toScaleAxis } from './to-scale-axis.js';
13
+ import { traverseEdges } from './traverse-edges.js';
14
+ import { getBranches } from './get-branches.js';
15
+ import { traverseVertices } from './traverse-vertices.js';
16
+ import { Debug, enableDebugForMat } from './debug/debug.js';
17
+ import { drawBranch } from './debug/functions/draw-elem/branch.js';
18
+ import { drawMat } from './debug/functions/draw-elem/mat.js';
19
+ import { IDebugElems } from './debug/debug-elem-types.js';
20
+ import { TDrawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
21
+ import { ICpNodeForDebugging } from './debug/cp-node-for-debugging.js';
22
+ import { ITiming } from './debug/debug.js';
23
+ import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
24
+ import { getShapeBounds } from './svg/get-shape-bounds.js';
25
+ import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
26
+ import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
27
+ import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
28
+ import { simplifyMat } from './simplify-mat.js';
29
+ import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
30
+ import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
31
+ import { getCurveToNext } from './get-curve-to-next.js';
32
+ import { getCurveBetween } from './get-curve/get-curve-between.js';
33
+ import { sweepLine } from './sweep-line/sweep-line.js';
34
+ import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
35
+ import { loopFromBeziers } from './loop.js';
36
+ export { Mat, PointOnShape, IPointOnShape, Curve, Loop, CpNode, Circle, ContactPoint, BezierPiece, findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly, beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat, getClosestBoundaryPoint, getCurveToNext, getCurveBetween, Debug, IDebugElems, TDrawElemFunctions, ICpNodeForDebugging, ITiming, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
package/node/index.js CHANGED
@@ -1,33 +1,33 @@
1
- import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
2
- import { CpNode } from './cp-node.js';
3
- import { PointOnShape } from './point-on-shape.js';
4
- import { findMats } from './find-mats.js';
5
- import { trimMat } from './mat/trim-mat.js';
6
- import { toScaleAxis } from './to-scale-axis.js';
7
- import { traverseEdges } from './traverse-edges.js';
8
- import { getBranches } from './get-branches.js';
9
- import { traverseVertices } from './traverse-vertices.js';
10
- import { enableDebugForMat } from './debug/debug.js';
11
- import { drawBranch } from './debug/functions/draw-elem/branch.js';
12
- import { drawMat } from './debug/functions/draw-elem/mat.js';
13
- import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
14
- import { getShapeBounds } from './svg/get-shape-bounds.js';
15
- import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
16
- import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
17
- import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
18
- import { simplifyMat } from './simplify-mat.js';
19
- import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
20
- import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
21
- import { getCurveToNext } from './get-curve-to-next.js';
22
- import { getCurveBetween } from './get-curve/get-curve-between.js';
23
- import { sweepLine } from './sweep-line/sweep-line.js';
24
- import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
25
- import { loopFromBeziers } from './loop.js';
26
- export { PointOnShape, CpNode,
27
- // Main functions
28
- findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly,
29
- // SVG functions
30
- beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat,
31
- // Other functions
32
- getClosestBoundaryPoint, getCurveToNext, getCurveBetween, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
1
+ import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
2
+ import { CpNode } from './cp-node.js';
3
+ import { PointOnShape } from './point-on-shape.js';
4
+ import { findMats } from './find-mats.js';
5
+ import { trimMat } from './mat/trim-mat.js';
6
+ import { toScaleAxis } from './to-scale-axis.js';
7
+ import { traverseEdges } from './traverse-edges.js';
8
+ import { getBranches } from './get-branches.js';
9
+ import { traverseVertices } from './traverse-vertices.js';
10
+ import { enableDebugForMat } from './debug/debug.js';
11
+ import { drawBranch } from './debug/functions/draw-elem/branch.js';
12
+ import { drawMat } from './debug/functions/draw-elem/mat.js';
13
+ import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
14
+ import { getShapeBounds } from './svg/get-shape-bounds.js';
15
+ import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
16
+ import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
17
+ import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
18
+ import { simplifyMat } from './simplify-mat.js';
19
+ import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
20
+ import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
21
+ import { getCurveToNext } from './get-curve-to-next.js';
22
+ import { getCurveBetween } from './get-curve/get-curve-between.js';
23
+ import { sweepLine } from './sweep-line/sweep-line.js';
24
+ import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
25
+ import { loopFromBeziers } from './loop.js';
26
+ export { PointOnShape, CpNode,
27
+ // Main functions
28
+ findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly,
29
+ // SVG functions
30
+ beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat,
31
+ // Other functions
32
+ getClosestBoundaryPoint, getCurveToNext, getCurveBetween, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
33
33
  //# sourceMappingURL=index.js.map
@@ -1,10 +1,10 @@
1
- /**
2
- * @hidden
3
- * Returns the maximum control point coordinate value (x or y) within any loop.
4
- * @param loops The array of loops
5
- */
6
- declare function getLoopsMetrics(loops: number[][][][]): {
7
- maxCoordinate: number;
8
- maxRadius: number;
9
- };
10
- export { getLoopsMetrics };
1
+ /**
2
+ * @hidden
3
+ * Returns the maximum control point coordinate value (x or y) within any loop.
4
+ * @param loops The array of loops
5
+ */
6
+ declare function getLoopsMetrics(loops: number[][][][]): {
7
+ maxCoordinate: number;
8
+ maxRadius: number;
9
+ };
10
+ export { getLoopsMetrics };
@@ -1,44 +1,44 @@
1
- const max = Math.max;
2
- const abs = Math.abs;
3
- /**
4
- * @hidden
5
- * Returns the maximum control point coordinate value (x or y) within any loop.
6
- * @param loops The array of loops
7
- */
8
- function getLoopsMetrics(loops) {
9
- let maxCoordinate = 0;
10
- let minX = Number.POSITIVE_INFINITY;
11
- let maxX = Number.NEGATIVE_INFINITY;
12
- let minY = Number.POSITIVE_INFINITY;
13
- let maxY = Number.NEGATIVE_INFINITY;
14
- for (const loop of loops) {
15
- for (const ps of loop) {
16
- for (const p of ps) {
17
- const x = p[0];
18
- const y = p[1];
19
- const c = max(abs(x), abs(y));
20
- if (c > maxCoordinate) {
21
- maxCoordinate = c;
22
- }
23
- if (x < minX) {
24
- minX = x;
25
- }
26
- if (x > maxX) {
27
- maxX = x;
28
- }
29
- if (y < minY) {
30
- minY = y;
31
- }
32
- if (y > maxY) {
33
- maxY = y;
34
- }
35
- }
36
- }
37
- }
38
- const width = maxX - minX;
39
- const height = maxY - minY;
40
- const maxRadius = max(width, height);
41
- return { maxCoordinate, maxRadius };
42
- }
43
- export { getLoopsMetrics };
1
+ const max = Math.max;
2
+ const abs = Math.abs;
3
+ /**
4
+ * @hidden
5
+ * Returns the maximum control point coordinate value (x or y) within any loop.
6
+ * @param loops The array of loops
7
+ */
8
+ function getLoopsMetrics(loops) {
9
+ let maxCoordinate = 0;
10
+ let minX = Number.POSITIVE_INFINITY;
11
+ let maxX = Number.NEGATIVE_INFINITY;
12
+ let minY = Number.POSITIVE_INFINITY;
13
+ let maxY = Number.NEGATIVE_INFINITY;
14
+ for (const loop of loops) {
15
+ for (const ps of loop) {
16
+ for (const p of ps) {
17
+ const x = p[0];
18
+ const y = p[1];
19
+ const c = max(abs(x), abs(y));
20
+ if (c > maxCoordinate) {
21
+ maxCoordinate = c;
22
+ }
23
+ if (x < minX) {
24
+ minX = x;
25
+ }
26
+ if (x > maxX) {
27
+ maxX = x;
28
+ }
29
+ if (y < minY) {
30
+ minY = y;
31
+ }
32
+ if (y > maxY) {
33
+ maxY = y;
34
+ }
35
+ }
36
+ }
37
+ }
38
+ const width = maxX - minX;
39
+ const height = maxY - minY;
40
+ const maxRadius = max(width, height);
41
+ return { maxCoordinate, maxRadius };
42
+ }
43
+ export { getLoopsMetrics };
44
44
  //# sourceMappingURL=get-max-coordinate.js.map
package/node/loop.d.ts CHANGED
@@ -1,16 +1,16 @@
1
- import { Curve } from './curve.js';
2
- /**
3
- * Represents a two-way linked loop of [[ICurve]]s - mostly used internally to
4
- * conveniently represent shape boundaries.
5
- */
6
- interface Loop {
7
- /** The curves that represent the shape boundary as an array. */
8
- curves: Curve[];
9
- /** A pre-ordered array of bezier curves to add initially.*/
10
- beziers: number[][][];
11
- }
12
- /**
13
- * @param beziers A pre-ordered array of bezier curves to add initially.
14
- */
15
- declare function loopFromBeziers(beziers?: number[][][]): Loop;
16
- export { Loop, loopFromBeziers };
1
+ import { Curve } from './curve.js';
2
+ /**
3
+ * Represents a two-way linked loop of [[ICurve]]s - mostly used internally to
4
+ * conveniently represent shape boundaries.
5
+ */
6
+ interface Loop {
7
+ /** The curves that represent the shape boundary as an array. */
8
+ curves: Curve[];
9
+ /** A pre-ordered array of bezier curves to add initially.*/
10
+ beziers: number[][][];
11
+ }
12
+ /**
13
+ * @param beziers A pre-ordered array of bezier curves to add initially.
14
+ */
15
+ declare function loopFromBeziers(beziers?: number[][][]): Loop;
16
+ export { Loop, loopFromBeziers };
package/node/loop.js CHANGED
@@ -1,35 +1,35 @@
1
- /**
2
- * @param beziers A pre-ordered array of bezier curves to add initially.
3
- */
4
- function loopFromBeziers(beziers = []) {
5
- const curves = [];
6
- const loop = {
7
- beziers,
8
- curves
9
- };
10
- if (!beziers.length) {
11
- return loop;
12
- }
13
- let prev;
14
- for (let i = 0; i < beziers.length; i++) {
15
- const curve = {
16
- loop,
17
- ps: beziers[i],
18
- prev,
19
- next: undefined,
20
- idx: i
21
- };
22
- if (prev) {
23
- prev.next = curve;
24
- }
25
- prev = curve;
26
- curves.push(curve);
27
- }
28
- // close loop
29
- const lastCurve = curves[curves.length - 1];
30
- curves[0].prev = lastCurve;
31
- lastCurve.next = curves[0];
32
- return loop;
33
- }
34
- export { loopFromBeziers };
1
+ /**
2
+ * @param beziers A pre-ordered array of bezier curves to add initially.
3
+ */
4
+ function loopFromBeziers(beziers = []) {
5
+ const curves = [];
6
+ const loop = {
7
+ beziers,
8
+ curves
9
+ };
10
+ if (!beziers.length) {
11
+ return loop;
12
+ }
13
+ let prev;
14
+ for (let i = 0; i < beziers.length; i++) {
15
+ const curve = {
16
+ loop,
17
+ ps: beziers[i],
18
+ prev,
19
+ next: undefined,
20
+ idx: i
21
+ };
22
+ if (prev) {
23
+ prev.next = curve;
24
+ }
25
+ prev = curve;
26
+ curves.push(curve);
27
+ }
28
+ // close loop
29
+ const lastCurve = curves[curves.length - 1];
30
+ curves[0].prev = lastCurve;
31
+ lastCurve.next = curves[0];
32
+ return loop;
33
+ }
34
+ export { loopFromBeziers };
35
35
  //# sourceMappingURL=loop.js.map
@@ -1,16 +1,16 @@
1
- import { LlRbTree } from 'flo-ll-rb-tree';
2
- import { Loop } from '../loop.js';
3
- import { Circle } from '../circle.js';
4
- import { IPointOnShape } from '../point-on-shape.js';
5
- import { CpNode } from '../cp-node.js';
6
- /**
7
- * @hidden
8
- * @param circle
9
- * @param orders
10
- * @param cpTrees
11
- * @param poss
12
- * @param neighbors
13
- * @hidden
14
- */
15
- declare function addToCpGraph(circle: Circle, orders: number[], cpTrees: Map<Loop, LlRbTree<CpNode>>, poss: IPointOnShape[], neighbors?: CpNode[][]): void;
16
- export { addToCpGraph };
1
+ import { LlRbTree } from 'flo-ll-rb-tree';
2
+ import { Loop } from '../loop.js';
3
+ import { Circle } from '../circle.js';
4
+ import { IPointOnShape } from '../point-on-shape.js';
5
+ import { CpNode } from '../cp-node.js';
6
+ /**
7
+ * @hidden
8
+ * @param circle
9
+ * @param orders
10
+ * @param cpTrees
11
+ * @param poss
12
+ * @param neighbors
13
+ * @hidden
14
+ */
15
+ declare function addToCpGraph(circle: Circle, orders: number[], cpTrees: Map<Loop, LlRbTree<CpNode>>, poss: IPointOnShape[], neighbors?: CpNode[][]): void;
16
+ export { addToCpGraph };
@@ -1,31 +1,31 @@
1
- import { CpNode } from '../cp-node.js';
2
- import { getNeighbouringPoints } from './get-neighboring-cps.js';
3
- /**
4
- * @hidden
5
- * @param circle
6
- * @param orders
7
- * @param cpTrees
8
- * @param poss
9
- * @param neighbors
10
- * @hidden
11
- */
12
- function addToCpGraph(circle, orders, cpTrees, poss, neighbors) {
13
- const newCps = poss.map((pos, i) => {
14
- const cpTree = cpTrees.get(pos.curve.loop);
15
- const newCp_ = { pointOnShape: pos, circle, order: orders[i], order2: 0 };
16
- const neighboringCp = neighbors
17
- ? neighbors[i]
18
- : getNeighbouringPoints(cpTree, pos, orders[i], 0);
19
- const newCp = CpNode.insert(false, false, cpTree, newCp_, neighboringCp[0]);
20
- return newCp;
21
- });
22
- const len = poss.length;
23
- for (let i = 0; i < len; i++) {
24
- const indxPrev = i === 0 ? len - 1 : i - 1;
25
- const indxNext = i === len - 1 ? 0 : i + 1;
26
- newCps[i].prevOnCircle = newCps[indxPrev];
27
- newCps[i].nextOnCircle = newCps[indxNext];
28
- }
29
- }
30
- export { addToCpGraph };
1
+ import { CpNode } from '../cp-node.js';
2
+ import { getNeighbouringPoints } from './get-neighboring-cps.js';
3
+ /**
4
+ * @hidden
5
+ * @param circle
6
+ * @param orders
7
+ * @param cpTrees
8
+ * @param poss
9
+ * @param neighbors
10
+ * @hidden
11
+ */
12
+ function addToCpGraph(circle, orders, cpTrees, poss, neighbors) {
13
+ const newCps = poss.map((pos, i) => {
14
+ const cpTree = cpTrees.get(pos.curve.loop);
15
+ const newCp_ = { pointOnShape: pos, circle, order: orders[i], order2: 0 };
16
+ const neighboringCp = neighbors
17
+ ? neighbors[i]
18
+ : getNeighbouringPoints(cpTree, pos, orders[i], 0);
19
+ const newCp = CpNode.insert(false, false, cpTree, newCp_, neighboringCp[0]);
20
+ return newCp;
21
+ });
22
+ const len = poss.length;
23
+ for (let i = 0; i < len; i++) {
24
+ const indxPrev = i === 0 ? len - 1 : i - 1;
25
+ const indxNext = i === len - 1 ? 0 : i + 1;
26
+ newCps[i].prevOnCircle = newCps[indxPrev];
27
+ newCps[i].nextOnCircle = newCps[indxNext];
28
+ }
29
+ }
30
+ export { addToCpGraph };
31
31
  //# sourceMappingURL=add-to-cp-graph.js.map