flo-mat 4.0.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/__tests__/find-2-prong/get-medial/dd-get-medial-point-coeffs-same-curve.spec.ts +106 -0
  2. package/__tests__/find-2-prong/get-medial/dd-get-medial-point-coeffs.spec.ts +73 -0
  3. package/__tests__/find-2-prong/get-medial/get-closest-points.spec.ts +5 -2
  4. package/__tests__/helpers/close-to.ts +5 -5
  5. package/__tests__/specific-cases/load-svg/load-svg.ts +30 -0
  6. package/__tests__/specific-cases/specific-cases.spec.ts +168 -4
  7. package/__tests__/specific-cases/test-svgs/achispado.svg +5052 -0
  8. package/browser/index.js +1686 -2738
  9. package/browser/index.min.js +1 -1
  10. package/{jest.config.cjs → jest.config.ts} +8 -3
  11. package/node/closest-boundary-point/get-close-boundary-points-certified.js +3 -2
  12. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  13. package/node/corner/get-corner.js +1 -1
  14. package/node/corner/get-corner.js.map +1 -1
  15. package/node/{reconstruct-from-mat → cp-node/fs}/get-all-on-loop-by-loop.d.ts +6 -2
  16. package/node/{reconstruct-from-mat → cp-node/fs}/get-all-on-loop-by-loop.js +5 -1
  17. package/node/cp-node/fs/get-all-on-loop-by-loop.js.map +1 -0
  18. package/node/cp-node/fs/get-boundary-beziers-to-next.d.ts +1 -0
  19. package/node/cp-node/fs/get-boundary-beziers-to-next.js +1 -59
  20. package/node/cp-node/fs/get-boundary-beziers-to-next.js.map +1 -1
  21. package/node/cp-node/fs/get-edge-direction.d.ts +3 -1
  22. package/node/cp-node/fs/get-edge-direction.js +5 -3
  23. package/node/cp-node/fs/get-edge-direction.js.map +1 -1
  24. package/node/cp-node/fs/get-mat-curve-between.js +6 -6
  25. package/node/cp-node/fs/get-mat-curve-between.js.map +1 -1
  26. package/node/cp-node/fs/is-fully-terminating.js +12 -0
  27. package/node/cp-node/fs/is-fully-terminating.js.map +1 -1
  28. package/node/debug/debug.d.ts +4 -13
  29. package/node/debug/debug.js +3 -30
  30. package/node/debug/debug.js.map +1 -1
  31. package/node/find-2-prong/find-2-prong.js +24 -10
  32. package/node/find-2-prong/find-2-prong.js.map +1 -1
  33. package/node/find-2-prong/get-medial/get-antipodal-points.d.ts +1 -1
  34. package/node/find-2-prong/get-medial/get-antipodal-points.js +2 -2
  35. package/node/find-2-prong/get-medial/get-antipodal-points.js.map +1 -1
  36. package/node/find-2-prong/get-medial/get-closest-points.d.ts +7 -1
  37. package/node/find-2-prong/get-medial/get-closest-points.js +60 -14
  38. package/node/find-2-prong/get-medial/get-closest-points.js.map +1 -1
  39. package/node/find-2-prong/reduce-radius.d.ts +3 -1
  40. package/node/find-2-prong/reduce-radius.js +8 -6
  41. package/node/find-2-prong/reduce-radius.js.map +1 -1
  42. package/node/find-3-prong/calc-better-x.js +1 -3
  43. package/node/find-3-prong/calc-better-x.js.map +1 -1
  44. package/node/find-3-prong/calc-initial-3-prong-center.js +1 -2
  45. package/node/find-3-prong/calc-initial-3-prong-center.js.map +1 -1
  46. package/node/find-3-prong/find-3-prong-for-delta3s.js +1 -4
  47. package/node/find-3-prong/find-3-prong-for-delta3s.js.map +1 -1
  48. package/node/find-3-prong/find-3-prong.js.map +1 -1
  49. package/node/find-3-prong/find-and-add-3-prong.js +0 -14
  50. package/node/find-3-prong/find-and-add-3-prong.js.map +1 -1
  51. package/node/find-mat/find-mat.js +2 -1
  52. package/node/find-mat/find-mat.js.map +1 -1
  53. package/node/find-mat/find-mats.js.map +1 -1
  54. package/node/find-mat/get-dull-corners-on-loop.js +3 -2
  55. package/node/find-mat/get-dull-corners-on-loop.js.map +1 -1
  56. package/node/find-mat/get-for-1-prongs-on-loop.js +6 -3
  57. package/node/find-mat/get-for-1-prongs-on-loop.js.map +1 -1
  58. package/node/find-mat/get-for-2-prongs-on-loop.js +5 -1
  59. package/node/find-mat/get-for-2-prongs-on-loop.js.map +1 -1
  60. package/node/find-mat/get-meta.d.ts +4 -1
  61. package/node/find-mat/get-meta.js +9 -1
  62. package/node/find-mat/get-meta.js.map +1 -1
  63. package/node/find-mat/get-sharp-corners.js +4 -2
  64. package/node/find-mat/get-sharp-corners.js.map +1 -1
  65. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez0.d.ts +21 -0
  66. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez0.js +46 -0
  67. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez0.js.map +1 -0
  68. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez1.d.ts +28 -0
  69. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez1.js +97 -0
  70. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez1.js.map +1 -0
  71. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2-same-curve.d.ts +28 -0
  72. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2-same-curve.js +109 -0
  73. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2-same-curve.js.map +1 -0
  74. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2.d.ts +29 -0
  75. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2.js +123 -0
  76. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2.js.map +1 -0
  77. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3-same-curve.d.ts +30 -0
  78. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3-same-curve.js +177 -0
  79. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3-same-curve.js.map +1 -0
  80. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.d.ts +29 -0
  81. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.js +156 -0
  82. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.js.map +1 -0
  83. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs.d.ts +28 -0
  84. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs.js +40 -0
  85. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs.js.map +1 -0
  86. package/node/index.d.ts +4 -10
  87. package/node/index.js +3 -6
  88. package/node/index.js.map +1 -1
  89. package/node/point-on-shape/point-on-shape.d.ts +2 -0
  90. package/node/point-on-shape/to-p.d.ts +1 -1
  91. package/node/point-on-shape/to-p.js +1 -1
  92. package/node/point-on-shape/to-p.js.map +1 -1
  93. package/node/reconstruct-from-mat/get-cp-nodess-for-sat.js +2 -2
  94. package/node/reconstruct-from-mat/get-cp-nodess-for-sat.js.map +1 -1
  95. package/node/reconstruct-from-mat/reconstruct-from-mat.d.ts +8 -2
  96. package/node/reconstruct-from-mat/reconstruct-from-mat.js +154 -22
  97. package/node/reconstruct-from-mat/reconstruct-from-mat.js.map +1 -1
  98. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.js +1 -1
  99. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.js.map +1 -1
  100. package/node/svg/get-loop-bounds.js +6 -2
  101. package/node/svg/get-loop-bounds.js.map +1 -1
  102. package/node/utils/map-deep.d.ts +15 -0
  103. package/node/utils/map-deep.js +34 -0
  104. package/node/utils/map-deep.js.map +1 -0
  105. package/package.json +14 -8
  106. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +3 -2
  107. package/src/corner/get-corner.ts +1 -1
  108. package/src/{reconstruct-from-mat → cp-node/fs}/get-all-on-loop-by-loop.ts +7 -3
  109. package/src/cp-node/fs/get-all-on-loop.ts +1 -1
  110. package/src/cp-node/fs/get-boundary-beziers-to-next.ts +1 -72
  111. package/src/cp-node/fs/get-edge-direction.ts +8 -4
  112. package/src/cp-node/fs/get-mat-curve-between.ts +6 -6
  113. package/src/cp-node/fs/is-fully-terminating.ts +16 -0
  114. package/src/debug/debug.ts +8 -50
  115. package/src/find-2-prong/find-2-prong.ts +37 -14
  116. package/src/find-2-prong/get-medial/get-antipodal-points.ts +3 -2
  117. package/src/find-2-prong/get-medial/get-closest-points-d.ts +213 -0
  118. package/src/find-2-prong/get-medial/get-closest-points.ts +74 -13
  119. package/src/find-2-prong/reduce-radius.ts +8 -5
  120. package/src/find-3-prong/calc-better-x.ts +1 -3
  121. package/src/find-3-prong/calc-initial-3-prong-center.ts +1 -2
  122. package/src/find-3-prong/find-3-prong-for-delta3s.ts +1 -4
  123. package/src/find-3-prong/find-3-prong.ts +0 -1
  124. package/src/find-3-prong/find-and-add-3-prong.ts +1 -15
  125. package/src/find-mat/find-mat.ts +3 -1
  126. package/src/find-mat/find-mats.ts +0 -1
  127. package/src/find-mat/get-dull-corners-on-loop.ts +4 -3
  128. package/src/find-mat/get-for-1-prongs-on-loop.ts +8 -3
  129. package/src/find-mat/get-for-2-prongs-on-loop.ts +6 -1
  130. package/src/find-mat/get-meta.ts +11 -0
  131. package/src/find-mat/get-sharp-corners.ts +5 -1
  132. package/src/get-medial-curve/__pycache__/get-cubic-self-medial-curve.cpython-313.pyc +0 -0
  133. package/src/get-medial-curve/get-cubic-self-medial-curve.py +419 -0
  134. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez0-with-running-err.ts +76 -0
  135. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez0.ts +61 -0
  136. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez1.ts +116 -0
  137. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2-same-curve.ts +129 -0
  138. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez2.ts +142 -0
  139. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3-same-curve.ts +199 -0
  140. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.ts +177 -0
  141. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs.ts +48 -0
  142. package/src/get-medial-points/double-double/error-bound-calc.txt +72 -0
  143. package/src/index.ts +4 -10
  144. package/src/point-on-shape/point-on-shape.ts +3 -0
  145. package/src/point-on-shape/to-p.ts +2 -2
  146. package/src/reconstruct-from-mat/get-cp-nodess-for-sat.ts +2 -2
  147. package/src/reconstruct-from-mat/reconstruct-from-mat.ts +202 -21
  148. package/src/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.ts +1 -1
  149. package/src/svg/get-loop-bounds.ts +11 -3
  150. package/src/utils/map-deep.ts +75 -0
  151. package/src/utils/map-map.ts +33 -0
  152. package/wallaby.mjs +4 -4
  153. package/node/debug/debug-elem-types.d.ts +0 -26
  154. package/node/debug/debug-elem-types.js +0 -22
  155. package/node/debug/debug-elem-types.js.map +0 -1
  156. package/node/debug/functions/draw/draw-beziers-as-single-path.d.ts +0 -2
  157. package/node/debug/functions/draw/draw-beziers-as-single-path.js +0 -30
  158. package/node/debug/functions/draw/draw-beziers-as-single-path.js.map +0 -1
  159. package/node/debug/functions/draw/xmlns.d.ts +0 -2
  160. package/node/debug/functions/draw/xmlns.js +0 -3
  161. package/node/debug/functions/draw/xmlns.js.map +0 -1
  162. package/node/debug/functions/draw-elem/bounding-hull.d.ts +0 -3
  163. package/node/debug/functions/draw-elem/bounding-hull.js +0 -8
  164. package/node/debug/functions/draw-elem/bounding-hull.js.map +0 -1
  165. package/node/debug/functions/draw-elem/draw-branch.d.ts +0 -4
  166. package/node/debug/functions/draw-elem/draw-branch.js +0 -26
  167. package/node/debug/functions/draw-elem/draw-branch.js.map +0 -1
  168. package/node/debug/functions/draw-elem/draw-circle-percent.d.ts +0 -3
  169. package/node/debug/functions/draw-elem/draw-circle-percent.js +0 -13
  170. package/node/debug/functions/draw-elem/draw-circle-percent.js.map +0 -1
  171. package/node/debug/functions/draw-elem/draw-cp-node.d.ts +0 -4
  172. package/node/debug/functions/draw-elem/draw-cp-node.js +0 -26
  173. package/node/debug/functions/draw-elem/draw-cp-node.js.map +0 -1
  174. package/node/debug/functions/draw-elem/draw-cull.d.ts +0 -3
  175. package/node/debug/functions/draw-elem/draw-cull.js +0 -9
  176. package/node/debug/functions/draw-elem/draw-cull.js.map +0 -1
  177. package/node/debug/functions/draw-elem/draw-dull-corner.d.ts +0 -4
  178. package/node/debug/functions/draw-elem/draw-dull-corner.js +0 -10
  179. package/node/debug/functions/draw-elem/draw-dull-corner.js.map +0 -1
  180. package/node/debug/functions/draw-elem/draw-elem.d.ts +0 -10
  181. package/node/debug/functions/draw-elem/draw-elem.js +0 -39
  182. package/node/debug/functions/draw-elem/draw-elem.js.map +0 -1
  183. package/node/debug/functions/draw-elem/draw-leaves.d.ts +0 -4
  184. package/node/debug/functions/draw-elem/draw-leaves.js +0 -34
  185. package/node/debug/functions/draw-elem/draw-leaves.js.map +0 -1
  186. package/node/debug/functions/draw-elem/draw-loop.d.ts +0 -4
  187. package/node/debug/functions/draw-elem/draw-loop.js +0 -11
  188. package/node/debug/functions/draw-elem/draw-loop.js.map +0 -1
  189. package/node/debug/functions/draw-elem/draw-loops.d.ts +0 -4
  190. package/node/debug/functions/draw-elem/draw-loops.js +0 -6
  191. package/node/debug/functions/draw-elem/draw-loops.js.map +0 -1
  192. package/node/debug/functions/draw-elem/draw-loose-bounding-box.d.ts +0 -3
  193. package/node/debug/functions/draw-elem/draw-loose-bounding-box.js +0 -10
  194. package/node/debug/functions/draw-elem/draw-loose-bounding-box.js.map +0 -1
  195. package/node/debug/functions/draw-elem/draw-mat.d.ts +0 -4
  196. package/node/debug/functions/draw-elem/draw-mat.js +0 -34
  197. package/node/debug/functions/draw-elem/draw-mat.js.map +0 -1
  198. package/node/debug/functions/draw-elem/draw-max-vertex.d.ts +0 -4
  199. package/node/debug/functions/draw-elem/draw-max-vertex.js +0 -9
  200. package/node/debug/functions/draw-elem/draw-max-vertex.js.map +0 -1
  201. package/node/debug/functions/draw-elem/draw-min-y.d.ts +0 -4
  202. package/node/debug/functions/draw-elem/draw-min-y.js +0 -10
  203. package/node/debug/functions/draw-elem/draw-min-y.js.map +0 -1
  204. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.d.ts +0 -4
  205. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js +0 -22
  206. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js.map +0 -1
  207. package/node/debug/functions/draw-elem/draw-one-prong.d.ts +0 -4
  208. package/node/debug/functions/draw-elem/draw-one-prong.js +0 -13
  209. package/node/debug/functions/draw-elem/draw-one-prong.js.map +0 -1
  210. package/node/debug/functions/draw-elem/draw-sharp-corner.d.ts +0 -4
  211. package/node/debug/functions/draw-elem/draw-sharp-corner.js +0 -10
  212. package/node/debug/functions/draw-elem/draw-sharp-corner.js.map +0 -1
  213. package/node/debug/functions/draw-elem/draw-three-prong.d.ts +0 -4
  214. package/node/debug/functions/draw-elem/draw-three-prong.js +0 -26
  215. package/node/debug/functions/draw-elem/draw-three-prong.js.map +0 -1
  216. package/node/debug/functions/draw-elem/draw-tight-bounding-box.d.ts +0 -3
  217. package/node/debug/functions/draw-elem/draw-tight-bounding-box.js +0 -8
  218. package/node/debug/functions/draw-elem/draw-tight-bounding-box.js.map +0 -1
  219. package/node/debug/functions/draw-elem/draw-two-prong.d.ts +0 -4
  220. package/node/debug/functions/draw-elem/draw-two-prong.js +0 -49
  221. package/node/debug/functions/draw-elem/draw-two-prong.js.map +0 -1
  222. package/node/debug/functions/draw-elem/draw-vertex.d.ts +0 -4
  223. package/node/debug/functions/draw-elem/draw-vertex.js +0 -13
  224. package/node/debug/functions/draw-elem/draw-vertex.js.map +0 -1
  225. package/node/find-3-prong/timed-cc.d.ts +0 -3
  226. package/node/find-3-prong/timed-cc.js +0 -5
  227. package/node/find-3-prong/timed-cc.js.map +0 -1
  228. package/node/reconstruct-from-mat/filter-zero-length.d.ts +0 -10
  229. package/node/reconstruct-from-mat/filter-zero-length.js +0 -14
  230. package/node/reconstruct-from-mat/filter-zero-length.js.map +0 -1
  231. package/node/reconstruct-from-mat/get-all-on-loop-by-loop.js.map +0 -1
  232. package/node/reconstruct-from-mat/get-bezier-piece-length.d.ts +0 -3
  233. package/node/reconstruct-from-mat/get-bezier-piece-length.js +0 -6
  234. package/node/reconstruct-from-mat/get-bezier-piece-length.js.map +0 -1
  235. package/node/reconstruct-from-mat/get-boundary.d.ts +0 -7
  236. package/node/reconstruct-from-mat/get-boundary.js +0 -18
  237. package/node/reconstruct-from-mat/get-boundary.js.map +0 -1
  238. package/node/reconstruct-from-mat/get-matching-beziers.d.ts +0 -10
  239. package/node/reconstruct-from-mat/get-matching-beziers.js +0 -29
  240. package/node/reconstruct-from-mat/get-matching-beziers.js.map +0 -1
  241. package/node/reconstruct-from-mat/get-mbss-by-loop-per-sat.d.ts +0 -6
  242. package/node/reconstruct-from-mat/get-mbss-by-loop-per-sat.js +0 -10
  243. package/node/reconstruct-from-mat/get-mbss-by-loop-per-sat.js.map +0 -1
  244. package/node/reconstruct-from-mat/get-mbss-by-loop-with-opp-arr.d.ts +0 -7
  245. package/node/reconstruct-from-mat/get-mbss-by-loop-with-opp-arr.js +0 -47
  246. package/node/reconstruct-from-mat/get-mbss-by-loop-with-opp-arr.js.map +0 -1
  247. package/node/reconstruct-from-mat/get-sats2.d.ts +0 -10
  248. package/node/reconstruct-from-mat/get-sats2.js +0 -16
  249. package/node/reconstruct-from-mat/get-sats2.js.map +0 -1
  250. package/node/reconstruct-from-mat/is-fully-terminating.d.ts +0 -3
  251. package/node/reconstruct-from-mat/is-fully-terminating.js +0 -19
  252. package/node/reconstruct-from-mat/is-fully-terminating.js.map +0 -1
  253. package/node/reconstruct-from-mat/matched-beziers.d.ts +0 -10
  254. package/node/reconstruct-from-mat/matched-beziers.js +0 -2
  255. package/node/reconstruct-from-mat/matched-beziers.js.map +0 -1
  256. package/node/reconstruct-from-mat/split-tri-path.d.ts +0 -5
  257. package/node/reconstruct-from-mat/split-tri-path.js +0 -209
  258. package/node/reconstruct-from-mat/split-tri-path.js.map +0 -1
  259. package/node/utils/clip.d.ts +0 -2
  260. package/node/utils/clip.js +0 -6
  261. package/node/utils/clip.js.map +0 -1
  262. package/node/utils/time-function-call.d.ts +0 -14
  263. package/node/utils/time-function-call.js +0 -32
  264. package/node/utils/time-function-call.js.map +0 -1
  265. package/src/debug/debug-elem-types.ts +0 -43
  266. package/src/debug/functions/draw-elem/bounding-hull.ts +0 -18
  267. package/src/debug/functions/draw-elem/culls.ts +0 -39
  268. package/src/debug/functions/draw-elem/draw-branch.ts +0 -37
  269. package/src/debug/functions/draw-elem/draw-circle-percent.ts +0 -23
  270. package/src/debug/functions/draw-elem/draw-cp-node.ts +0 -46
  271. package/src/debug/functions/draw-elem/draw-cull.ts +0 -21
  272. package/src/debug/functions/draw-elem/draw-dull-corner.ts +0 -21
  273. package/src/debug/functions/draw-elem/draw-elem.ts +0 -64
  274. package/src/debug/functions/draw-elem/draw-leaves.ts +0 -51
  275. package/src/debug/functions/draw-elem/draw-loop.ts +0 -16
  276. package/src/debug/functions/draw-elem/draw-loops.ts +0 -10
  277. package/src/debug/functions/draw-elem/draw-loose-bounding-box.ts +0 -21
  278. package/src/debug/functions/draw-elem/draw-mat.ts +0 -43
  279. package/src/debug/functions/draw-elem/draw-max-vertex.ts +0 -15
  280. package/src/debug/functions/draw-elem/draw-min-y.ts +0 -18
  281. package/src/debug/functions/draw-elem/draw-one-prong-at-dull-corner.ts +0 -40
  282. package/src/debug/functions/draw-elem/draw-one-prong.ts +0 -25
  283. package/src/debug/functions/draw-elem/draw-sharp-corner.ts +0 -21
  284. package/src/debug/functions/draw-elem/draw-three-prong.ts +0 -44
  285. package/src/debug/functions/draw-elem/draw-tight-bounding-box.ts +0 -18
  286. package/src/debug/functions/draw-elem/draw-two-prong.ts +0 -68
  287. package/src/debug/functions/draw-elem/draw-vertex.ts +0 -27
  288. package/src/debug/functions/draw-elem/dull-corner.ts +0 -21
  289. package/src/debug/functions/draw-elem/leaves.ts +0 -20
  290. package/src/debug/functions/draw-elem/loop.ts +0 -16
  291. package/src/debug/functions/draw-elem/loops.ts +0 -10
  292. package/src/debug/functions/draw-elem/loose-bounding-box.ts +0 -21
  293. package/src/debug/functions/draw-elem/mat.ts +0 -47
  294. package/src/debug/functions/draw-elem/max-vertex.ts +0 -15
  295. package/src/debug/functions/draw-elem/min-y.ts +0 -18
  296. package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +0 -26
  297. package/src/debug/functions/draw-elem/one-prong.ts +0 -23
  298. package/src/debug/functions/draw-elem/sharp-corner.ts +0 -20
  299. package/src/debug/functions/draw-elem/three-prong.ts +0 -30
  300. package/src/debug/functions/draw-elem/tight-bounding-box.ts +0 -18
  301. package/src/debug/functions/draw-elem/two-prong.ts +0 -50
  302. package/src/debug/functions/draw-elem/vertex.ts +0 -51
  303. package/src/find-3-prong/timed-cc.ts +0 -9
  304. package/src/reconstruct-from-mat/filter-zero-length.ts +0 -23
  305. package/src/reconstruct-from-mat/get-bezier-piece-length.ts +0 -12
  306. package/src/reconstruct-from-mat/get-boundary.ts +0 -32
  307. package/src/reconstruct-from-mat/get-matching-beziers.ts +0 -46
  308. package/src/reconstruct-from-mat/get-mbss-by-loop-per-sat.ts +0 -19
  309. package/src/reconstruct-from-mat/get-mbss-by-loop-with-opp-arr.ts +0 -69
  310. package/src/reconstruct-from-mat/get-sats2.ts +0 -25
  311. package/src/reconstruct-from-mat/is-fully-terminating.ts +0 -27
  312. package/src/reconstruct-from-mat/matched-beziers.ts +0 -14
  313. package/src/reconstruct-from-mat/split-tri-path.ts +0 -280
@@ -1,50 +0,0 @@
1
- // import { drawFs } from 'flo-draw';
2
- // import { TwoProngForDebugging } from '../../two-prong-for-debugging.js';
3
- // import { getTwoProngType } from '../../../mat/get-two-prong-type.js';
4
-
5
-
6
- // /** @internal */
7
- // function twoProng(
8
- // g: SVGGElement,
9
- // twoProng: TwoProngForDebugging,
10
- // classes?: string,
11
- // delay = 0,
12
- // scaleFactor = 1) {
13
-
14
- // let $failedDot : SVGElement[] = [];
15
- // let $center : SVGElement[] = [];
16
- // let $circle : SVGElement[] = [];
17
- // let $cp1 : SVGElement[] = [];
18
- // let $cp2 : SVGElement[] = [];
19
-
20
- // let color;
21
- // let thin;
22
-
23
- // switch (getTwoProngType(twoProng)) {
24
- // case 'twoProng_regular': {
25
- // color = 'red ';
26
- // thin = '2';
27
- // break;
28
- // }
29
- // case 'twoProng_holeClosing': {
30
- // color = 'cyan ';
31
- // thin = '10';
32
- // break;
33
- // }
34
- // }
35
-
36
-
37
- // if (twoProng.failed) {
38
- // $failedDot = drawFs.dot(g, twoProng.pos.p, 1*scaleFactor, 'black', delay);
39
- // } else if (!twoProng.failed) {
40
- // $center = drawFs.dot (g, twoProng.circle.center, 0.01*scaleFactor, 'yellow', delay);
41
- // $circle = drawFs.circle(g, twoProng.circle, color + 'thin' + thin + ' nofill', delay);
42
- // $cp1 = drawFs.dot (g, twoProng.pos.p, 0.0175*scaleFactor, color, delay);
43
- // $cp2 = drawFs.dot (g, twoProng.z, 0.035*scaleFactor, color, delay);
44
- // }
45
-
46
- // return [...$failedDot, ...$center, ...$circle, ...$cp1, ...$cp2];
47
- // }
48
-
49
-
50
- // export { twoProng }
@@ -1,51 +0,0 @@
1
- import { drawFs } from 'flo-draw';
2
- import { CpNode, getCpNodesOnCircle } from '../../../cp-node/cp-node.js';
3
-
4
-
5
- /** @internal */
6
- function vertex(
7
- g: SVGGElement,
8
- cpNode: CpNode,
9
- classes?: string,
10
- delay?: number,/*
11
- visible = true*/
12
- scaleFactor = 1) {
13
-
14
- // const visibleClass = visible ? '' : ' invisible';
15
-
16
- const circle = cpNode.cp.circle;
17
-
18
- const THIN = 'thin20';
19
-
20
- const cps = getCpNodesOnCircle(cpNode);
21
- console.log(cps)
22
-
23
- let $svgs: SVGElement[] = [];
24
-
25
- const $circle = drawFs.circle(g, circle, 'red ' + THIN + ' nofill '/* + visibleClass*/, delay);
26
- const $crossHair = drawFs.crossHair(g, circle.center, 'red ' + THIN + ' nofill '/* + visibleClass*/, 3, delay);
27
-
28
- $svgs = [...$circle, ...$crossHair];
29
-
30
- for (let i=0; i<cps.length; i++) {
31
- const cp = cps[i];
32
- const edgeCircle = cp.next.cp.circle;
33
-
34
- const $circle = drawFs.circle(g, edgeCircle, 'pink ' + THIN + ' nofill '/* + visibleClass*/, delay);
35
- const $crossHair = drawFs.crossHair(g, edgeCircle.center, 'pink ' + THIN + ' nofill '/* + visibleClass*/, 3, delay);
36
-
37
- $svgs.push(...$circle, ...$crossHair)
38
-
39
- const p1 = circle.center;
40
- const p2 = edgeCircle.center;
41
- const thin = i === 0 ? 'thin10' : (i === 1 ? 'thin20' : 'thin35');
42
- const $line = drawFs.line(g, [p1, p2], 'yellow ' + thin + ' nofill '/* + visibleClass*/, delay);
43
-
44
- $svgs.push(...$line);
45
- }
46
-
47
- return $svgs;
48
- }
49
-
50
-
51
- export { vertex }
@@ -1,9 +0,0 @@
1
- import { circumCenter } from 'flo-vector2d';
2
- import { timeFunctionCalls } from '../utils/time-function-call.js';
3
-
4
-
5
- // const timeCircumCenter = timeFunctionCalls(circumCenter);
6
- const timeCircumCenter = circumCenter;
7
-
8
-
9
- export { timeCircumCenter as circumCenter }
@@ -1,23 +0,0 @@
1
- import type { BezierPiece } from "flo-bezier3";
2
- import { isBezierPieceZeroLength } from "flo-bezier3";
3
-
4
-
5
- /**
6
- * Filters out zero-length bezier pieces.
7
- *
8
- * * **note** will return at least one bezier piece, even if all pieces are zero-length.
9
- *
10
- * @param bezierPieces
11
- */
12
- function filterZeroLength(
13
- bezierPieces: BezierPiece[]): BezierPiece[] {
14
-
15
- const bezierPieces_ = bezierPieces.filter(
16
- bezierPiece => !isBezierPieceZeroLength(bezierPiece)
17
- );
18
-
19
- return bezierPieces_.length > 0 ? bezierPieces_ : [bezierPieces[0]];
20
- }
21
-
22
-
23
- export { filterZeroLength }
@@ -1,12 +0,0 @@
1
- import type { BezierPiece } from "flo-bezier3";
2
- import { length } from 'flo-bezier3';
3
-
4
-
5
- function getBezierPieceLength(
6
- bezierPiece: BezierPiece): number {
7
-
8
- return length(bezierPiece.ts, bezierPiece.ps);
9
- }
10
-
11
-
12
- export { getBezierPieceLength }
@@ -1,32 +0,0 @@
1
- import type { BezierPiece } from 'flo-bezier3';
2
- import type { CpNode } from '../cp-node/cp-node.js';
3
- import { getBoundaryBezierPartsToNext } from '../cp-node/fs/get-boundary-bezier-parts-to-next.js';
4
- import { filterZeroLength } from "./filter-zero-length.js";
5
- import { isFullyTerminating } from './is-fully-terminating.js';
6
-
7
-
8
- function getBoundary(
9
- cpNode: CpNode): {
10
- boundaryBeziers: BezierPiece[];
11
- boundaryBeziersOpp: BezierPiece[] | undefined;
12
- } {
13
-
14
- const cpNodeOpp = isFullyTerminating(cpNode)
15
- ? undefined // no opposite boundary
16
- : cpNode.next.prevOnCircle;
17
-
18
- const boundaryBeziers =
19
- filterZeroLength(getBoundaryBezierPartsToNext(cpNode));
20
-
21
- const boundaryBeziersOpp = cpNodeOpp === undefined
22
- ? undefined
23
- : filterZeroLength(getBoundaryBezierPartsToNext(cpNodeOpp));
24
-
25
- return {
26
- boundaryBeziers,
27
- boundaryBeziersOpp
28
- };
29
- }
30
-
31
-
32
- export { getBoundary }
@@ -1,46 +0,0 @@
1
- import type { BezierPiece } from 'flo-bezier3';
2
- import type { CpNode } from '../cp-node/cp-node.js';
3
- import type { MatchedBeziers } from './matched-beziers.js';
4
- import { getMatCurveToNext } from '../cp-node/fs/get-mat-curve-to-next.js'
5
- import { splitTriPath } from './split-tri-path.js';
6
- import { getBoundary } from './get-boundary.js';
7
- import { isOnSameLoop } from '../cp-node/fs/is-on-same-loop.js';
8
-
9
-
10
- /**
11
- * Returns a correspondence between boundary bezier curves and a medial axis
12
- * bezier curve. They will later be interpolated.
13
- *
14
- * @param cpNode the start `CpNode`
15
- */
16
- function getMatchingBeziers(
17
- cpNode: CpNode): MatchedBeziers[] | undefined {
18
-
19
- const medialBezier: BezierPiece = {
20
- ps: getMatCurveToNext(cpNode),
21
- ts: [0,1]
22
- };
23
-
24
- if (cpNode.isHoleClosing && // short-circuit
25
- !isOnSameLoop(cpNode, cpNode.next)) {
26
-
27
- // We get here for half of hole-closers, as only half of hole-closers are on a different loop.
28
- // This cpNode indicates we should connect the hole
29
- // console.log('hole-closing dummy case');
30
- return undefined;
31
- }
32
-
33
- const r = getBoundary(cpNode);
34
- const { boundaryBeziers, boundaryBeziersOpp } = r;
35
-
36
- const matchedBezierss: MatchedBeziers[] = splitTriPath(
37
- boundaryBeziers,
38
- medialBezier,
39
- boundaryBeziersOpp ?? []
40
- );
41
-
42
- return matchedBezierss;
43
- }
44
-
45
-
46
- export { getMatchingBeziers }
@@ -1,19 +0,0 @@
1
- import type { Mat } from "../mat/mat.js";
2
- import { getSats2 } from "./get-sats2.js";
3
- import { getMbssByLoopWithOppArr } from "./get-mbss-by-loop-with-opp-arr.js";
4
- import { getCpNodessForSat } from "./get-cp-nodess-for-sat.js";
5
-
6
-
7
- function getMbssByLoopPerSat(
8
- mats: Mat[],
9
- satScale: number) {
10
-
11
- const sats = getSats2(mats, satScale);
12
-
13
- const cpNodessPerSat = sats.map(getCpNodessForSat);
14
-
15
- return cpNodessPerSat.map(getMbssByLoopWithOppArr);
16
- }
17
-
18
-
19
- export { getMbssByLoopPerSat }
@@ -1,69 +0,0 @@
1
- import type { CpNode } from "../cp-node/cp-node.js";
2
- import type { MatchedBeziers } from "./matched-beziers.js";
3
- import { getMatchingBeziers } from "./get-matching-beziers.js";
4
- import { isFullyTerminating } from "./is-fully-terminating.js";
5
-
6
-
7
- function getMbssByLoopWithOppArr(
8
- cpNodess: CpNode[][]) {
9
-
10
- const mbssByLoop: (MatchedBeziers[] | undefined)[][] = [];
11
-
12
- /**
13
- * An array with each entry being a pair of indices mapping from
14
- * `MatchedBeziers[]` on one side to `MatchedBeziers[]` on the other side
15
- */
16
- const mbMap: Map<CpNode, [number,number]> = new Map();
17
-
18
- for (let l=0; l<cpNodess.length; l++) {
19
- const cpNodes = cpNodess[l];
20
-
21
- const mbss: (MatchedBeziers[] | undefined)[] = [];
22
- for (let i=0; i<cpNodes.length; i++) {
23
- const cpNode = cpNodes[i];
24
-
25
- mbMap.set(cpNode, [l,i]);
26
-
27
- const mbs = getMatchingBeziers(cpNode);
28
-
29
- mbss.push(mbs);
30
- }
31
-
32
- mbssByLoop.push(mbss);
33
- }
34
-
35
-
36
- const oppArr: [[number,number],[number,number]][] = [];
37
-
38
- for (let l=0; l<cpNodess.length; l++) {
39
- const cpNodes = cpNodess[l];
40
-
41
- for (let i=0; i<cpNodes.length; i++) {
42
- const cpNode = cpNodes[i];
43
-
44
- const cpNodeOpp = isFullyTerminating(cpNode)
45
- ? undefined // no opposite boundary
46
- : cpNode.next.prevOnCircle;
47
-
48
- // if (cpNodeOpp === undefined) {
49
- // continue;
50
- // }
51
-
52
- const oppIdxs = cpNodeOpp === undefined
53
- ? [255,65535] as [number,number]
54
- : mbMap.get(cpNodeOpp);
55
-
56
- const mbs = mbssByLoop[l][i];
57
- if (oppIdxs !== undefined && mbs !== undefined) {
58
- oppArr.push([[l,i], oppIdxs]);
59
- } else {
60
- oppArr.push([[l,i], [255,65535]]);
61
- }
62
- }
63
- }
64
-
65
- return { mbssByLoop, oppArr };
66
- }
67
-
68
-
69
- export { getMbssByLoopWithOppArr }
@@ -1,25 +0,0 @@
1
- import type { Mat } from '../mat/mat.js';
2
- import { findMats } from '../find-mat/find-mats.js';
3
- import { removeSatInducedTrivial3Prongs } from "./remove-sat-induced-trivial-3prongs.js";
4
- import { toScaleAxis } from '../sat/to-scale-axis.js';
5
-
6
-
7
- /**
8
- * Returns the shape information.
9
- *
10
- * @param font$$ the font from which the glyph outlines will be retrieved
11
- * @param glyphId the glyph id for which the shape is to be retrieved
12
- * @param options the options for SAT computation
13
- */
14
- // TODO
15
- function getSats2(
16
- mats: Mat[],
17
- satScale: number): Mat[] {
18
-
19
- const sats = mats.map(mat => toScaleAxis(mat, satScale));
20
-
21
- return sats.map(removeSatInducedTrivial3Prongs);
22
- }
23
-
24
-
25
- export { getSats2 }
@@ -1,27 +0,0 @@
1
- import type { CpNode } from '../cp-node/cp-node.js';
2
- import { getAllOnCircle } from '../cp-node/fs/get-all-on-circle.js';
3
- import { isTerminating } from '../cp-node/fs/is-terminating.js';
4
- import { isTrivial } from '../cp-node/fs/is-trivial.js';
5
-
6
-
7
- // TODO - DUPLICATE! -> likely other version needs fixing
8
- function isFullyTerminating(cpNode: CpNode) {
9
- if (!isTerminating(cpNode)) {
10
- return false;
11
- }
12
-
13
- if (isTrivial(cpNode)) {
14
- return true;
15
- }
16
-
17
- while (cpNode.prev === cpNode.prevOnCircle) {
18
- cpNode = cpNode.prev;
19
- }
20
-
21
- const otherOnCircle = getAllOnCircle(cpNode.prevOnCircle, true);
22
-
23
- return otherOnCircle.every(isTerminating);
24
- }
25
-
26
-
27
- export { isFullyTerminating }
@@ -1,14 +0,0 @@
1
- import type { BezierPiece } from 'flo-bezier3';
2
-
3
-
4
- /**
5
- * A type representing a correspondence between 3 bezier curves (one on the
6
- * boundary, one on the medial axis and one on the opposite boundary)
7
- */
8
- interface MatchedBeziers {
9
- readonly medialBezier: BezierPiece;
10
- readonly boundaryBezier: BezierPiece;
11
- }
12
-
13
-
14
- export type { MatchedBeziers }
@@ -1,280 +0,0 @@
1
- import type { BezierPiece } from 'flo-bezier3';
2
- import type { MatchedBeziers } from './matched-beziers.js';
3
- import { getTAtLength } from 'flo-bezier3';
4
- import { sum } from '../utils/sum.js';
5
- import { clip } from '../utils/clip.js';
6
- import { getBezierPieceLength } from './get-bezier-piece-length.js';
7
-
8
-
9
- const EPS = 1e-9;
10
-
11
-
12
- function splitTriPath(
13
- boundaryBeziers: BezierPiece[],
14
- medialBezier: BezierPiece,
15
- boundaryBeziersOpp: BezierPiece[] | undefined): MatchedBeziers[] {
16
-
17
- const _boundaryBeziersOpp = boundaryBeziersOpp ?? [];
18
-
19
- const boundaryBeziersOpp_ =
20
- _boundaryBeziersOpp.map(reverseBezierPiece).toReversed();
21
-
22
- // Importantly, we need to split on boundaryBeziersOpp_ as well, to ensure
23
- // the number of returned pieces is the same for both sides, so that they
24
- // can be interpolated.
25
- const _paths = boundaryBeziersOpp_.length > 0
26
- ? [boundaryBeziers, [medialBezier], boundaryBeziersOpp_]
27
- : [boundaryBeziers, [medialBezier]];
28
-
29
- const paths = splitTriPath_(_paths);
30
-
31
- const matchedBezierss: MatchedBeziers[] = [];
32
- for (let i=0; i<paths.length; i++) {
33
- const path = paths[i];
34
- // const pathOpp = paths[paths.length - 1 - i];
35
-
36
- const [boundaryBezier, medialBezier] = path;
37
- // const boundaryBezierOpp = pathOpp[2];
38
- const matchedBeziers: MatchedBeziers = {
39
- boundaryBezier,
40
- medialBezier,
41
- // boundaryBezierOpp
42
- };
43
- matchedBezierss.push(matchedBeziers);
44
- }
45
-
46
- return matchedBezierss;
47
- }
48
-
49
-
50
- function reverseBezierPiece(
51
- bezierPiece: BezierPiece) {
52
-
53
- const { ps, ts: [tS, tE] } = bezierPiece;
54
-
55
- return {
56
- ps: ps.toReversed(),
57
- ts: [1 - tE, 1 - tS]
58
- };
59
- }
60
-
61
-
62
- /**
63
- * Returns an array of arrays of `BezierPiece`s, where each inner array
64
- * contains `BezierPiece`s that correspond to each other across the different
65
- * paths by normalized length.
66
- *
67
- * For example, if there are 3 paths, then each inner array will contain 3
68
- * `BezierPiece`s, one from each path, that correspond to each other by normalized
69
- * length.
70
- *
71
- * @param bezierPiecess
72
- */
73
- function splitTriPath_(
74
- bezierPiecess: BezierPiece[][]): BezierPiece[][] {
75
-
76
- const lenss = mapmap(bezierPiecess, getBezierPieceLength);
77
- const lens = lenss.map(sum);
78
- const cums = lenss.map(getCumLengths);
79
-
80
- const normCums = cums.map((cum,i) => {
81
- const len = lens[i];
82
- if (len <= EPS) {
83
- return cum.map((_,j) => j === 0 ? 0 : 1);
84
- // return cum.map(() => Number.POSITIVE_INFINITY);
85
- }
86
-
87
- return cum.map(l => l/len);
88
- });
89
-
90
-
91
- /** Current position of start t */
92
- let ts = new Array(bezierPiecess.length).fill(0);
93
- /** Current position of i */
94
- let is = new Array(bezierPiecess.length).fill(0);
95
-
96
- const matchedBezierss: BezierPiece[][] = [];
97
-
98
- normCums;//?
99
-
100
- let ii = 0;
101
- const maxIterations = 100;
102
- while (ts.some(t => t < 1) && ii++ < maxIterations) {
103
- const normCumsNext: number[] = [];
104
- for (let k=0; k<bezierPiecess.length; k++) {
105
- const i_ = is[k];
106
-
107
- const normCum_ = normCums[k][i_ + 1];//?
108
- const normCum = normCum_ === undefined
109
- ? Number.POSITIVE_INFINITY
110
- : normCum_;
111
-
112
- normCumsNext.push(normCum);
113
- }
114
-
115
- normCumsNext;//?
116
-
117
- const minIdx = getMinIdx(normCumsNext)!;//?
118
- const idxs = getIdxs(normCumsNext, normCumsNext[minIdx]);//?
119
- const curCum = normCumsNext[minIdx];
120
-
121
- // if (idxs.length === 0) {
122
- // throw new Error('splitTriPath_: unable to make progress');
123
- // }
124
-
125
- const nextPieces: BezierPiece[] = new Array(bezierPiecess.length).fill([]);
126
- for (let m=0; m<bezierPiecess.length; m++) {
127
- const bezierPieces = bezierPiecess[m];
128
- const _i = is[m];
129
-
130
- // This path is already finished; keep emitting a degenerate tail.
131
- if (_i >= bezierPieces.length) {
132
- const lastBezierPiece = bezierPieces[bezierPieces.length - 1];
133
- nextPieces[m] = {
134
- ps: lastBezierPiece.ps,
135
- ts: [1, 1]
136
- };
137
- ts[m] = 1;
138
- continue;
139
- }
140
-
141
- if (idxs.includes(m)) {
142
- const _t = ts[m];
143
- const bezierPiece = bezierPieces[_i];
144
- const [pieceTS, pieceTE] = bezierPiece.ts;
145
- const pieceDt = pieceTE - pieceTS;
146
-
147
- nextPieces[m] = {
148
- ps: bezierPiece.ps,
149
- ts: [pieceTS + _t*pieceDt, pieceTE]
150
- };
151
-
152
- const nextI = _i + 1;
153
- is[m] = nextI;
154
- ts[m] = nextI >= bezierPieces.length ? 1 : 0;
155
- } else {
156
- const _t = ts[m];
157
- const bezierPiece = bezierPieces[_i];
158
- const [pieceTS, pieceTE] = bezierPiece.ts;
159
- const pieceDt = pieceTE - pieceTS;
160
- const bezierLen = getBezierPieceLength({ ps: bezierPiece.ps, ts: [0, 1] });
161
-
162
- const normCumStart = normCums[m][_i];
163
- const normCumEnd = normCums[m][_i + 1];
164
- const normCumDt = normCumEnd - normCumStart;
165
- const normWithinPiece = normCumDt <= EPS
166
- ? _t
167
- : clip((curCum - normCumStart) / normCumDt, _t, 1);
168
-
169
- const t1 = bezierLen <= EPS
170
- ? _t
171
- : clip(getTAtLength(bezierPiece.ps, bezierLen * normWithinPiece), _t, 1);
172
-
173
- nextPieces[m] = {
174
- ps: bezierPiece.ps,
175
- ts: [pieceTS + _t*pieceDt, pieceTS + t1*pieceDt]
176
- };
177
-
178
- if (closeToEps(t1, 1)) {
179
- const nextI = _i + 1;
180
- is[m] = nextI;
181
- ts[m] = nextI >= bezierPieces.length ? 1 : 0;
182
- } else {
183
- is[m] = _i;
184
- ts[m] = t1;
185
- }
186
- }
187
- }
188
-
189
- matchedBezierss.push(nextPieces);
190
- }
191
-
192
- if (ts.some(t => t < 1)) {
193
- throw new Error('splitTriPath_: exceeded maximum iterations');
194
- }
195
-
196
- return matchedBezierss;
197
- }
198
-
199
-
200
- function getCumLengths(lens: number[]) {
201
- const cum: number[] = [0];
202
- let cumLen = 0;
203
- for (let j=0; j<lens.length; j++) {
204
- cumLen += lens[j];
205
- cum.push(cumLen);
206
- }
207
- return cum;
208
- }
209
-
210
-
211
- /**
212
- * Returns the index within the given array of the number with the highest
213
- * value.
214
- *
215
- * * returns `undefined` if the array is empty
216
- */
217
- function getMinIdx(
218
- vs: number[]): number | undefined {
219
-
220
- let minIdx: number | undefined = undefined;
221
- let minVal = Number.POSITIVE_INFINITY;
222
- for (let i=0; i<vs.length; i++) {
223
- if (vs[i] <= minVal) {
224
- minVal = vs[i];
225
- minIdx = i;
226
- }
227
- }
228
-
229
- return minIdx;
230
- }
231
-
232
-
233
- /**
234
- * Returns the indices within the given array of the numbers that are equal to
235
- * the given max value (within an EPS value).
236
- *
237
- * @param vs
238
- * @param maxVal
239
- */
240
- function getIdxs(
241
- vs: number[],
242
- maxVal: number): number[] {
243
-
244
- const maxIdxs: number[] = [];
245
- for (let i=0; i<vs.length; i++) {
246
- if (vs[i] === maxVal || closeToEps(vs[i], maxVal)) {
247
- maxIdxs.push(i);
248
- }
249
- }
250
-
251
- return maxIdxs;
252
- }
253
-
254
-
255
- function closeToEps(a: number, b: number) {
256
- return Math.abs(a - b) <= EPS;
257
- }
258
-
259
-
260
- export { splitTriPath, getCumLengths };
261
-
262
-
263
-
264
- // KEEP FOR TESTING! - one in opentype-ts doesn't work with tests due to aliases
265
- function mapmap<T,U>(
266
- tss: T[][],
267
- f: (t: T) => U): U[][] {
268
-
269
- const tss_: U[][] = [];
270
- for (let i=0; i<tss.length; i++) {
271
- const ts = tss[i];
272
- const ts_: U[] = [];
273
- for (let j=0; j<ts.length; j++) {
274
- ts_.push(f(ts[j]));
275
- }
276
- tss_.push(ts_);
277
- }
278
-
279
- return tss_;
280
- }