flo-mat 3.0.10 → 3.0.12

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 (183) hide show
  1. package/__tests__/jsog/check-jsog-eql-calc.spec.ts +81 -0
  2. package/__tests__/jsog/decode-jsog.ts +85 -0
  3. package/__tests__/jsog/get-mats1.ts +41 -0
  4. package/__tests__/{cp-node/fs → jsog}/mat-dummys.ts +51 -564
  5. package/__tests__/jsog/to-jsog-breath-first.ts +107 -0
  6. package/__tests__/jsog/to-jsog-depth-first.ts +55 -0
  7. package/browser/index.js +126 -84
  8. package/browser/index.min.js +1 -1
  9. package/node/add-n-prong.ts/join-spokes.js.map +1 -1
  10. package/node/closest-boundary-point/dd-deflate-with-running-error.js.map +1 -1
  11. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  12. package/node/contact-point/contact-point.js.map +1 -1
  13. package/node/corner/get-corner.js.map +1 -1
  14. package/node/corner/get-interface-ccw.js.map +1 -1
  15. package/node/cp-node/cp-node-fs.d.ts +2 -1
  16. package/node/cp-node/cp-node-fs.js +1 -2
  17. package/node/cp-node/cp-node-fs.js.map +1 -1
  18. package/node/cp-node/fs/cp-node-comparator.d.ts +3 -0
  19. package/node/cp-node/fs/cp-node-comparator.js +6 -0
  20. package/node/cp-node/fs/cp-node-comparator.js.map +1 -0
  21. package/node/cp-node/fs/find-first.js.map +1 -1
  22. package/node/cp-node/fs/get-all-on-loop.js.map +1 -1
  23. package/node/cp-node/fs/get-branch-beziers.js.map +1 -1
  24. package/node/cp-node/fs/get-branch.js.map +1 -1
  25. package/node/cp-node/fs/get-children.js.map +1 -1
  26. package/node/cp-node/fs/get-first-exit.js.map +1 -1
  27. package/node/cp-node/fs/get-mat-curve-to-next.js.map +1 -1
  28. package/node/cp-node/fs/get-mat-curves-between.js.map +1 -1
  29. package/node/cp-node/fs/get-prong-count.js.map +1 -1
  30. package/node/cp-node/fs/get-real-prong-count.js.map +1 -1
  31. package/node/cp-node/fs/get-vertex-forward-children.js.map +1 -1
  32. package/node/cp-node/fs/is-fully-terminating.d.ts +1 -1
  33. package/node/cp-node/fs/is-fully-terminating.js.map +1 -1
  34. package/node/cp-node/fs/is-one-prong.js.map +1 -1
  35. package/node/cp-node/fs/is-sharp.js.map +1 -1
  36. package/node/cp-node/fs/is-terminating.js.map +1 -1
  37. package/node/cp-node/fs/traverse-cp.js.map +1 -1
  38. package/node/cp-node/fs/traverse-edges.js.map +1 -1
  39. package/node/cp-node/fs/traverse-vertices.js.map +1 -1
  40. package/node/debug/functions/draw-elem/bounding-hull.js.map +1 -1
  41. package/node/debug/functions/draw-elem/draw-cp-node.js +1 -1
  42. package/node/debug/functions/draw-elem/draw-cp-node.js.map +1 -1
  43. package/node/debug/functions/draw-elem/draw-cull.js.map +1 -1
  44. package/node/debug/functions/draw-elem/draw-dull-corner.js.map +1 -1
  45. package/node/debug/functions/draw-elem/draw-elem.js.map +1 -1
  46. package/node/debug/functions/draw-elem/draw-leaves.js.map +1 -1
  47. package/node/debug/functions/draw-elem/draw-loose-bounding-box.js.map +1 -1
  48. package/node/debug/functions/draw-elem/draw-max-vertex.js.map +1 -1
  49. package/node/debug/functions/draw-elem/draw-min-y.js.map +1 -1
  50. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js.map +1 -1
  51. package/node/debug/functions/draw-elem/draw-one-prong.js.map +1 -1
  52. package/node/debug/functions/draw-elem/draw-sharp-corner.js.map +1 -1
  53. package/node/debug/functions/draw-elem/draw-speed.js.map +1 -1
  54. package/node/debug/functions/draw-elem/draw-three-prong.js.map +1 -1
  55. package/node/debug/functions/draw-elem/draw-tight-bounding-box.js.map +1 -1
  56. package/node/debug/functions/draw-elem/draw-two-prong.js.map +1 -1
  57. package/node/debug/functions/draw-elem/draw-vertex.js.map +1 -1
  58. package/node/debug/functions/general.js.map +1 -1
  59. package/node/find-2-prong/add-1-prong.js.map +1 -1
  60. package/node/find-2-prong/find-2-prong.d.ts +1 -0
  61. package/node/find-2-prong/find-2-prong.js +2 -1
  62. package/node/find-2-prong/find-2-prong.js.map +1 -1
  63. package/node/find-2-prong/find-equidistant-point-on-line-dd.js.map +1 -1
  64. package/node/find-3-prong.ts/find-3-prong.js.map +1 -1
  65. package/node/find-3-prong.ts/find-and-add-3-prong.js.map +1 -1
  66. package/node/find-3-prong.ts/find-and-add-3-prongs.js.map +1 -1
  67. package/node/find-mat/find-mats.js.map +1 -1
  68. package/node/find-mat/mat-options.js +1 -1
  69. package/node/find-mat/mat-options.js.map +1 -1
  70. package/node/geometry/get-closest-square-distance-to-rect.js.map +1 -1
  71. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
  72. package/node/index.d.ts +35 -1
  73. package/node/index.js +36 -1
  74. package/node/index.js.map +1 -1
  75. package/node/mat/create-new-cp-tree.js.map +1 -1
  76. package/node/mat/get-largest-vertex.js.map +1 -1
  77. package/node/mat/trim-mat.js.map +1 -1
  78. package/node/memoize-primitive.js.map +1 -1
  79. package/node/sat/add-debug-info.js.map +1 -1
  80. package/node/sat/get-leaves.js.map +1 -1
  81. package/node/svg/get-loop-bounds.js.map +1 -1
  82. package/node/svg/get-min-y-pos.js.map +1 -1
  83. package/node/sweep-line/sweep-line.js.map +1 -1
  84. package/package.json +4 -4
  85. package/src/add-n-prong.ts/join-spokes.ts +11 -11
  86. package/src/closest-boundary-point/dd-deflate-with-running-error.ts +22 -22
  87. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +38 -38
  88. package/src/contact-point/contact-point.ts +13 -13
  89. package/src/corner/get-corner.ts +39 -39
  90. package/src/corner/get-interface-ccw.ts +3 -3
  91. package/src/cp-node/cp-node-fs.ts +132 -135
  92. package/src/cp-node/cp-node.ts +30 -30
  93. package/src/cp-node/fs/clone.ts +4 -4
  94. package/src/cp-node/fs/cp-node-comparator.ts +13 -0
  95. package/src/cp-node/fs/find-first.ts +6 -6
  96. package/src/cp-node/fs/get-all-on-loop.ts +1 -1
  97. package/src/cp-node/fs/get-branch-beziers.ts +1 -1
  98. package/src/cp-node/fs/get-branch.ts +1 -1
  99. package/src/cp-node/fs/get-children.ts +8 -8
  100. package/src/cp-node/fs/get-first-exit.ts +11 -11
  101. package/src/cp-node/fs/get-mat-curve-to-next.ts +1 -1
  102. package/src/cp-node/fs/get-mat-curves-between.ts +1 -1
  103. package/src/cp-node/fs/get-prong-count.ts +8 -8
  104. package/src/cp-node/fs/get-real-prong-count.ts +3 -3
  105. package/src/cp-node/fs/get-vertex-forward-children.ts +10 -10
  106. package/src/cp-node/fs/is-fully-terminating.ts +3 -3
  107. package/src/cp-node/fs/is-one-prong.ts +8 -8
  108. package/src/cp-node/fs/is-sharp.ts +1 -1
  109. package/src/cp-node/fs/is-terminating.ts +1 -1
  110. package/src/cp-node/fs/iterate-all-on-loop.ts +6 -6
  111. package/src/cp-node/fs/traverse-all-forward.ts +11 -11
  112. package/src/cp-node/fs/traverse-cp.ts +19 -17
  113. package/src/cp-node/fs/traverse-edges.ts +10 -10
  114. package/src/cp-node/fs/traverse-vertices.ts +17 -17
  115. package/src/curve/curve.ts +26 -26
  116. package/src/debug/functions/cmp-cp-on-delta.ts +1 -1
  117. package/src/debug/functions/draw-elem/bounding-hull.ts +2 -2
  118. package/src/debug/functions/draw-elem/culls.ts +2 -2
  119. package/src/debug/functions/draw-elem/draw-cp-node.ts +30 -30
  120. package/src/debug/functions/draw-elem/draw-cull.ts +2 -2
  121. package/src/debug/functions/draw-elem/draw-dull-corner.ts +7 -7
  122. package/src/debug/functions/draw-elem/draw-elem.ts +28 -28
  123. package/src/debug/functions/draw-elem/draw-leaves.ts +12 -12
  124. package/src/debug/functions/draw-elem/draw-loose-bounding-box.ts +7 -7
  125. package/src/debug/functions/draw-elem/draw-max-vertex.ts +2 -2
  126. package/src/debug/functions/draw-elem/draw-min-y.ts +2 -2
  127. package/src/debug/functions/draw-elem/draw-one-prong-at-dull-corner.ts +1 -1
  128. package/src/debug/functions/draw-elem/draw-one-prong.ts +1 -1
  129. package/src/debug/functions/draw-elem/draw-sharp-corner.ts +6 -6
  130. package/src/debug/functions/draw-elem/draw-speed.ts +2 -2
  131. package/src/debug/functions/draw-elem/draw-three-prong.ts +28 -28
  132. package/src/debug/functions/draw-elem/draw-tight-bounding-box.ts +4 -4
  133. package/src/debug/functions/draw-elem/draw-two-prong.ts +51 -51
  134. package/src/debug/functions/draw-elem/draw-vertex.ts +12 -12
  135. package/src/debug/functions/draw-elem/dull-corner.ts +7 -7
  136. package/src/debug/functions/draw-elem/leaves.ts +2 -2
  137. package/src/debug/functions/draw-elem/loose-bounding-box.ts +7 -7
  138. package/src/debug/functions/draw-elem/max-vertex.ts +2 -2
  139. package/src/debug/functions/draw-elem/min-y.ts +2 -2
  140. package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +1 -1
  141. package/src/debug/functions/draw-elem/one-prong.ts +1 -1
  142. package/src/debug/functions/draw-elem/sharp-corner.ts +6 -6
  143. package/src/debug/functions/draw-elem/three-prong.ts +19 -19
  144. package/src/debug/functions/draw-elem/tight-bounding-box.ts +4 -4
  145. package/src/debug/functions/draw-elem/two-prong.ts +34 -34
  146. package/src/debug/functions/draw-elem/vertex.ts +28 -28
  147. package/src/debug/functions/general.ts +18 -18
  148. package/src/debug/functions/three-prong.ts +184 -184
  149. package/src/debug/functions/two-prong.ts +112 -112
  150. package/src/find-2-prong/add-1-prong.ts +25 -25
  151. package/src/find-2-prong/find-2-prong.ts +158 -157
  152. package/src/find-2-prong/find-equidistant-point-on-line-dd.ts +50 -50
  153. package/src/find-2-prong/find-equidistant-point-on-line.ts +27 -27
  154. package/src/find-3-prong.ts/find-3-prong-for-delta3s.ts +1 -1
  155. package/src/find-3-prong.ts/find-3-prong.ts +23 -23
  156. package/src/find-3-prong.ts/find-and-add-3-prong.ts +37 -37
  157. package/src/find-3-prong.ts/find-and-add-3-prongs.ts +30 -30
  158. package/src/find-mat/add-2-prongs-by-error.ts +1 -1
  159. package/src/find-mat/find-mats.ts +49 -49
  160. package/src/find-mat/fix-ordering.ts +2 -2
  161. package/src/find-mat/get-total-by.ts +12 -12
  162. package/src/find-mat/mat-options.ts +1 -1
  163. package/src/geometry/get-closest-square-distance-to-rect.ts +37 -37
  164. package/src/geometry/get-closest-squared-distance-to-rotated-rect.ts +14 -14
  165. package/src/get-curve/get-curve-between.ts +1 -1
  166. package/src/index.ts +40 -3
  167. package/src/mat/cmp-cp-on-delta.ts +1 -1
  168. package/src/mat/create-new-cp-tree.ts +12 -12
  169. package/src/mat/get-edges-as-array.ts +9 -9
  170. package/src/mat/get-largest-3-prong.ts +8 -8
  171. package/src/mat/get-largest-three-prong.ts +5 -5
  172. package/src/mat/get-largest-vertex.ts +6 -6
  173. package/src/mat/get-two-prong-type.ts +3 -3
  174. package/src/mat/trim-mat.ts +1 -1
  175. package/src/memoize-primitive.ts +14 -14
  176. package/src/sat/add-debug-info.ts +4 -4
  177. package/src/sat/cull-by-salience.ts +1 -1
  178. package/src/sat/get-leaves.ts +0 -1
  179. package/src/svg/get-extreme.ts +8 -8
  180. package/src/svg/get-loop-bounds.ts +84 -84
  181. package/src/svg/get-min-y-pos.ts +1 -1
  182. package/src/sweep-line/sweep-line.ts +23 -23
  183. package/__tests__/cp-node/fs/check-jsog-eql-calc.spec.ts +0 -30
@@ -25,36 +25,36 @@ let ii = 0;
25
25
  * @internal
26
26
  */
27
27
  function findAndAdd3Prongs(
28
- meta: MatMeta,
29
- cpStart: CpNode) {
30
-
31
- if (isPosSharpCorner(cpStart.cp.pointOnShape)) {
32
- return { closeBysFor3Prong: undefined, addedCpNodes: [] };
33
- }
34
-
35
- const addedCpNodes: CpNode[][] = [];
36
- let closeBysFor3Prong: CpNode[] | undefined = undefined;
37
- do {
38
- if (cpStart === undefined) { continue; }
39
- const visitedCps = traverseCp(cpStart);
40
-
41
- if (visitedCps.length <= 2) { break; }
42
-
43
- const { closeBysFor3Prong, cpNodes } = findAndAdd3Prong(meta, visitedCps);
44
-
45
- addedCpNodes.push(cpNodes);
46
- if (closeBysFor3Prong.length > 0) {
47
- return { closeBysFor3Prong, addedCpNodes };
48
- }
49
-
50
- if (typeof _debug_ !== 'undefined') {
51
- if (++ii === _debug_.directives.stopAfterThreeProngsNum) {
52
- return undefined!;
53
- }
54
- }
55
- } while (true);
56
-
57
- return { closeBysFor3Prong, addedCpNodes };
28
+ meta: MatMeta,
29
+ cpStart: CpNode) {
30
+
31
+ if (isPosSharpCorner(cpStart.cp.pointOnShape)) {
32
+ return { closeBysFor3Prong: undefined, addedCpNodes: [] };
33
+ }
34
+
35
+ const addedCpNodes: CpNode[][] = [];
36
+ let closeBysFor3Prong: CpNode[] | undefined = undefined;
37
+ do {
38
+ if (cpStart === undefined) { continue; }
39
+ const visitedCps = traverseCp(cpStart);
40
+
41
+ if (visitedCps.length <= 2) { break; }
42
+
43
+ const { closeBysFor3Prong, cpNodes } = findAndAdd3Prong(meta, visitedCps);
44
+
45
+ addedCpNodes.push(cpNodes);
46
+ if (closeBysFor3Prong.length > 0) {
47
+ return { closeBysFor3Prong, addedCpNodes };
48
+ }
49
+
50
+ if (typeof _debug_ !== 'undefined') {
51
+ if (++ii === _debug_.directives.stopAfterThreeProngsNum) {
52
+ return undefined!;
53
+ }
54
+ }
55
+ } while (true);
56
+
57
+ return { closeBysFor3Prong, addedCpNodes };
58
58
  }
59
59
 
60
60
 
@@ -62,7 +62,7 @@ function add2rongsByError(
62
62
  if (d > maxError) {
63
63
  maxError = d;
64
64
  }
65
- }
65
+ }
66
66
 
67
67
  if (maxError > 0) {
68
68
  // console.log(maxError);
@@ -33,49 +33,49 @@ import { defaultMatOptions, MatOptions } from './mat-options.js';
33
33
  * in [1,100].
34
34
  */
35
35
  function findMats(
36
- bezierLoops: number[][][][],
37
- options?: MatOptions): Mat[] {
38
-
39
- // if (typeof _debug_ !== 'undefined') { var timingStart = performance.now(); }
40
- const { maxCoordinate, maxRadius } = getLoopsMetrics(bezierLoops);
41
-
42
- const options_: Required<MatOptions> = clipOptions(
43
- maxCoordinate,
44
- maxRadius, {
45
- ...defaultMatOptions,
46
- ...(options || {})
47
- });
48
-
49
- const {
50
- applySat, simplify,
51
- satScale, simplifyTolerance
52
- } = options_;
53
-
54
-
55
- const loopss = simplifyPaths(bezierLoops);
56
- // console.log(loopsToSvgPathStr(bezierLoops));
57
- // const loopss = [bezierLoops.map(loop => loopFromBeziers(loop,0))];
58
- // console.log(loopsToSvgPathStr(bezierLoops.map(v => v.map(v => v.map(v => v.map(v => v*2**4))))));
59
- // console.log(loopsToSvgPathStr(bezierLoops.map(v => v.map(v => v.map(v => [-v[0],v[1]])))));
60
- // console.log(loopsToSvgPathStr(loopss[0].map(loop => loop.beziers)));
61
-
62
- const mats: Mat[] = [];
63
- for (const loops of loopss) {
64
- let mat = findMat(loops, maxCoordinate, options_);
65
- if (mat === undefined) { continue; }
66
-
67
- if (applySat) {
68
- mat = toScaleAxis(mat, satScale);
69
- }
70
-
71
- if (simplify) {
72
- mat = simplifyMat(mat, simplifyTolerance, 50)
73
- }
74
-
75
- mats.push(mat);
76
- }
77
-
78
- return mats;
36
+ bezierLoops: number[][][][],
37
+ options?: MatOptions): Mat[] {
38
+
39
+ // if (typeof _debug_ !== 'undefined') { var timingStart = performance.now(); }
40
+ const { maxCoordinate, maxRadius } = getLoopsMetrics(bezierLoops);
41
+
42
+ const options_: Required<MatOptions> = clipOptions(
43
+ maxCoordinate,
44
+ maxRadius, {
45
+ ...defaultMatOptions,
46
+ ...(options || {})
47
+ });
48
+
49
+ const {
50
+ applySat, simplify,
51
+ satScale, simplifyTolerance
52
+ } = options_;
53
+
54
+
55
+ const loopss = simplifyPaths(bezierLoops);
56
+ // console.log(loopsToSvgPathStr(bezierLoops));
57
+ // const loopss = [bezierLoops.map(loop => loopFromBeziers(loop,0))];
58
+ // console.log(loopsToSvgPathStr(bezierLoops.map(v => v.map(v => v.map(v => v.map(v => v*2**4))))));
59
+ // console.log(loopsToSvgPathStr(bezierLoops.map(v => v.map(v => v.map(v => [-v[0],v[1]])))));
60
+ // console.log(loopsToSvgPathStr(loopss[0].map(loop => loop.beziers)));
61
+
62
+ const mats: Mat[] = [];
63
+ for (const loops of loopss) {
64
+ let mat = findMat(loops, maxCoordinate, options_);
65
+ if (mat === undefined) { continue; }
66
+
67
+ if (applySat) {
68
+ mat = toScaleAxis(mat, satScale);
69
+ }
70
+
71
+ if (simplify) {
72
+ mat = simplifyMat(mat, simplifyTolerance, 50)
73
+ }
74
+
75
+ mats.push(mat);
76
+ }
77
+
78
+ return mats;
79
79
  }
80
80
 
81
81
 
@@ -86,14 +86,14 @@ function findMats(
86
86
  * an array of control points.
87
87
  */
88
88
  function loopsToSvgPathStr(
89
- loops: number[][][][]) {
89
+ loops: number[][][][]) {
90
90
 
91
- let str = '';
92
- for (const loop of loops) {
93
- str = str + beziersToSvgPathStr(loop) + '\n';
94
- }
91
+ let str = '';
92
+ for (const loop of loops) {
93
+ str = str + beziersToSvgPathStr(loop) + '\n';
94
+ }
95
95
 
96
- return str;
96
+ return str;
97
97
  }
98
98
 
99
99
 
@@ -59,10 +59,10 @@ function fixOrdering(
59
59
  }
60
60
  }
61
61
  }
62
- }
62
+ }
63
63
  */
64
64
 
65
- // return cpNodes;
65
+ // return cpNodes;
66
66
  }
67
67
 
68
68
 
@@ -9,18 +9,18 @@ import type { Curve } from '../curve/curve.js';
9
9
  * @param totalByF
10
10
  */
11
11
  function getTotalBy(totalByF: (curve: Curve) => number) {
12
-
13
- return function(loop: Loop) {
14
- let node = loop.curves[0];
15
- let total = 0;
16
- do {
17
- total += totalByF(node);
18
-
19
- node = node.next;
20
- } while (node !== loop.curves[0]);
21
-
22
- return total;
23
- }
12
+
13
+ return function(loop: Loop) {
14
+ let node = loop.curves[0];
15
+ let total = 0;
16
+ do {
17
+ total += totalByF(node);
18
+
19
+ node = node.next;
20
+ } while (node !== loop.curves[0]);
21
+
22
+ return total;
23
+ }
24
24
  }
25
25
 
26
26
 
@@ -127,7 +127,7 @@ const matOptionRanges: Partial<{ [K in keyof MatOptions]: MatOptionMeta }> = {
127
127
  range: [1, Number.POSITIVE_INFINITY],
128
128
  },
129
129
  simplifyTolerance: {
130
- range: [2**-10,1024],
130
+ range: [2**-20,2**20],
131
131
  scaleByMaxCoordinate: true
132
132
  },
133
133
  minBezLength: {
@@ -7,45 +7,45 @@ const squaredDistanceBetween = squaredDistanceBetween_;
7
7
  * @internal
8
8
  */
9
9
  function getClosestSquareDistanceToRect(
10
- box: number[][], p: number[]): number {
10
+ box: number[][], p: number[]): number {
11
11
 
12
- const p0 = box[0];
13
- const p1 = box[1];
14
- const x0 = p0[0];
15
- const y0 = p0[1];
16
- const x1 = p1[0];
17
- const y1 = p1[1];
18
- const xp = p[0];
19
- const yp = p[1];
12
+ const p0 = box[0];
13
+ const p1 = box[1];
14
+ const x0 = p0[0];
15
+ const y0 = p0[1];
16
+ const x1 = p1[0];
17
+ const y1 = p1[1];
18
+ const xp = p[0];
19
+ const yp = p[1];
20
20
 
21
- //let [[x0,y0],[x1,y1]] = box;
22
- //let [xp,yp] = p;
23
-
24
- if (xp < x0) {
25
- if (yp < y0) {
26
- return squaredDistanceBetween(box[0], p);
27
- } else if (yp > y1) {
28
- return squaredDistanceBetween([x0,y1], p);
29
- } else {
30
- return (x0 - xp)**2;
31
- }
32
- } else if (xp > x1) {
33
- if (yp < y0) {
34
- return squaredDistanceBetween([x1,y0], p);
35
- } else if (yp > y1) {
36
- return squaredDistanceBetween(box[1], p);
37
- } else {
38
- return (xp - x1)**2;
39
- }
40
- } else {
41
- if (yp < y0) {
42
- return (y0 - yp)**2;
43
- } else if (yp > y1) {
44
- return (yp - y1)**2;
45
- }
46
-
47
- return 0;
48
- }
21
+ //let [[x0,y0],[x1,y1]] = box;
22
+ //let [xp,yp] = p;
23
+
24
+ if (xp < x0) {
25
+ if (yp < y0) {
26
+ return squaredDistanceBetween(box[0], p);
27
+ } else if (yp > y1) {
28
+ return squaredDistanceBetween([x0,y1], p);
29
+ } else {
30
+ return (x0 - xp)**2;
31
+ }
32
+ } else if (xp > x1) {
33
+ if (yp < y0) {
34
+ return squaredDistanceBetween([x1,y0], p);
35
+ } else if (yp > y1) {
36
+ return squaredDistanceBetween(box[1], p);
37
+ } else {
38
+ return (xp - x1)**2;
39
+ }
40
+ } else {
41
+ if (yp < y0) {
42
+ return (y0 - yp)**2;
43
+ } else if (yp > y1) {
44
+ return (yp - y1)**2;
45
+ }
46
+
47
+ return 0;
48
+ }
49
49
  }
50
50
 
51
51
 
@@ -1,5 +1,5 @@
1
1
  import {
2
- squaredDistanceBetweenPointAndLineSegment, squaredDistanceBetween
2
+ squaredDistanceBetweenPointAndLineSegment, squaredDistanceBetween
3
3
  } from 'flo-vector2d';
4
4
 
5
5
 
@@ -7,22 +7,22 @@ import {
7
7
  * @internal
8
8
  */
9
9
  function getClosestSquaredDistanceToRotatedRect(ps: number[][], p: number[]) {
10
- const ds = [0,1,2,3].map(i => squaredDistanceBetweenPointAndLineSegment(
11
- p,
12
- [ps[i], ps[(i + 1) % 4]]
13
- )
14
- );
15
-
16
- const width = squaredDistanceBetween(ps[0], ps[1]);
17
- const height = squaredDistanceBetween(ps[0], ps[3]);
10
+ const ds = [0,1,2,3].map(i => squaredDistanceBetweenPointAndLineSegment(
11
+ p,
12
+ [ps[i], ps[(i + 1) % 4]]
13
+ )
14
+ );
15
+
16
+ const width = squaredDistanceBetween(ps[0], ps[1]);
17
+ const height = squaredDistanceBetween(ps[0], ps[3]);
18
18
 
19
- if (ds[0] <= height && ds[2] <= height &&
20
- ds[1] <= width && ds[3] <= width) {
19
+ if (ds[0] <= height && ds[2] <= height &&
20
+ ds[1] <= width && ds[3] <= width) {
21
21
 
22
- return 0; // Inside rotated rect
23
- }
22
+ return 0; // Inside rotated rect
23
+ }
24
24
 
25
- return Math.min(...ds);
25
+ return Math.min(...ds);
26
26
  }
27
27
 
28
28
 
@@ -39,7 +39,7 @@ function getCurveBetween(
39
39
  const a = fromTo(fromCc, mid);
40
40
  const b = fromTo(toCc, mid);
41
41
 
42
- twisted = dot(a,c) < 0 || dot(b,c) > 0;
42
+ twisted = dot(a,c) < 0 || dot(b,c) > 0;
43
43
  }
44
44
 
45
45
  if (!twisted) {
package/src/index.ts CHANGED
@@ -1,8 +1,8 @@
1
1
 
2
- export { loopFromBeziers, beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
2
+ export { loopFromBeziers, beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
3
3
 
4
4
  export type { MatMeta } from './mat/mat-meta.js';
5
- export type { Loop } from 'flo-boolean';
5
+ export type { Loop } from 'flo-boolean';
6
6
  export type { Mat } from './mat/mat.js';
7
7
  export type { Curve } from './curve/curve.js';
8
8
  export type { CpNode } from './cp-node/cp-node.js';
@@ -39,7 +39,6 @@ export { sweepLine } from './sweep-line/sweep-line.js';
39
39
  export { getClosestSquareDistanceToRect } from './geometry/get-closest-square-distance-to-rect.js';
40
40
  export { connectHoleClosers } from './mat/connect-hole-closers.js';
41
41
  export { findAndAdd2Prong } from './find-2-prong/find-and-add-2-prong.js';
42
- export { getBoundaryBeziersToNext } from './cp-node/fs/get-boundary-beziers-to-next.js';
43
42
  export { getImpliedBoundaryBezierBetween } from './cp-node/fs/get-implied-boundary-bezier-between.js';
44
43
  export { getSatCulls } from './sat/get-sat-culls.js';
45
44
  export { getGraph } from './floyd-warshall/get-graph.js';
@@ -51,3 +50,41 @@ export { getPotentialClosestPointsOnCurveCertified } from './closest-boundary-po
51
50
  export { getCloseBoundaryPointsCertified } from './closest-boundary-point/get-close-boundary-points-certified.js';
52
51
  export { getPartialMeta, getPointToCpNode } from './find-mat/get-meta.js';
53
52
  export { findAndAddHoleClosing2Prongs } from './find-2-prong/find-and-add-hole-closing-2-prongs.js';
53
+
54
+
55
+ // CpNodeFs functions
56
+ export { getChildren } from './cp-node/fs/get-children.js';
57
+ export { getVertexForwardChildren } from './cp-node/fs/get-vertex-forward-children.js';
58
+ export { getAllOnLoop } from './cp-node/fs/get-all-on-loop.js';
59
+ export { getAllOnCircle } from './cp-node/fs/get-all-on-circle.js';
60
+ export { isOnSameCircle } from './cp-node/fs/is-on-same-circle.js';
61
+ export { isTerminating } from './cp-node/fs/is-terminating.js';
62
+ export { isFullyTerminating } from './cp-node/fs/is-fully-terminating.js';
63
+ export { getFirstExit } from './cp-node/fs/get-first-exit.js';
64
+ export { isSharp } from './cp-node/fs/is-sharp.js';
65
+ export { isOneProng } from './cp-node/fs/is-one-prong.js';
66
+ export { getProngCount } from './cp-node/fs/get-prong-count.js';
67
+ export { getRealProngCount } from './cp-node/fs/get-real-prong-count.js';
68
+ export { cpNodeComparator } from './cp-node/fs/cp-node-comparator.js';
69
+ export { enhanceCpNode } from './cp-node/fs/enhance-cp-node.js';
70
+ export { traverseCp } from './cp-node/fs/traverse-cp.js';
71
+ export { traverseEdges } from './cp-node/fs/traverse-edges.js';
72
+ export { traverseVertices } from './cp-node/fs/traverse-vertices.js';
73
+ export { clone } from './cp-node/fs/clone.js';
74
+ export { getBoundaryBezierPartsToNext } from './cp-node/fs/get-boundary-bezier-parts-to-next.js';
75
+ export { getBoundaryBeziersToNext } from './cp-node/fs/get-boundary-beziers-to-next.js';
76
+ export { removeVertex } from './vertex/remove-vertex.js';
77
+ export { getMatCurveToNext } from './cp-node/fs/get-mat-curve-to-next.js';
78
+ export { isTwoProng } from './cp-node/fs/is-two-prong.js';
79
+ export { getBranch } from './cp-node/fs/get-branch.js';
80
+ export { getBranchBeziers } from './cp-node/fs/get-branch-beziers.js';
81
+ export { getSalience } from './cp-node/fs/get-salience.js';
82
+ export { getMatCurveBetween } from './cp-node/fs/get-mat-curve-between.js';
83
+ export { getEdgeDirection } from './cp-node/fs/get-edge-direction.js';
84
+ export { getBoundaryBeziersBetween } from './cp-node/fs/get-boundary-beziers-between.js';
85
+ export { getMatCurvesBetween } from './cp-node/fs/get-mat-curves-between.js';
86
+ export { getHoleClosers } from './cp-node/fs/get-hole-closers.js';
87
+ export { getSpeed } from './cp-node/fs/get-speed.js';
88
+ export { getSmoothedSpeed$ } from './cp-node/fs/get-smoothed-speed.js';
89
+ export { getInitialDegAngleBetweenMatCurves } from './cp-node/fs/get-angle-between-mat-curves.js';
90
+ export { getAllVertices } from './cp-node/fs/get-all-vertices.js';
@@ -45,7 +45,7 @@ function cmpCpOnδ(
45
45
  }
46
46
 
47
47
  if (cmpPrev === 0 || cmpNext === 0) {
48
- console.log('2-PRONG orders are equal.');
48
+ console.log('2-PRONG orders are equal.');
49
49
  return 0;
50
50
  }
51
51
 
@@ -11,21 +11,21 @@ const { cpNodeComparator, getAllOnLoop } = CpNodeFs;
11
11
  * @param cpNode
12
12
  */
13
13
  function createNewCpTree(cpNode: CpNode) {
14
- const newCpTrees: Map<Loop,LlRbTree<CpNode>> = new Map();
14
+ const newCpTrees: Map<Loop,LlRbTree<CpNode>> = new Map();
15
15
 
16
- getAllOnLoop(cpNode).forEach(createNewCpTree_);
16
+ getAllOnLoop(cpNode).forEach(createNewCpTree_);
17
17
 
18
- function createNewCpTree_(cpNode: CpNode) {
19
- const loop = cpNode.cp.pointOnShape.curve.loop;
20
- let cpTree = newCpTrees.get(loop);
21
- if (!cpTree) {
22
- cpTree = new LlRbTree(cpNodeComparator, false);
23
- newCpTrees.set(loop, cpTree);
24
- }
25
- cpTree.insert(cpNode);
26
- }
18
+ function createNewCpTree_(cpNode: CpNode) {
19
+ const loop = cpNode.cp.pointOnShape.curve.loop;
20
+ let cpTree = newCpTrees.get(loop);
21
+ if (!cpTree) {
22
+ cpTree = new LlRbTree(cpNodeComparator, false);
23
+ newCpTrees.set(loop, cpTree);
24
+ }
25
+ cpTree.insert(cpNode);
26
+ }
27
27
 
28
- return newCpTrees;
28
+ return newCpTrees;
29
29
  }
30
30
 
31
31
 
@@ -3,15 +3,15 @@
3
3
 
4
4
 
5
5
  // /** @internal */
6
- // function getEdgesAsArray(cpNode: CpNode) {
7
- // const cpNodes: CpNode[] = [];
8
-
9
- // traverseEdges(
10
- // cpNode,
11
- // function(cpNode) { cpNodes.push(cpNode) }
12
- // );
13
-
14
- // return cpNodes;
6
+ // function getEdgesAsArray(cpNode: CpNode) {
7
+ // const cpNodes: CpNode[] = [];
8
+
9
+ // traverseEdges(
10
+ // cpNode,
11
+ // function(cpNode) { cpNodes.push(cpNode) }
12
+ // );
13
+
14
+ // return cpNodes;
15
15
  // }
16
16
 
17
17
 
@@ -5,16 +5,16 @@ import { getRealProngCount } from '../cp-node/fs/get-real-prong-count.js';
5
5
 
6
6
  /** @internal */
7
7
  function getLargest3Prong(cpNode: CpNode) {
8
- const cpNodes = getAllOnLoop(cpNode)
9
- .filter(cpNode => getRealProngCount(cpNode) >= 3);
8
+ const cpNodes = getAllOnLoop(cpNode)
9
+ .filter(cpNode => getRealProngCount(cpNode) >= 3);
10
10
 
11
- if (cpNodes.length === 0) { return undefined; }
11
+ if (cpNodes.length === 0) { return undefined; }
12
12
 
13
- return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
14
- return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
15
- ? maxCpNode
16
- : cpNode
17
- }, cpNodes[0]);
13
+ return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
14
+ return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
15
+ ? maxCpNode
16
+ : cpNode
17
+ }, cpNodes[0]);
18
18
  }
19
19
 
20
20
 
@@ -3,11 +3,11 @@ import { CpNode } from '../cp-node/cp-node.js';
3
3
 
4
4
  /** @internal */
5
5
  function getLargestThreeProng(cpNodes: CpNode[]) {
6
- return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
7
- return cpNode === undefined || maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
8
- ? maxCpNode
9
- : cpNode;
10
- }, undefined!);
6
+ return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
7
+ return cpNode === undefined || maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
8
+ ? maxCpNode
9
+ : cpNode;
10
+ }, undefined!);
11
11
  }
12
12
 
13
13
 
@@ -4,13 +4,13 @@ import { getAllOnLoop } from '../cp-node/fs/get-all-on-loop.js';
4
4
 
5
5
  /** @internal */
6
6
  function getLargestVertex(cpNode: CpNode) {
7
- const cpNodes = getAllOnLoop(cpNode);
7
+ const cpNodes = getAllOnLoop(cpNode);
8
8
 
9
- return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
10
- return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
11
- ? maxCpNode
12
- : cpNode
13
- }, cpNodes[0]);
9
+ return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
10
+ return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
11
+ ? maxCpNode
12
+ : cpNode
13
+ }, cpNodes[0]);
14
14
  }
15
15
 
16
16
 
@@ -4,9 +4,9 @@
4
4
 
5
5
  // /** @internal */
6
6
  // function getTwoProngType(e: TwoProngForDebugging): ElemType_TwoProng {
7
- // if (e.holeClosing) { return 'twoProng_holeClosing' }
8
-
9
- // return 'twoProng_regular';
7
+ // if (e.holeClosing) { return 'twoProng_holeClosing' }
8
+
9
+ // return 'twoProng_regular';
10
10
  // }
11
11
 
12
12
 
@@ -10,7 +10,7 @@ import { clone } from '../cp-node/fs/clone.js';
10
10
  * @param mat The MAT to trim.
11
11
  */
12
12
  function trimMat(mat: Mat): Mat {
13
- const cpNode = cullNonCycles(clone(mat.cpNode));
13
+ const cpNode = cullNonCycles(clone(mat.cpNode));
14
14
 
15
15
  if (!cpNode) { return undefined!; }
16
16
 
@@ -10,21 +10,21 @@
10
10
  * prevent garbage collection, rather use `memoize` instead
11
11
  */
12
12
  function memoizePrimitive<T, U>(f: (a: T) => U): (a: T) => U {
13
- const results = new Map<T,U>();
14
-
15
- return function(a: T): U {
16
- let result = results.get(a);
17
- if (result !== undefined) {
18
- //console.log('cache hit');
19
- return result;
20
- }
13
+ const results = new Map<T,U>();
14
+
15
+ return function(a: T): U {
16
+ let result = results.get(a);
17
+ if (result !== undefined) {
18
+ //console.log('cache hit');
19
+ return result;
20
+ }
21
21
 
22
- //console.log('cache miss');
23
- result = f(a);
24
- results.set(a, result);
25
-
26
- return result;
27
- }
22
+ //console.log('cache miss');
23
+ result = f(a);
24
+ results.set(a, result);
25
+
26
+ return result;
27
+ }
28
28
  }
29
29
 
30
30