flo-mat 3.0.14 → 4.0.1

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 (642) hide show
  1. package/__tests__/cp-node/check-clone-eql-calc.spec.ts +58 -0
  2. package/__tests__/cp-node/compare-cp-nodes-by-value.ts +37 -0
  3. package/__tests__/cp-node/compare-loops-by-value.ts +40 -0
  4. package/__tests__/cp-node/compare-poss-by-value.ts +25 -0
  5. package/__tests__/cp-node/fs/clone.spec.ts +19 -3
  6. package/__tests__/cp-node/fs/find-first.spec.ts +13 -3
  7. package/__tests__/cp-node/fs/get-all-between.spec.ts +20 -3
  8. package/__tests__/cp-node/fs/get-all-on-circle.spec.ts +10 -10
  9. package/__tests__/cp-node/fs/get-all-on-loop.spec.ts +16 -3
  10. package/__tests__/cp-node/fs/get-all-vertices.spec.ts +14 -3
  11. package/__tests__/cp-node/fs/get-children.spec.ts +18 -3
  12. package/__tests__/cp-node/fs/get-non-terminating-on-circle.spec.ts +14 -3
  13. package/__tests__/cp-node/fs/get-prong-count.spec.ts +16 -3
  14. package/__tests__/cp-node/fs/get-real-prong-count.spec.ts +11 -3
  15. package/__tests__/cp-node/fs/get-terminating-on-circle.spec.ts +20 -3
  16. package/__tests__/cp-node/fs/is-fully-terminating.spec.ts +16 -3
  17. package/__tests__/cp-node/fs/is-on-same-circle.spec.ts +20 -3
  18. package/__tests__/cp-node/fs/is-one-prong.spec.ts +16 -3
  19. package/__tests__/cp-node/fs/is-sharp.spec.ts +10 -3
  20. package/__tests__/cp-node/fs/is-single-3-prong.spec.ts +13 -3
  21. package/__tests__/cp-node/fs/is-special.spec.ts +12 -3
  22. package/__tests__/cp-node/fs/is-terminating.spec.ts +15 -3
  23. package/__tests__/cp-node/fs/is-trivial.spec.ts +13 -3
  24. package/__tests__/cp-node/fs/is-two-prong.spec.ts +11 -3
  25. package/__tests__/cp-node/fs/is-vertex-special.spec.ts +13 -3
  26. package/__tests__/cp-node/fs/is-vertex.spec.ts +14 -3
  27. package/__tests__/cp-node/fs/iterate-all-on-loop.spec.ts +13 -3
  28. package/__tests__/cp-node/fs/traverse-all-forward.spec.ts +10 -3
  29. package/__tests__/cp-node/fs/traverse-cp.spec.ts +9 -3
  30. package/__tests__/cp-node/fs/traverse-edges.spec.ts +13 -3
  31. package/__tests__/cp-node/fs/traverse-vertices.spec.ts +12 -3
  32. package/__tests__/cp-node/random-walk.ts +33 -0
  33. package/__tests__/cp-node/stringification/from-stringifyable.spec.ts +3 -0
  34. package/__tests__/cp-node/stringification/loop-from-stringifyable.spec.ts +4 -0
  35. package/__tests__/cp-node/stringification/loop-to-stringifyable.spec.ts +19 -0
  36. package/__tests__/cp-node/stringification/to-stringifyable.spec.ts +34 -0
  37. package/__tests__/get-mats1.ts +122 -0
  38. package/__tests__/helpers/close-to.ts +71 -0
  39. package/__tests__/helpers/jest-extend-nearly.ts +39 -0
  40. package/__tests__/helpers/jest.setup.ts +6 -0
  41. package/__tests__/helpers/obj-or-array.ts +8 -0
  42. package/__tests__/jest-extensions.d.ts +26 -0
  43. package/__tests__/jsog/check-jsog-eql-calc.spec.ts +47 -67
  44. package/__tests__/jsog/decode-jsog.ts +88 -85
  45. package/__tests__/jsog/mat-dummy-1.ts +19 -0
  46. package/__tests__/jsog/mat-dummys.ts +6197 -6195
  47. package/__tests__/jsog/to-jsog-breath-first.ts +110 -107
  48. package/__tests__/jsog/to-jsog-depth-first.ts +58 -55
  49. package/__tests__/lib-load.spec.ts +1 -1
  50. package/browser/index.js +21168 -17746
  51. package/browser/index.min.js +1 -1
  52. package/jest.config.cjs +2 -0
  53. package/node/add-n-prong.ts/join-spokes.d.ts +2 -2
  54. package/node/add-n-prong.ts/join-spokes.js +5 -4
  55. package/node/add-n-prong.ts/join-spokes.js.map +1 -1
  56. package/node/closest-boundary-point/cull-bezier-pieces-1.d.ts +9 -0
  57. package/node/closest-boundary-point/{cull-bezier-pieces.js → cull-bezier-pieces-1.js} +6 -7
  58. package/node/closest-boundary-point/cull-bezier-pieces-1.js.map +1 -0
  59. package/node/closest-boundary-point/cull-by-loose-bounding-box.d.ts +7 -5
  60. package/node/closest-boundary-point/cull-by-loose-bounding-box.js +12 -10
  61. package/node/closest-boundary-point/cull-by-loose-bounding-box.js.map +1 -1
  62. package/node/closest-boundary-point/cull-by-tight-boundary-box.js +2 -2
  63. package/node/closest-boundary-point/foot-and-endpoint-info.d.ts +9 -9
  64. package/node/closest-boundary-point/get-best-distance-squared.d.ts +4 -3
  65. package/node/closest-boundary-point/get-best-distance-squared.js +11 -11
  66. package/node/closest-boundary-point/get-best-distance-squared.js.map +1 -1
  67. package/node/closest-boundary-point/get-close-boundary-points-certified.d.ts +6 -10
  68. package/node/closest-boundary-point/get-close-boundary-points-certified.js +22 -18
  69. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  70. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.d.ts +6 -10
  71. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js +12 -79
  72. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js.map +1 -1
  73. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.d.ts +1 -1
  74. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js +5 -5
  75. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js.map +1 -1
  76. package/node/corner/compare-curvatures-at-interface.d.ts +1 -1
  77. package/node/corner/compare-curvatures-at-interface.js +1 -1
  78. package/node/corner/corner.d.ts +7 -6
  79. package/node/corner/get-corner.d.ts +1 -6
  80. package/node/corner/get-corner.js +2 -9
  81. package/node/corner/get-corner.js.map +1 -1
  82. package/node/corner/get-interface-ccw.d.ts +2 -2
  83. package/node/corner/get-interface-ccw.js +4 -5
  84. package/node/corner/get-interface-ccw.js.map +1 -1
  85. package/node/cp-node/cp-node-fs.d.ts +0 -15
  86. package/node/cp-node/cp-node-fs.js +0 -4
  87. package/node/cp-node/cp-node-fs.js.map +1 -1
  88. package/node/cp-node/cp-node.d.ts +11 -11
  89. package/node/cp-node/fs/clone.js +3 -3
  90. package/node/cp-node/fs/clone.js.map +1 -1
  91. package/node/cp-node/fs/cp-node-comparator.js +2 -2
  92. package/node/cp-node/fs/cp-node-comparator.js.map +1 -1
  93. package/node/cp-node/fs/enhance-cp-node.d.ts +3 -3
  94. package/node/cp-node/fs/enhance-cp-node.js +5 -5
  95. package/node/cp-node/fs/enhance-cp-node.js.map +1 -1
  96. package/node/cp-node/fs/find-first.d.ts +9 -2
  97. package/node/cp-node/fs/find-first.js +12 -9
  98. package/node/cp-node/fs/find-first.js.map +1 -1
  99. package/node/cp-node/fs/get-all-on-loop.js +5 -6
  100. package/node/cp-node/fs/get-all-on-loop.js.map +1 -1
  101. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js +2 -2
  102. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js.map +1 -1
  103. package/node/cp-node/fs/get-cp-node-ordering.js +4 -4
  104. package/node/cp-node/fs/get-cp-node-ordering.js.map +1 -1
  105. package/node/cp-node/fs/get-edge-direction.d.ts +1 -1
  106. package/node/cp-node/fs/get-edge-direction.js +3 -3
  107. package/node/cp-node/fs/get-edge-direction.js.map +1 -1
  108. package/node/cp-node/fs/get-hole-closers.d.ts +1 -1
  109. package/node/cp-node/fs/get-implied-boundary-bezier-between.js +2 -2
  110. package/node/cp-node/fs/get-implied-boundary-bezier-between.js.map +1 -1
  111. package/node/cp-node/fs/get-mat-curve-between.d.ts +1 -1
  112. package/node/cp-node/fs/get-mat-curve-between.js +6 -5
  113. package/node/cp-node/fs/get-mat-curve-between.js.map +1 -1
  114. package/node/cp-node/fs/get-salience.d.ts +1 -1
  115. package/node/cp-node/fs/get-salience.js +3 -3
  116. package/node/cp-node/fs/get-salience.js.map +1 -1
  117. package/node/cp-node/fs/insert-cp-node.d.ts +3 -3
  118. package/node/cp-node/fs/insert-cp-node.js +3 -4
  119. package/node/cp-node/fs/insert-cp-node.js.map +1 -1
  120. package/node/cp-node/fs/is-on-same-circle.d.ts +1 -0
  121. package/node/cp-node/fs/is-on-same-circle.js +1 -0
  122. package/node/cp-node/fs/is-on-same-circle.js.map +1 -1
  123. package/node/cp-node/fs/is-one-prong.d.ts +1 -1
  124. package/node/cp-node/fs/is-one-prong.js +2 -9
  125. package/node/cp-node/fs/is-one-prong.js.map +1 -1
  126. package/node/cp-node/fs/is-order-correct.d.ts +2 -2
  127. package/node/cp-node/fs/is-order-correct.js +5 -8
  128. package/node/cp-node/fs/is-order-correct.js.map +1 -1
  129. package/node/cp-node/fs/is-sharp.js +1 -1
  130. package/node/cp-node/fs/is-sharp.js.map +1 -1
  131. package/node/cp-node/fs/remove-cp-node.js +1 -2
  132. package/node/cp-node/fs/remove-cp-node.js.map +1 -1
  133. package/node/debug/debug-elem-types.d.ts +1 -2
  134. package/node/debug/debug-elem-types.js +1 -2
  135. package/node/debug/debug-elem-types.js.map +1 -1
  136. package/node/debug/functions/draw-elem/draw-cp-node.js +2 -2
  137. package/node/debug/functions/draw-elem/draw-cp-node.js.map +1 -1
  138. package/node/debug/functions/draw-elem/draw-dull-corner.d.ts +1 -1
  139. package/node/debug/functions/draw-elem/draw-dull-corner.js +1 -1
  140. package/node/debug/functions/draw-elem/draw-dull-corner.js.map +1 -1
  141. package/node/debug/functions/draw-elem/draw-elem.js +1 -5
  142. package/node/debug/functions/draw-elem/draw-elem.js.map +1 -1
  143. package/node/debug/functions/draw-elem/draw-leaves.js +2 -2
  144. package/node/debug/functions/draw-elem/draw-leaves.js.map +1 -1
  145. package/node/debug/functions/draw-elem/draw-max-vertex.d.ts +1 -1
  146. package/node/debug/functions/draw-elem/draw-max-vertex.js +1 -1
  147. package/node/debug/functions/draw-elem/draw-max-vertex.js.map +1 -1
  148. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js +12 -3
  149. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js.map +1 -1
  150. package/node/debug/functions/draw-elem/draw-one-prong.d.ts +2 -2
  151. package/node/debug/functions/draw-elem/draw-one-prong.js +8 -7
  152. package/node/debug/functions/draw-elem/draw-one-prong.js.map +1 -1
  153. package/node/debug/functions/draw-elem/draw-sharp-corner.d.ts +1 -1
  154. package/node/debug/functions/draw-elem/draw-sharp-corner.js +2 -1
  155. package/node/debug/functions/draw-elem/draw-sharp-corner.js.map +1 -1
  156. package/node/debug/functions/draw-elem/draw-three-prong.js +2 -2
  157. package/node/debug/functions/draw-elem/draw-three-prong.js.map +1 -1
  158. package/node/debug/functions/draw-elem/draw-two-prong.js +4 -3
  159. package/node/debug/functions/draw-elem/draw-two-prong.js.map +1 -1
  160. package/node/debug/functions/draw-elem/draw-vertex.js +1 -1
  161. package/node/debug/functions/draw-elem/draw-vertex.js.map +1 -1
  162. package/node/debug/functions/general.js +1 -1
  163. package/node/debug/functions/general.js.map +1 -1
  164. package/node/find-2-prong/add-1-prong.d.ts +3 -3
  165. package/node/find-2-prong/add-1-prong.js +4 -4
  166. package/node/find-2-prong/add-1-prong.js.map +1 -1
  167. package/node/find-2-prong/add-2-prong.d.ts +10 -11
  168. package/node/find-2-prong/add-2-prong.js +42 -37
  169. package/node/find-2-prong/add-2-prong.js.map +1 -1
  170. package/node/find-2-prong/calc-seperation-tolerance.js +4 -7
  171. package/node/find-2-prong/calc-seperation-tolerance.js.map +1 -1
  172. package/node/find-2-prong/cull-bezier-pieces.d.ts +9 -7
  173. package/node/find-2-prong/cull-bezier-pieces.js +30 -15
  174. package/node/find-2-prong/cull-bezier-pieces.js.map +1 -1
  175. package/node/find-2-prong/find-2-prong.d.ts +12 -13
  176. package/node/find-2-prong/find-2-prong.js +73 -116
  177. package/node/find-2-prong/find-2-prong.js.map +1 -1
  178. package/node/find-2-prong/find-and-add-2-prongs-on-all-loops.d.ts +4 -4
  179. package/node/find-2-prong/find-and-add-2-prongs-on-all-loops.js.map +1 -1
  180. package/node/find-2-prong/find-and-add-2-prongs.d.ts +5 -4
  181. package/node/find-2-prong/find-and-add-2-prongs.js +28 -24
  182. package/node/find-2-prong/find-and-add-2-prongs.js.map +1 -1
  183. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.d.ts +6 -8
  184. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.js +11 -12
  185. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.js.map +1 -1
  186. package/node/find-2-prong/get-initial-bezier-pieces.d.ts +5 -6
  187. package/node/find-2-prong/get-initial-bezier-pieces.js +8 -11
  188. package/node/find-2-prong/get-initial-bezier-pieces.js.map +1 -1
  189. package/node/find-2-prong/get-initial-x.d.ts +12 -0
  190. package/node/find-2-prong/get-initial-x.js +35 -0
  191. package/node/find-2-prong/get-initial-x.js.map +1 -0
  192. package/node/find-2-prong/get-medial/antipodal-point.d.ts +8 -0
  193. package/node/find-2-prong/get-medial/antipodal-point.js +2 -0
  194. package/node/find-2-prong/get-medial/antipodal-point.js.map +1 -0
  195. package/node/find-2-prong/get-medial/get-antipodal-points.d.ts +18 -0
  196. package/node/find-2-prong/get-medial/get-antipodal-points.js +41 -0
  197. package/node/find-2-prong/get-medial/get-antipodal-points.js.map +1 -0
  198. package/node/find-2-prong/get-medial/get-closest-points.d.ts +15 -0
  199. package/node/find-2-prong/get-medial/get-closest-points.js +163 -0
  200. package/node/find-2-prong/get-medial/get-closest-points.js.map +1 -0
  201. package/node/find-2-prong/reduce-radius.d.ts +4 -4
  202. package/node/find-2-prong/reduce-radius.js +30 -50
  203. package/node/find-2-prong/reduce-radius.js.map +1 -1
  204. package/node/find-3-prong/calc-better-x.d.ts +22 -0
  205. package/node/{find-3-prong.ts → find-3-prong}/calc-better-x.js +8 -5
  206. package/node/find-3-prong/calc-better-x.js.map +1 -0
  207. package/node/find-3-prong/calc-initial-3-prong-center.d.ts +15 -0
  208. package/node/find-3-prong/calc-initial-3-prong-center.js +26 -0
  209. package/node/find-3-prong/calc-initial-3-prong-center.js.map +1 -0
  210. package/node/find-3-prong/find-3-prong-for-delta3s.d.ts +19 -0
  211. package/node/{find-3-prong.ts → find-3-prong}/find-3-prong-for-delta3s.js +32 -34
  212. package/node/find-3-prong/find-3-prong-for-delta3s.js.map +1 -0
  213. package/node/find-3-prong/find-3-prong.d.ts +13 -0
  214. package/node/{find-3-prong.ts → find-3-prong}/find-3-prong.js +14 -9
  215. package/node/find-3-prong/find-3-prong.js.map +1 -0
  216. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.js +2 -2
  217. package/node/find-3-prong/find-and-add-3-prong.js.map +1 -0
  218. package/node/find-3-prong/find-and-add-3-prongs-on-loop.js.map +1 -0
  219. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.js +1 -1
  220. package/node/find-3-prong/find-and-add-3-prongs.js.map +1 -0
  221. package/node/find-3-prong/get-closest-points.d.ts +10 -0
  222. package/node/{find-3-prong.ts → find-3-prong}/get-closest-points.js +5 -5
  223. package/node/find-3-prong/get-closest-points.js.map +1 -0
  224. package/node/find-3-prong/three-prong-info.d.ts +9 -0
  225. package/node/find-3-prong/three-prong-info.js +2 -0
  226. package/node/find-3-prong/three-prong-info.js.map +1 -0
  227. package/node/find-mat/clip-options.d.ts +2 -2
  228. package/node/find-mat/clip-options.js +7 -14
  229. package/node/find-mat/clip-options.js.map +1 -1
  230. package/node/find-mat/create-initial-cp-tree.d.ts +8 -7
  231. package/node/find-mat/create-initial-cp-tree.js +16 -19
  232. package/node/find-mat/create-initial-cp-tree.js.map +1 -1
  233. package/node/find-mat/find-mat.d.ts +1 -1
  234. package/node/find-mat/find-mat.js +6 -12
  235. package/node/find-mat/find-mat.js.map +1 -1
  236. package/node/find-mat/find-mats.js +8 -8
  237. package/node/find-mat/find-mats.js.map +1 -1
  238. package/node/find-mat/get-dull-corners-on-loop.d.ts +3 -3
  239. package/node/find-mat/get-dull-corners-on-loop.js +5 -4
  240. package/node/find-mat/get-dull-corners-on-loop.js.map +1 -1
  241. package/node/find-mat/get-for-1-prongs-on-loop.d.ts +7 -7
  242. package/node/find-mat/get-for-1-prongs-on-loop.js +9 -21
  243. package/node/find-mat/get-for-1-prongs-on-loop.js.map +1 -1
  244. package/node/find-mat/get-for-2-prongs-on-loop.d.ts +5 -4
  245. package/node/find-mat/get-for-2-prongs-on-loop.js +4 -6
  246. package/node/find-mat/get-for-2-prongs-on-loop.js.map +1 -1
  247. package/node/find-mat/get-meta.d.ts +5 -5
  248. package/node/find-mat/get-meta.js +12 -12
  249. package/node/find-mat/get-meta.js.map +1 -1
  250. package/node/find-mat/get-sharp-corners.d.ts +3 -3
  251. package/node/find-mat/get-sharp-corners.js +2 -3
  252. package/node/find-mat/get-sharp-corners.js.map +1 -1
  253. package/node/find-mat/mat-options.d.ts +15 -15
  254. package/node/find-mat/mat-options.js +7 -4
  255. package/node/find-mat/mat-options.js.map +1 -1
  256. package/node/floyd-warshall/floyd-warshall.js +1 -1
  257. package/node/floyd-warshall/floyd-warshall.js.map +1 -1
  258. package/node/floyd-warshall/get-graph.js +2 -2
  259. package/node/floyd-warshall/get-graph.js.map +1 -1
  260. package/node/floyd-warshall/get-hole-closer-pairs.js +6 -6
  261. package/node/floyd-warshall/get-hole-closer-pairs.js.map +1 -1
  262. package/node/geometry/circle.d.ts +5 -3
  263. package/node/geometry/circle.js +1 -7
  264. package/node/geometry/circle.js.map +1 -1
  265. package/node/geometry/get-closest-square-distance-to-rect.js +1 -4
  266. package/node/geometry/get-closest-square-distance-to-rect.js.map +1 -1
  267. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js +2 -1
  268. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
  269. package/node/index.d.ts +2 -9
  270. package/node/index.js +1 -5
  271. package/node/index.js.map +1 -1
  272. package/node/loop/get-max-coordinate.d.ts +2 -1
  273. package/node/loop/get-max-coordinate.js +6 -8
  274. package/node/loop/get-max-coordinate.js.map +1 -1
  275. package/node/mat/add-to-cp-tree.d.ts +3 -3
  276. package/node/mat/add-to-cp-tree.js +5 -5
  277. package/node/mat/add-to-cp-tree.js.map +1 -1
  278. package/node/mat/create-new-cp-trees.d.ts +10 -0
  279. package/node/mat/create-new-cp-trees.js +24 -0
  280. package/node/mat/create-new-cp-trees.js.map +1 -0
  281. package/node/mat/curve-piece.d.ts +4 -4
  282. package/node/mat/get-boundary-piece-beziers.d.ts +5 -5
  283. package/node/mat/get-boundary-piece-beziers.js +125 -20
  284. package/node/mat/get-boundary-piece-beziers.js.map +1 -1
  285. package/node/mat/get-branches.d.ts +1 -1
  286. package/node/mat/get-closeby-cp-if-exist.d.ts +5 -5
  287. package/node/mat/get-closeby-cp-if-exist.js +6 -5
  288. package/node/mat/get-closeby-cp-if-exist.js.map +1 -1
  289. package/node/mat/get-cp-node-to-left-or-same.d.ts +3 -3
  290. package/node/mat/get-cp-node-to-left-or-same.js +2 -2
  291. package/node/mat/get-cp-node-to-left-or-same.js.map +1 -1
  292. package/node/mat/get-largest-vertex.d.ts +1 -1
  293. package/node/mat/get-largest-vertex.js +1 -1
  294. package/node/mat/get-largest-vertex.js.map +1 -1
  295. package/node/mat/mat-meta.d.ts +5 -6
  296. package/node/mat/mat.d.ts +5 -5
  297. package/node/mat/simplify-mat.d.ts +10 -8
  298. package/node/mat/simplify-mat.js +17 -14
  299. package/node/mat/simplify-mat.js.map +1 -1
  300. package/node/mat/trim-mat.d.ts +3 -2
  301. package/node/mat/trim-mat.js +5 -3
  302. package/node/mat/trim-mat.js.map +1 -1
  303. package/node/point-on-shape/calc-pos-order.d.ts +8 -5
  304. package/node/point-on-shape/calc-pos-order.js +7 -7
  305. package/node/point-on-shape/calc-pos-order.js.map +1 -1
  306. package/node/point-on-shape/compare-poss.d.ts +4 -0
  307. package/node/point-on-shape/compare-poss.js +12 -0
  308. package/node/point-on-shape/compare-poss.js.map +1 -1
  309. package/node/point-on-shape/get-osculating-circle.d.ts +5 -6
  310. package/node/point-on-shape/get-osculating-circle.js +17 -20
  311. package/node/point-on-shape/get-osculating-circle.js.map +1 -1
  312. package/node/point-on-shape/get-pos-corner.d.ts +18 -4
  313. package/node/point-on-shape/get-pos-corner.js +6 -6
  314. package/node/point-on-shape/get-pos-corner.js.map +1 -1
  315. package/node/point-on-shape/is-pos-corner.d.ts +3 -2
  316. package/node/point-on-shape/is-pos-corner.js.map +1 -1
  317. package/node/point-on-shape/is-pos-sharp-corner.d.ts +1 -12
  318. package/node/point-on-shape/is-pos-sharp-corner.js +4 -5
  319. package/node/point-on-shape/is-pos-sharp-corner.js.map +1 -1
  320. package/node/point-on-shape/point-on-shape.d.ts +43 -10
  321. package/node/point-on-shape/pos-to-human-string.d.ts +1 -1
  322. package/node/point-on-shape/pos-to-human-string.js.map +1 -1
  323. package/node/point-on-shape/to-p.d.ts +9 -0
  324. package/node/point-on-shape/to-p.js +13 -0
  325. package/node/point-on-shape/to-p.js.map +1 -0
  326. package/node/sat/add-debug-info.d.ts +2 -1
  327. package/node/sat/add-debug-info.js +2 -1
  328. package/node/sat/add-debug-info.js.map +1 -1
  329. package/node/sat/cull-non-cycles.d.ts +2 -1
  330. package/node/sat/cull-non-cycles.js +5 -3
  331. package/node/sat/cull-non-cycles.js.map +1 -1
  332. package/node/sat/cull.js +3 -4
  333. package/node/sat/cull.js.map +1 -1
  334. package/node/sat/get-leaves.d.ts +1 -1
  335. package/node/sat/get-leaves.js +1 -2
  336. package/node/sat/get-leaves.js.map +1 -1
  337. package/node/sat/get-sat-culls.d.ts +2 -2
  338. package/node/sat/get-sat-culls.js +3 -3
  339. package/node/sat/get-sat-culls.js.map +1 -1
  340. package/node/sat/to-scale-axis.d.ts +1 -1
  341. package/node/sat/to-scale-axis.js +2 -2
  342. package/node/sat/to-scale-axis.js.map +1 -1
  343. package/node/svg/get-loop-bounds.d.ts +8 -8
  344. package/node/svg/get-loop-bounds.js +34 -71
  345. package/node/svg/get-loop-bounds.js.map +1 -1
  346. package/node/svg/get-min-y-pos.d.ts +2 -3
  347. package/node/svg/get-min-y-pos.js +2 -2
  348. package/node/svg/get-min-y-pos.js.map +1 -1
  349. package/node/svg/get-shape-bounds.d.ts +6 -6
  350. package/node/svg/get-shape-bounds.js +6 -6
  351. package/node/svg/get-shape-bounds.js.map +1 -1
  352. package/node/utils/mutable.d.ts +4 -0
  353. package/node/utils/mutable.js +2 -0
  354. package/node/utils/mutable.js.map +1 -0
  355. package/node/utils/sum.js.map +1 -1
  356. package/node/utils/time-function-call.d.ts +14 -0
  357. package/node/utils/time-function-call.js +32 -0
  358. package/node/utils/time-function-call.js.map +1 -0
  359. package/node/vertex/remove-vertex.d.ts +1 -0
  360. package/node/vertex/remove-vertex.js +1 -1
  361. package/node/vertex/remove-vertex.js.map +1 -1
  362. package/package.json +11 -13
  363. package/src/add-n-prong.ts/join-spokes.ts +8 -6
  364. package/src/closest-boundary-point/{cull-bezier-pieces.ts → cull-bezier-pieces-1.ts} +7 -7
  365. package/src/closest-boundary-point/cull-by-loose-bounding-box.ts +15 -14
  366. package/src/closest-boundary-point/cull-by-tight-boundary-box.ts +2 -2
  367. package/src/closest-boundary-point/foot-and-endpoint-info.ts +8 -10
  368. package/src/closest-boundary-point/get-best-distance-squared.ts +18 -15
  369. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +29 -33
  370. package/src/closest-boundary-point/get-potential-closest-points-on-curve-certified.ts +15 -90
  371. package/src/closest-boundary-point/root-interval-to-distance-squared-interval.ts +5 -5
  372. package/src/corner/compare-curvatures-at-interface.ts +1 -1
  373. package/src/corner/corner.ts +7 -6
  374. package/src/corner/get-corner.ts +4 -11
  375. package/src/corner/get-interface-ccw.ts +5 -5
  376. package/src/cp-node/cp-node-fs.ts +0 -5
  377. package/src/cp-node/cp-node.ts +19 -12
  378. package/src/cp-node/fs/add-distance-from.ts +36 -37
  379. package/src/cp-node/fs/clone.ts +5 -4
  380. package/src/cp-node/fs/cp-node-comparator.ts +2 -2
  381. package/src/cp-node/fs/enhance-cp-node.ts +5 -5
  382. package/src/cp-node/fs/find-first.ts +14 -11
  383. package/src/cp-node/fs/get-all-on-loop.ts +5 -6
  384. package/src/cp-node/fs/get-boundary-bezier-parts-to-next.ts +3 -3
  385. package/src/cp-node/fs/get-cp-node-ordering.ts +4 -4
  386. package/src/cp-node/fs/get-edge-direction.ts +6 -8
  387. package/src/cp-node/fs/get-hole-closers.ts +1 -1
  388. package/src/cp-node/fs/get-implied-boundary-bezier-between.ts +2 -2
  389. package/src/cp-node/fs/get-mat-curve-between.ts +8 -6
  390. package/src/cp-node/fs/get-salience.ts +4 -4
  391. package/src/cp-node/fs/insert-cp-node.ts +10 -10
  392. package/src/cp-node/fs/is-on-same-circle.ts +1 -0
  393. package/src/cp-node/fs/is-one-prong.ts +3 -14
  394. package/src/cp-node/fs/is-order-correct.ts +6 -8
  395. package/src/cp-node/fs/is-sharp.ts +1 -1
  396. package/src/cp-node/fs/remove-cp-node.ts +4 -6
  397. package/src/cp-node/stringification/cp-node-stringifyable.ts +59 -0
  398. package/src/cp-node/stringification/from-stringifyable.ts +57 -0
  399. package/src/cp-node/stringification/loop-from-stringifyable.ts +15 -0
  400. package/src/cp-node/stringification/loop-stringifyable.ts +8 -0
  401. package/src/cp-node/stringification/loop-to-stringifyable.ts +14 -0
  402. package/src/cp-node/stringification/to-stringifyable.ts +67 -0
  403. package/src/debug/debug-elem-types.ts +2 -3
  404. package/src/{mat → debug}/elem-type-two-prong.ts +1 -1
  405. package/src/debug/functions/check-ordering.ts +13 -16
  406. package/src/debug/functions/cmp-cp-on-delta.ts +3 -3
  407. package/src/debug/functions/draw-elem/draw-cp-node.ts +2 -2
  408. package/src/debug/functions/draw-elem/draw-dull-corner.ts +2 -2
  409. package/src/debug/functions/draw-elem/draw-elem.ts +1 -5
  410. package/src/debug/functions/draw-elem/draw-leaves.ts +2 -2
  411. package/src/debug/functions/draw-elem/draw-max-vertex.ts +3 -3
  412. package/src/debug/functions/draw-elem/draw-one-prong-at-dull-corner.ts +17 -3
  413. package/src/debug/functions/draw-elem/draw-one-prong.ts +10 -8
  414. package/src/debug/functions/draw-elem/draw-sharp-corner.ts +4 -3
  415. package/src/debug/functions/draw-elem/draw-three-prong.ts +2 -2
  416. package/src/debug/functions/draw-elem/draw-two-prong.ts +4 -3
  417. package/src/debug/functions/draw-elem/draw-vertex.ts +1 -1
  418. package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +2 -2
  419. package/src/debug/functions/general.ts +1 -1
  420. package/src/debug/functions/three-prong.ts +220 -220
  421. package/src/find-2-prong/add-1-prong.ts +8 -8
  422. package/src/find-2-prong/add-2-prong.ts +64 -58
  423. package/src/find-2-prong/calc-seperation-tolerance.ts +4 -8
  424. package/src/find-2-prong/cull-bezier-pieces.ts +41 -21
  425. package/src/find-2-prong/find-2-prong.ts +102 -151
  426. package/src/find-2-prong/find-and-add-2-prong.ts +23 -23
  427. package/src/find-2-prong/find-and-add-2-prongs-on-all-loops.ts +4 -6
  428. package/src/find-2-prong/find-and-add-2-prongs.ts +44 -29
  429. package/src/find-2-prong/find-and-add-hole-closing-2-prongs.ts +15 -15
  430. package/src/find-2-prong/get-initial-bezier-pieces.ts +21 -24
  431. package/src/find-2-prong/get-initial-x.ts +52 -0
  432. package/src/find-2-prong/get-medial/antipodal-point.ts +12 -0
  433. package/src/find-2-prong/get-medial/get-antipodal-points.ts +63 -0
  434. package/src/find-2-prong/get-medial/get-closest-points.ts +213 -0
  435. package/src/find-2-prong/reduce-radius.ts +38 -61
  436. package/src/find-2-prong/x-for-debugging.ts +9 -9
  437. package/src/{find-3-prong.ts → find-3-prong}/calc-better-x.ts +18 -11
  438. package/src/{find-3-prong.ts → find-3-prong}/calc-initial-3-prong-center.ts +12 -14
  439. package/src/{find-3-prong.ts → find-3-prong}/find-3-prong-for-delta3s.ts +46 -51
  440. package/src/find-3-prong/find-3-prong.ts +52 -0
  441. package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.ts +2 -2
  442. package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.ts +1 -1
  443. package/src/{find-3-prong.ts → find-3-prong}/get-closest-points.ts +8 -5
  444. package/src/find-3-prong/three-prong-info.ts +13 -0
  445. package/src/find-mat/clip-options.ts +11 -16
  446. package/src/find-mat/create-initial-cp-tree.ts +28 -33
  447. package/src/find-mat/find-mat.ts +10 -17
  448. package/src/find-mat/find-mats.ts +11 -9
  449. package/src/find-mat/fix-ordering.ts +58 -58
  450. package/src/find-mat/get-dull-corners-on-loop.ts +12 -10
  451. package/src/find-mat/get-for-1-prongs-on-loop.ts +11 -33
  452. package/src/find-mat/get-for-2-prongs-on-loop.ts +9 -12
  453. package/src/find-mat/get-meta.ts +22 -19
  454. package/src/find-mat/get-sharp-corners.ts +7 -8
  455. package/src/find-mat/mat-options.ts +22 -19
  456. package/src/floyd-warshall/floyd-warshall.ts +1 -1
  457. package/src/floyd-warshall/get-graph.ts +2 -2
  458. package/src/floyd-warshall/get-hole-closer-pairs.ts +6 -6
  459. package/src/geometry/circle.ts +6 -12
  460. package/src/geometry/get-closest-square-distance-to-rect.ts +3 -8
  461. package/src/geometry/get-closest-squared-distance-to-rotated-rect.ts +3 -2
  462. package/src/index.ts +3 -11
  463. package/src/loop/get-max-coordinate.ts +8 -9
  464. package/src/mat/add-to-cp-tree.ts +10 -11
  465. package/src/mat/clone-mat.ts +8 -4
  466. package/src/mat/clone-meta.ts +22 -10
  467. package/src/mat/create-new-cp-trees.ts +35 -0
  468. package/src/mat/curve-piece.ts +4 -4
  469. package/src/mat/get-boundary-piece-beziers.ts +156 -40
  470. package/src/mat/get-branches.ts +1 -1
  471. package/src/mat/get-closeby-cp-if-exist.ts +11 -12
  472. package/src/mat/get-cp-node-to-left-or-same.ts +5 -5
  473. package/src/mat/get-largest-3-prong.ts +2 -2
  474. package/src/mat/get-largest-vertex.ts +2 -2
  475. package/src/mat/mat-meta.ts +7 -6
  476. package/src/mat/mat.ts +5 -5
  477. package/src/mat/simplify-mat.ts +20 -17
  478. package/src/mat/trim-mat.ts +6 -4
  479. package/src/point-on-shape/calc-pos-order.ts +10 -11
  480. package/src/point-on-shape/compare-poss.ts +11 -1
  481. package/src/point-on-shape/get-osculating-circle.ts +25 -28
  482. package/src/point-on-shape/get-pos-corner.ts +14 -12
  483. package/src/point-on-shape/is-pos-corner.ts +1 -4
  484. package/src/point-on-shape/is-pos-dull-corner.ts +9 -9
  485. package/src/point-on-shape/is-pos-quite-dull-corner.ts +7 -6
  486. package/src/point-on-shape/is-pos-quite-sharp-corner.ts +7 -6
  487. package/src/point-on-shape/is-pos-sharp-corner.ts +6 -5
  488. package/src/point-on-shape/point-on-shape.ts +48 -10
  489. package/src/point-on-shape/pos-to-human-string.ts +4 -2
  490. package/src/point-on-shape/to-p.ts +19 -0
  491. package/src/sat/add-debug-info.ts +3 -3
  492. package/src/sat/cull-non-cycles.ts +8 -6
  493. package/src/sat/cull.ts +7 -8
  494. package/src/sat/get-leaves.ts +2 -4
  495. package/src/sat/get-sat-culls.ts +6 -5
  496. package/src/sat/to-scale-axis.ts +4 -5
  497. package/src/svg/get-loop-bounds.ts +63 -89
  498. package/src/svg/get-min-y-pos.ts +3 -4
  499. package/src/svg/get-shape-bounds.ts +12 -12
  500. package/src/sweep-line/are-boxes-intersecting.ts +3 -2
  501. package/src/utils/mutable.ts +7 -0
  502. package/src/utils/rad-to-deg.ts +1 -1
  503. package/src/utils/smart-log.ts +20 -0
  504. package/src/utils/sum.ts +3 -1
  505. package/src/utils/time-function-call.ts +53 -0
  506. package/src/vertex/remove-vertex.ts +1 -3
  507. package/.eslintrc.cjs +0 -69
  508. package/__tests__/cp-node/fs/add-distance-from.spec.ts +0 -7
  509. package/__tests__/cp-node/fs/cp-nodes-to-boundary-beziers.spec.ts +0 -7
  510. package/__tests__/cp-node/fs/create-cp-node.spec.ts +0 -7
  511. package/__tests__/cp-node/fs/enhance-cp-node.spec.ts +0 -7
  512. package/__tests__/cp-node/fs/get-avg-speed.spec.ts +0 -7
  513. package/__tests__/cp-node/fs/get-smoothed-speed.spec.ts +0 -7
  514. package/__tests__/cp-node/fs/get-smoothed.spec.ts +0 -7
  515. package/__tests__/cp-node/fs/get-speed.spec.ts +0 -7
  516. package/__tests__/cp-node/fs/is-order-correct.spec.ts +0 -7
  517. package/__tests__/jsog/get-mats1.ts +0 -41
  518. package/node/bezier/fit-quads-to-cubic.d.ts +0 -19
  519. package/node/bezier/fit-quads-to-cubic.js +0 -83
  520. package/node/bezier/fit-quads-to-cubic.js.map +0 -1
  521. package/node/bezier/total-curvature.d.ts +0 -14
  522. package/node/bezier/total-curvature.js +0 -5
  523. package/node/bezier/total-curvature.js.map +0 -1
  524. package/node/bezier/total-length.d.ts +0 -14
  525. package/node/bezier/total-length.js +0 -5
  526. package/node/bezier/total-length.js.map +0 -1
  527. package/node/closest-boundary-point/cull-bezier-pieces.d.ts +0 -10
  528. package/node/closest-boundary-point/cull-bezier-pieces.js.map +0 -1
  529. package/node/closest-boundary-point/dd-deflate-with-running-error.d.ts +0 -25
  530. package/node/closest-boundary-point/dd-deflate-with-running-error.js +0 -68
  531. package/node/closest-boundary-point/dd-deflate-with-running-error.js.map +0 -1
  532. package/node/contact-point/contact-point.d.ts +0 -26
  533. package/node/contact-point/contact-point.js +0 -22
  534. package/node/contact-point/contact-point.js.map +0 -1
  535. package/node/cp-node/fs/get-smoothed-speed.d.ts +0 -14
  536. package/node/cp-node/fs/get-smoothed-speed.js +0 -75
  537. package/node/cp-node/fs/get-smoothed-speed.js.map +0 -1
  538. package/node/cp-node/fs/get-speed.d.ts +0 -15
  539. package/node/cp-node/fs/get-speed.js +0 -39
  540. package/node/cp-node/fs/get-speed.js.map +0 -1
  541. package/node/curve/curve.d.ts +0 -33
  542. package/node/curve/curve.js +0 -2
  543. package/node/curve/curve.js.map +0 -1
  544. package/node/debug/cp-node-for-debugging.d.ts +0 -11
  545. package/node/debug/cp-node-for-debugging.js +0 -2
  546. package/node/debug/cp-node-for-debugging.js.map +0 -1
  547. package/node/debug/functions/draw-elem/draw-speed.d.ts +0 -4
  548. package/node/debug/functions/draw-elem/draw-speed.js +0 -21
  549. package/node/debug/functions/draw-elem/draw-speed.js.map +0 -1
  550. package/node/error-analysis/gamma.d.ts +0 -26
  551. package/node/error-analysis/gamma.js +0 -35
  552. package/node/error-analysis/gamma.js.map +0 -1
  553. package/node/find-2-prong/find-and-add-2-prong.d.ts +0 -11
  554. package/node/find-2-prong/find-and-add-2-prong.js +0 -19
  555. package/node/find-2-prong/find-and-add-2-prong.js.map +0 -1
  556. package/node/find-2-prong/find-equidistant-point-on-line-dd.d.ts +0 -10
  557. package/node/find-2-prong/find-equidistant-point-on-line-dd.js +0 -56
  558. package/node/find-2-prong/find-equidistant-point-on-line-dd.js.map +0 -1
  559. package/node/find-3-prong.ts/calc-better-x.d.ts +0 -19
  560. package/node/find-3-prong.ts/calc-better-x.js.map +0 -1
  561. package/node/find-3-prong.ts/calc-initial-3-prong-center.d.ts +0 -13
  562. package/node/find-3-prong.ts/calc-initial-3-prong-center.js +0 -27
  563. package/node/find-3-prong.ts/calc-initial-3-prong-center.js.map +0 -1
  564. package/node/find-3-prong.ts/find-3-prong-for-delta3s.d.ts +0 -22
  565. package/node/find-3-prong.ts/find-3-prong-for-delta3s.js.map +0 -1
  566. package/node/find-3-prong.ts/find-3-prong.d.ts +0 -16
  567. package/node/find-3-prong.ts/find-3-prong.js.map +0 -1
  568. package/node/find-3-prong.ts/find-and-add-3-prong.js.map +0 -1
  569. package/node/find-3-prong.ts/find-and-add-3-prongs-on-loop.js.map +0 -1
  570. package/node/find-3-prong.ts/find-and-add-3-prongs.js.map +0 -1
  571. package/node/find-3-prong.ts/get-closest-points.d.ts +0 -9
  572. package/node/find-3-prong.ts/get-closest-points.js.map +0 -1
  573. package/node/mat/connect-hole-closers.d.ts +0 -3
  574. package/node/mat/connect-hole-closers.js +0 -5
  575. package/node/mat/connect-hole-closers.js.map +0 -1
  576. package/node/mat/create-new-cp-tree.d.ts +0 -9
  577. package/node/mat/create-new-cp-tree.js +0 -23
  578. package/node/mat/create-new-cp-tree.js.map +0 -1
  579. package/node/memoize-primitive.d.ts +0 -11
  580. package/node/memoize-primitive.js +0 -25
  581. package/node/memoize-primitive.js.map +0 -1
  582. package/node/point-on-shape/create-pos.d.ts +0 -4
  583. package/node/point-on-shape/create-pos.js +0 -11
  584. package/node/point-on-shape/create-pos.js.map +0 -1
  585. package/node/point-on-shape/is-pos-quite-sharp-corner.d.ts +0 -17
  586. package/node/point-on-shape/is-pos-quite-sharp-corner.js +0 -14
  587. package/node/point-on-shape/is-pos-quite-sharp-corner.js.map +0 -1
  588. package/src/bezier/fit-quads-to-cubic.ts +0 -103
  589. package/src/bezier/total-curvature.ts +0 -8
  590. package/src/bezier/total-length.ts +0 -8
  591. package/src/closest-boundary-point/closest-points-on-curve-precise.ts +0 -75
  592. package/src/closest-boundary-point/closest-points-on-curve.ts +0 -72
  593. package/src/closest-boundary-point/dd-deflate-with-running-error.ts +0 -88
  594. package/src/contact-point/contact-point.ts +0 -42
  595. package/src/cp-node/fs/get-avg-speed.ts +0 -31
  596. package/src/cp-node/fs/get-smoothed-speed.ts +0 -97
  597. package/src/cp-node/fs/get-smoothed.ts +0 -62
  598. package/src/cp-node/fs/get-speed.ts +0 -56
  599. package/src/curve/curve.ts +0 -37
  600. package/src/dbscan/dbscan.ts +0 -91
  601. package/src/debug/cp-node-for-debugging.ts +0 -15
  602. package/src/debug/functions/draw-elem/draw-speed.ts +0 -35
  603. package/src/debug/three-prong-for-debugging.ts +0 -58
  604. package/src/debug/two-prong-for-debugging.ts +0 -30
  605. package/src/dijkstra/dijkstra.ts +0 -418
  606. package/src/find-2-prong/find-and-add-2-prongs-on-all-paths.ts +0 -38
  607. package/src/find-2-prong/find-equidistant-point-on-line-dd.ts +0 -77
  608. package/src/find-2-prong/find-equidistant-point-on-line.ts +0 -40
  609. package/src/find-2-prong/pyth-trips.ts +0 -146
  610. package/src/find-3-prong.ts/add-3-prong.ts +0 -113
  611. package/src/find-3-prong.ts/array-set.ts +0 -47
  612. package/src/find-3-prong.ts/find-3-prong.ts +0 -48
  613. package/src/find-3-prong.ts/find-and-add-all-3-prongs.ts +0 -109
  614. package/src/find-mat/add-2-prongs-by-error.ts +0 -122
  615. package/src/find-mat/add-debug-info.ts +0 -93
  616. package/src/find-mat/cp-node-for-insertion.ts +0 -13
  617. package/src/find-mat/get-dull-corners.ts +0 -34
  618. package/src/find-mat/get-half-angles.ts +0 -95
  619. package/src/find-mat/get-size-params.ts +0 -34
  620. package/src/find-mat/get-total-by.ts +0 -27
  621. package/src/get-curve/get-curve-between.ts +0 -80
  622. package/src/get-curve/get-edge-direction.ts +0 -70
  623. package/src/mat/add-to-cp-graph.ts +0 -60
  624. package/src/mat/cmp-cp-on-delta.ts +0 -56
  625. package/src/mat/connect-hole-closers.ts +0 -9
  626. package/src/mat/create-new-cp-tree.ts +0 -32
  627. package/src/mat/get-edges-as-array.ts +0 -18
  628. package/src/mat/get-largest-three-prong.ts +0 -14
  629. package/src/mat/get-neighboring-cps.ts +0 -49
  630. package/src/mat/is-another-cp-closeby.ts +0 -69
  631. package/src/mat/simplify-mat-map-only.ts +0 -110
  632. package/src/memoize-primitive.ts +0 -31
  633. package/src/point-on-shape/create-pos.ts +0 -20
  634. package/src/sat/cull-by-salience.ts +0 -115
  635. package/src/svg/get-extreme.ts +0 -23
  636. package/src/utils/bezier-piece-to-bezier.ts +0 -13
  637. package/src/utils/sleep.ts +0 -7
  638. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.d.ts +0 -0
  639. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.d.ts +0 -0
  640. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.js +0 -0
  641. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.d.ts +0 -0
  642. /package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.ts +0 -0
@@ -1,67 +1,182 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
2
- import { Curve } from '../curve/curve.js';
3
- import { CurvePiece } from './curve-piece.js';
4
- import { isPosQuiteSharpCorner } from '../point-on-shape/is-pos-quite-sharp-corner.js';
5
- import { compareCps } from '../contact-point/contact-point.js';
1
+ import type { Curve } from 'flo-boolean';
2
+ import type { CpNode } from '../cp-node/cp-node.js';
3
+ import type { CurvePiece } from './curve-piece.js';
4
+ import { comparePoss } from '../point-on-shape/compare-poss.js';
6
5
 
7
6
 
8
7
  /**
9
- * @internal
10
- * Returns the ordered cubic bezier pieces (i.e a bezier with a t range)
11
- * from the given boundary piece.
8
+ * Returns the ordered bezier pieces between from the given boundary piece.
12
9
  *
13
10
  * @param cpNodes - An ordered pair that represents the start and end points of
14
11
  * the boundary piece
12
+ *
13
+ * @internal
15
14
  */
16
- function getBoundaryPieceBeziers(cpNodes: CpNode[]): CurvePiece[] {
15
+ function getBoundaryPieceBeziers(
16
+ cpNodes: CpNode[]): CurvePiece[] {
17
+
17
18
  let cpThis = cpNodes[0];
18
19
  const cpEnd = cpNodes[1];
19
20
 
20
21
  const curvePieces: CurvePiece[] = [];
21
22
 
23
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
24
+ // later in `find2Prong`; KEEP for possible future use.
25
+ // We have to stich curves together if they're at a hole closer or at the
26
+ // endpoints of a loop to avoid duplicates later within the code; the map
27
+ // is from curves
28
+ // const stichables: Map<Curve, number[]> = new Map();
29
+
22
30
  // As opposed to going around the circle and taking the last exit
23
31
  let goStraight = true;
24
32
  do {
33
+ const posThis = cpThis .pointOnShape;
34
+ const posNext = cpThis.next.pointOnShape;
35
+ const curveThis = posThis.curve;
36
+ const curveNext = posNext.curve;
37
+
25
38
  if (!goStraight) {
26
39
  goStraight = true;
27
- cpThis = cpThis.prevOnCircle; // take last exit
40
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
41
+ // later in `find2Prong`; KEEP for possible future use.
42
+ // const { loop: loopThis } = curveThis;
43
+ // const cpPrevOnCircle = cpThis.prevOnCircle;
44
+ // const curvePrevOnCircle = cpPrevOnCircle.pointOnShape.curve;
45
+ // const { loop: loopNext } = cpPrevOnCircle.pointOnShape.curve;
46
+
47
+
48
+ // if (loopThis !== loopNext) {
49
+ // let idxsThis = stichables.get(curveThis);
50
+ // if (idxsThis === undefined) {
51
+ // idxsThis = [];
52
+ // stichables.set(curveThis, idxsThis);
53
+ // }
54
+ // idxsThis.push(curvePieces.length - 1); // last `CurvePiece` idx
55
+
56
+ // let idxsNext = stichables.get(curvePrevOnCircle);
57
+ // if (idxsNext === undefined) {
58
+ // idxsNext = [];
59
+ // stichables.set(curvePrevOnCircle, idxsNext);
60
+ // }
61
+ // idxsNext.push(curvePieces.length); // upcoming `CurvePiece` idx
62
+ // }
63
+
64
+ // cpThis = cpPrevOnCircle; // take last exit
65
+ cpThis = cpThis.prevOnCircle; // take last exit
28
66
  continue;
29
67
  }
30
68
 
31
69
  goStraight = false;
32
-
33
- const posThis = cpThis .cp.pointOnShape;
34
- const posNext = cpThis.next.cp.pointOnShape;
35
-
36
- if (posNext.curve === posThis.curve &&
37
- isPosQuiteSharpCorner(posThis) &&
38
- isPosQuiteSharpCorner(posNext)) {
39
-
40
- // Do nothing
41
- } else if (posNext.curve === posThis.curve &&
42
- compareCps(cpThis.next.cp, cpThis.cp) > 0) {
43
-
44
- curvePieces.push(
45
- { curve: posThis.curve, ts: [posThis.t, posNext.t] }
46
- );
47
- } else {
48
- curvePieces.push(
49
- { curve: posThis.curve, ts: [posThis.t, 1] }
50
- );
51
-
52
- if (posThis.curve.loop === posNext.curve.loop) {
53
- addSkippedBeziers(
54
- curvePieces,
55
- posThis.curve,
56
- posNext.curve,
57
- posNext.t
58
- );
59
- }
70
+
71
+ if (curveNext === curveThis &&
72
+ comparePoss(posNext, posThis) > 0) {
73
+
74
+ // The boundary stays on the same curve segment *and* the next pos
75
+ // is further along the *linear* boundary. If it is *not* further
76
+ // on the *linear* boundary then this pos precedes the abrupt break
77
+ // in the ordering and next pos comes after the break so the code in
78
+ // the next `else` statement is called to skip over the break.
79
+ // The other case in which `comparePoss(posNext, posThis) <= 0` is
80
+ // possible for hole closers where the oderering of this and next
81
+ // are the same except for `order2`
82
+ curvePieces.push({
83
+ curve: curveThis, ts: [posThis.t, posNext.t]
84
+ });
85
+
86
+ cpThis = cpThis.next;
87
+ continue;
60
88
  }
61
-
89
+
90
+ // The segment crosses a curve boundary because either:
91
+ // 1. `this` and `next` are not on the same curve OR
92
+ // 2. `this` comes after `next` by ordering
93
+ // so split at t = 1.
94
+
95
+ if (curveThis.loop === curveNext.loop) {
96
+ const initialCurvePiece = {
97
+ curve: curveThis, ts: [posThis.t, 1]
98
+ };
99
+ curvePieces.push(initialCurvePiece);
100
+
101
+ // Fill in any curves skipped between the two points.
102
+ addSkippedBeziers(curvePieces, curveThis, curveNext, posNext.t);
103
+
104
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
105
+ // later in `find2Prong`; KEEP for possible future use.
106
+ // const finalCurvePiece = curvePieces[curvePieces.length - 1];
107
+ // if (initialCurvePiece.curve === finalCurvePiece!.curve) {
108
+ // const { ts: tsS } = initialCurvePiece;
109
+ // const { ts: tsE } = finalCurvePiece!;
110
+
111
+ // // If it is a closed loop we must join the endpoints to prevent duplicate
112
+ // // antipodal points later
113
+ // if (tsS[0] === tsE[1]) {
114
+ // initialCurvePiece.ts[0] = tsE[0];
115
+
116
+ // if (curvePieces.length > 1) {
117
+ // curvePieces.pop();
118
+ // }
119
+ // // console.log('was inner closed loop')
120
+ // }
121
+ // }
122
+ }
123
+
62
124
  cpThis = cpThis.next;
63
125
  } while (cpThis !== cpEnd);
64
126
 
127
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
128
+ // later in `find2Prong`; KEEP for possible future use.
129
+ // if (stichables.size > 0) {
130
+ // for (const [loop,idxs] of stichables.entries()) {
131
+ // if (idxs.length === 2) {
132
+ // const curvePieceS = curvePieces[idxs[0]]!;
133
+ // const curvePieceE = curvePieces[idxs[1]]!;
134
+
135
+ // if (curvePieceS === undefined || curvePieceE === undefined) {
136
+ // console.log(curvePieceS);
137
+ // console.log(curvePieceE);
138
+ // continue;
139
+ // }
140
+
141
+ // const { curve: curveS, ts: tsS } = curvePieceS;
142
+ // const { curve: curveE, ts: tsE } = curvePieceE;
143
+ // if (curveS !== curveE) {
144
+ // continue;
145
+ // }
146
+
147
+ // // If it is a closed loop we must join the endpoints to prevent duplicate
148
+ // // antipodal points later
149
+ // if (tsS[0] === tsE[1]) {
150
+ // curvePieceS.ts[0] = tsE[0];
151
+ // // console.log('was closed loop 1')
152
+ // } else if (tsE[0] === tsS[1]) {
153
+ // curvePieceS.ts[1] = tsE[1];
154
+ // // console.log('was closed loop 2')
155
+ // }
156
+ // if (idxs[0] !== idxs[1]) {
157
+ // curvePieces[idxs[1]] = undefined;
158
+ // }
159
+ // }
160
+ // }
161
+ // }
162
+
163
+ // NOTE❗ The below endcurve check is not enough for specific cases involving
164
+ // multiple hole closers; KEEP for now but must use stichables instead
165
+ // if (curvePieces[0]!.curve === curvePieces[curvePieces.length - 1]!.curve) {
166
+ // const { ts: tsS } = curvePieces[0]!;
167
+ // const { ts: tsE } = curvePieces[curvePieces.length - 1]!;
168
+
169
+ // // If it is a closed loop we must join the endpoints to prevent duplicate
170
+ // // antipodal points later
171
+ // if (tsS[0] === tsE[1]) {
172
+ // curvePieces[0]!.ts[0] = tsE[0];
173
+
174
+ // if (curvePieces.length > 1) {
175
+ // curvePieces.pop();
176
+ // }
177
+ // // console.log('was closed loop')
178
+ // }
179
+ // }
65
180
 
66
181
  return curvePieces;
67
182
  }
@@ -72,11 +187,12 @@ function getBoundaryPieceBeziers(cpNodes: CpNode[]): CurvePiece[] {
72
187
  * Adds pieces of skipped beziers
73
188
  */
74
189
  function addSkippedBeziers(
75
- curvePieces: CurvePiece[],
190
+ curvePieces: (CurvePiece | undefined)[],
76
191
  curveStart: Curve,
77
192
  curveEnd: Curve,
78
193
  t1: number) {
79
194
 
195
+ // Walk forward through the loop until the end curve is reached.
80
196
  let curveThis = curveStart;
81
197
  do {
82
198
  curveThis = curveThis.next;
@@ -1,4 +1,4 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
2
  import { getBranch } from '../cp-node/fs/get-branch.js';
3
3
  import { getNonTerminatingOnCircle } from '../cp-node/fs/get-non-terminating-on-circle.js';
4
4
 
@@ -1,11 +1,9 @@
1
- import { LlRbTree } from 'flo-ll-rb-tree';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
3
+ import type { Circle } from '../geometry/circle.js';
4
+ import type { MatMeta } from './mat-meta.js';
2
5
  import { distanceBetween, toUnitVector, fromTo, dot } from 'flo-vector2d';
3
- import { Loop } from 'flo-boolean';
4
- import { CpNode } from '../cp-node/cp-node.js';
5
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
6
- import { Circle } from '../geometry/circle.js';
7
6
  import { getCpNodeToLeftOrSame } from './get-cp-node-to-left-or-same.js';
8
- import { MatMeta } from './mat-meta.js';
9
7
 
10
8
 
11
9
  /** @internal */
@@ -26,16 +24,16 @@ const ANGLE_THRESHOLD = Math.cos(DEGREES * (Math.PI / 180));
26
24
  */
27
25
  function getCloseByCpIfExist(
28
26
  meta: MatMeta,
29
- pos: PointOnShape,
27
+ pos: PrePointOnShape,
30
28
  circle: Circle,
31
29
  order: number,
32
30
  order2: number,
33
31
  forProngCount?: number): CpNode | undefined {
34
32
 
35
- const { cpTrees, maxCoordinate } = meta;
33
+ const { cpTrees, maxCoordPowerOf2 } = meta;
36
34
 
37
- const DISTANCE_THRESHOLD = maxCoordinate * 2e-14;
38
- const DISTANCE_THRESHOLD_2 = DISTANCE_THRESHOLD * 2e-2;
35
+ const DISTANCE_THRESHOLD = 2**(maxCoordPowerOf2 - 40); // approx. 1e-9 for 1024 x 1024 shapes
36
+ const DISTANCE_THRESHOLD_2 = 2**(maxCoordPowerOf2 - 46);
39
37
 
40
38
  const cpTree = cpTrees.get(pos.curve.loop)!;
41
39
  const cur = getCpNodeToLeftOrSame(cpTree, pos, order, order2);
@@ -44,14 +42,15 @@ function getCloseByCpIfExist(
44
42
 
45
43
  const { p, t } = pos;
46
44
  for (const cpNode of cpNodes) {
47
- const pos2 = cpNode.cp.pointOnShape;
45
+ const pos2 = cpNode.pointOnShape;
48
46
  const p2 = pos2.p;
49
47
  const d = distanceBetween(p,p2);
50
48
  if (d > DISTANCE_THRESHOLD) {
51
49
  continue;
52
50
  }
51
+ // return cpNode;
53
52
 
54
- const v1 = toUnitVector(fromTo(p2, cpNode.cp.circle.center));
53
+ const v1 = toUnitVector(fromTo(p2, cpNode.pointOnShape.circle.center));
55
54
  const v2 = toUnitVector(fromTo(p, circle.center));
56
55
  const cosTheta = dot(v1,v2);
57
56
 
@@ -1,6 +1,6 @@
1
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
2
+ import type { CpNode } from '../cp-node/cp-node.js';
1
3
  import { LlRbTree } from 'flo-ll-rb-tree';
2
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
3
- import { CpNode } from '../cp-node/cp-node.js';
4
4
 
5
5
 
6
6
  /**
@@ -18,12 +18,12 @@ import { CpNode } from '../cp-node/cp-node.js';
18
18
  */
19
19
  function getCpNodeToLeftOrSame(
20
20
  cpTree: LlRbTree<CpNode>,
21
- pos: PointOnShape,
21
+ pos: PrePointOnShape,
22
22
  order: number,
23
23
  order2: number): CpNode | undefined {
24
24
 
25
- const cp = { pointOnShape: pos, order, order2 };
26
- const cps = cpTree.findBounds({ cp } as unknown as CpNode);
25
+ const pointOnShape = { ...pos, order, order2 };
26
+ const cps = cpTree.findBounds({ pointOnShape } as CpNode);
27
27
 
28
28
  if (cps[0] === undefined && cps[1] === undefined) {
29
29
  // The tree is still empty
@@ -1,4 +1,4 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
2
  import { getAllOnLoop } from '../cp-node/fs/get-all-on-loop.js';
3
3
  import { getRealProngCount } from '../cp-node/fs/get-real-prong-count.js';
4
4
 
@@ -11,7 +11,7 @@ function getLargest3Prong(cpNode: CpNode) {
11
11
  if (cpNodes.length === 0) { return undefined; }
12
12
 
13
13
  return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
14
- return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
14
+ return maxCpNode.pointOnShape.circle.radius >= cpNode.pointOnShape.circle.radius
15
15
  ? maxCpNode
16
16
  : cpNode
17
17
  }, cpNodes[0]);
@@ -1,4 +1,4 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
2
  import { getAllOnLoop } from '../cp-node/fs/get-all-on-loop.js';
3
3
 
4
4
 
@@ -7,7 +7,7 @@ function getLargestVertex(cpNode: CpNode) {
7
7
  const cpNodes = getAllOnLoop(cpNode);
8
8
 
9
9
  return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
10
- return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
10
+ return maxCpNode.pointOnShape.circle.radius >= cpNode.pointOnShape.circle.radius
11
11
  ? maxCpNode
12
12
  : cpNode
13
13
  }, cpNodes[0]);
@@ -1,12 +1,13 @@
1
+ import type { Loop } from 'flo-boolean';
2
+ import type { CpNode } from '../cp-node/cp-node.js';
3
+ import type { Curve } from 'flo-boolean';
4
+ import type { TriMap } from '../utils/tri-map.js';
1
5
  import { LlRbTree } from 'flo-ll-rb-tree';
2
- import { Loop } from 'flo-boolean';
3
- import { CpNode } from '../cp-node/cp-node.js';
4
- import { Curve } from '../curve/curve.js';
5
- import { TriMap } from '../utils/tri-map.js';
6
6
 
7
7
 
8
8
  interface MatMeta {
9
- readonly maxCoordinate: number;
9
+ /** The minimum power of 2 such that `2**maxCoordPowerOf2 >= "the max coordinate"` */
10
+ readonly maxCoordPowerOf2: number;
10
11
  readonly squaredDiagonalLength: number;
11
12
  readonly looseBoundingBoxes: number[][][];
12
13
  readonly tightBoundingBoxes: number[][][];
@@ -24,7 +25,7 @@ interface MatMeta {
24
25
  */
25
26
  readonly cpTrees: Map<Loop, LlRbTree<CpNode>>;
26
27
  /** A map from a bezier and t value to a `PointOnShape` */
27
- readonly pointToCpNode: TriMap<Loop,number,number,CpNode>;
28
+ // readonly pointToCpNode: TriMap<Loop,number,number,CpNode>;
28
29
  /**
29
30
  * Stores the last insert id so each `CpNode` can have a unique id for
30
31
  * debugging purposes
package/src/mat/mat.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
2
- import { MatMeta } from './mat-meta.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { MatMeta } from './mat-meta.js';
3
3
 
4
4
 
5
5
  /**
@@ -12,15 +12,15 @@ import { MatMeta } from './mat-meta.js';
12
12
  */
13
13
  interface Mat {
14
14
  /** A complete representation of the MAT. See `CpNode`. */
15
- cpNode: CpNode;
15
+ readonly cpNode: CpNode;
16
16
  /**
17
17
  * Stores additional info about the shape that could be useful for various
18
18
  * purposes in post-processing.
19
19
  *
20
20
  * Most meta items have a CpNode property to link back to the MAT.
21
21
  */
22
- meta: MatMeta;
22
+ readonly meta: MatMeta;
23
23
  }
24
24
 
25
25
 
26
- export { Mat }
26
+ export type { Mat }
@@ -1,30 +1,33 @@
1
+ import type { Mat } from './mat.js';
2
+ import type { CpNode } from '../cp-node/cp-node.js';
1
3
  import { hausdorffDistanceOneSided } from 'flo-bezier3';
2
- import { CpNode } from '../cp-node/cp-node.js';
3
4
  import { removeVertex } from '../vertex/remove-vertex.js';
4
5
  import { getBranches } from './get-branches.js';
5
6
  import { getMatCurveToNext } from '../cp-node/fs/get-mat-curve-to-next.js';
6
7
  import { getMatCurveBetween } from '../cp-node/fs/get-mat-curve-between.js';
7
- import { Mat } from './mat.js';
8
- import { createNewCpTree } from './create-new-cp-tree.js';
8
+ import { createNewCpTrees } from './create-new-cp-trees.js';
9
9
  import { clone } from '../cp-node/fs/clone.js';
10
10
  import { findFirst } from '../cp-node/fs/find-first.js';
11
11
  import { isTerminating } from '../cp-node/fs/is-terminating.js';
12
12
  import { isVertex } from '../cp-node/fs/is-vertex.js';
13
13
  import { getProngCount } from '../cp-node/fs/get-prong-count.js';
14
14
 
15
+ const { max } = Math;
15
16
 
16
17
 
17
- // TODO2 could be made faster by binary "search" on hausdorff curves
18
+ // FUTURE could be made faster by binary "search" on hausdorff curves?
18
19
  /**
19
- * Simplifies the given MAT by replacing the piecewise quad beziers composing
20
- * the MAT with fewer ones to within a given tolerance.
21
- * @param cpNode A representation of the MAT
22
- * @param anlgeTolerance Tolerance given as the degrees difference of the unit
20
+ * Returns a new simplified MAT of the given one by replacing the piecewise
21
+ * quad beziers composing the MAT with fewer ones to within a given tolerance.
22
+ *
23
+ * @param cpNode a representation of the MAT
24
+ * @param anlgeTolerance tolerance given as the degrees difference of the unit
23
25
  * direction vectors at the interface between curves. A tolerance of zero means
24
- * perfect smoothness is required - defaults to 15.
25
- * @param hausdorffTolerance The approximate maximum Hausdorff Distance tolerance -
26
+ * perfect smoothness is required - defaults to 15
27
+ * @param hausdorffTolerance the approximate maximum Hausdorff Distance tolerance -
26
28
  * defaults to `2**-3`
27
- * @param maxIterations The max iterations, defaults to `50`
29
+ * @param maxIterations the max iterations of the Hausdorff Distance calculation,
30
+ * defaults to `50`
28
31
  */
29
32
  function simplifyMat(
30
33
  mat: Mat,
@@ -60,14 +63,14 @@ function simplifyMat(
60
63
  }
61
64
  }
62
65
 
63
- if (i+1 === j) {
64
- // no simplification occured
65
- continue;
66
+ if (i+1 === j) {
67
+ continue; // no simplification occured
66
68
  }
67
69
  }
68
70
  }
69
71
 
70
- cpNode = findFirst(cpNode_ => isTerminating(cpNode_) ? cpNode_ : undefined, cpNode)!;
72
+ // cpNode = findFirst(cpNode_ => isTerminating(cpNode_) ? cpNode_ : undefined, cpNode)!;
73
+ cpNode = findFirst(isTerminating, cpNode)!;
71
74
 
72
75
  for (const cpNode of canDeletes) {
73
76
  if (!isVertex(cpNode =>
@@ -84,7 +87,7 @@ function simplifyMat(
84
87
  cpNode,
85
88
  meta: {
86
89
  ...mat.meta,
87
- cpTrees: createNewCpTree(cpNode)
90
+ cpTrees: createNewCpTrees(cpNode)
88
91
  }
89
92
  }
90
93
  }
@@ -106,7 +109,7 @@ function getTotalHausdorffDistance(
106
109
  ));
107
110
  }
108
111
 
109
- return Math.max(...hds);
112
+ return max(...hds);
110
113
  }
111
114
 
112
115
 
@@ -1,15 +1,17 @@
1
- import { Mat } from './mat.js';
2
- import { createNewCpTree } from './create-new-cp-tree.js';
1
+ import type { Mat } from './mat.js';
2
+ import { createNewCpTrees } from './create-new-cp-trees.js';
3
3
  import { cullNonCycles } from '../sat/cull-non-cycles.js';
4
4
  import { clone } from '../cp-node/fs/clone.js';
5
5
 
6
6
 
7
7
  /**
8
8
  * Trims the given Medial Axis Transform so that only cycles remain. Similar to
9
- * toScaleAxis(mat, Number.POSITIVE_INFINITY).
9
+ * toScaleAxis(mat, Infinity).
10
+ *
10
11
  * @param mat The MAT to trim.
11
12
  */
12
13
  function trimMat(mat: Mat): Mat {
14
+ // FUTURE - clone entire `Mat` instead (the function already exists)
13
15
  const cpNode = cullNonCycles(clone(mat.cpNode));
14
16
 
15
17
  if (!cpNode) { return undefined!; }
@@ -18,7 +20,7 @@ function trimMat(mat: Mat): Mat {
18
20
  cpNode,
19
21
  meta: {
20
22
  ...mat.meta,
21
- cpTrees: createNewCpTree(cpNode)
23
+ cpTrees: createNewCpTrees(cpNode)
22
24
  }
23
25
  }
24
26
  }
@@ -1,31 +1,30 @@
1
+ import type { Curve } from "flo-boolean";
1
2
  import { dot, fromTo, rotateNeg90Degrees, toUnitVector } from "flo-vector2d";
2
- import { Circle } from "../geometry/circle.js";
3
- import { PointOnShape } from "./point-on-shape.js";
4
3
  import { isPosCorner } from './is-pos-corner.js';
5
- import { getPosCorner } from './get-pos-corner.js';
6
-
4
+ import { getPosCorner$ } from './get-pos-corner.js';
7
5
 
8
6
 
9
7
  /**
10
- * @internal
11
- *
12
8
  * Calculates the order (to distinguish between points lying on top of each
13
9
  * other) of the contact point if it is a dull corner.
14
10
  *
15
11
  * @param circle
16
12
  * @param pos
13
+ *
14
+ * @internal
17
15
  */
18
16
  function calcPosOrder(
19
- circle: Circle,
20
- pos: PointOnShape): number {
17
+ circleCenter: number[],
18
+ pos: { t: number, curve: Curve, p: number[] }): number {
21
19
 
22
20
  if (!isPosCorner(pos)) { return 0; }
23
- if (!getPosCorner(pos).isDull) { return 0; }
24
21
 
25
- const corner = getPosCorner(pos);
22
+ const corner = getPosCorner$(pos);
23
+
24
+ if (!corner.isDull) { return 0; }
26
25
 
27
26
  const n = rotateNeg90Degrees(corner.tangents[0]);
28
- const v = toUnitVector( fromTo(pos.p, circle.center) );
27
+ const v = toUnitVector( fromTo(pos.p, circleCenter) );
29
28
 
30
29
  return -dot(n, v);
31
30
  }
@@ -3,9 +3,13 @@ import { PointOnShape } from "./point-on-shape.js";
3
3
 
4
4
  /**
5
5
  * Compares two `PointOnShape`s according to their cyclic ordering imposed
6
- * by their relative positions on the shape boundary.
6
+ * by their relative positions on the shape boundary.
7
+ *
8
+ * * Returns a +tive value if `a` is "further along" the loop
9
+ *
7
10
  * @param a The first `PointOnShape`.
8
11
  * @param b The second `PointOnShape`.
12
+ *
9
13
  * @internal
10
14
  */
11
15
  function comparePoss(
@@ -18,6 +22,12 @@ function comparePoss(
18
22
  if (res !== 0) { return res; }
19
23
 
20
24
  res = a.t - b.t;
25
+ if (res !== 0) { return res; }
26
+
27
+ res = a.order - b.order;
28
+ if (res !== 0) { return res; }
29
+
30
+ res = a.order2 - b.order2;
21
31
 
22
32
  return res;
23
33
  }
@@ -1,41 +1,38 @@
1
- import { tangentExact, ddCurvature } from 'flo-bezier3';
2
- import { Circle } from '../geometry/circle.js';
3
- import { PointOnShape } from './point-on-shape.js';
1
+ import type { PrePointOnShape } from './point-on-shape.js';
2
+ import { ddCurvature } from 'flo-bezier3';
4
3
 
4
+ const { sqrt } = Math;
5
5
 
6
6
 
7
7
  /**
8
8
  * Returns the osculating circle at this point of the curve.
9
9
  *
10
- * @param minCurvature If not Number.POSITIVE_INFINITY then the
11
- * circle radius will be limited to this value.
12
- * @param pos The `PointOnShape` identifying the point.
10
+ * @param minCurvature if not `Infinity` then the circle radius will be limited
11
+ * to this value
12
+ * @param pos the `PointOnShape` identifying the point
13
13
  * @param useMaxRadius
14
14
  */
15
15
  function getOsculatingCircle(
16
- minCurvature: number,
17
- pos: PointOnShape,
18
- // pos: { p: number[], t: number },
19
- useMaxRadius = false): Circle {
20
-
21
- const ps = pos.curve.ps;
22
- const { p, t } = pos;
23
-
24
- let k = -ddCurvature(ps, t);
25
-
26
- if (k < minCurvature || useMaxRadius) {
27
- k = minCurvature;
28
- }
29
-
30
- const tangent_ = tangentExact(ps,t).map(c => c[c.length-1]);
31
- const normal_ = [-tangent_[1],tangent_[0]];
32
- const l = Math.sqrt(normal_[0]**2 + normal_[1]**2);
33
- const circleCenter = [
34
- p[0] - normal_[0]/(k*l),
35
- p[1] - normal_[1]/(k*l)
36
- ];
16
+ maxOsculatingCircleRadius: number,
17
+ pos: PrePointOnShape,
18
+ norm: number[]): [number[],number] {
19
+
20
+ const { curve, p, t } = pos;
21
+ const { ps } = curve;
22
+
23
+ const minCurvature = 1/maxOsculatingCircleRadius;
37
24
 
38
- return { center: circleCenter, radius: 1/k };
25
+ const k_ = -(ddCurvature(ps, t)[1]);
26
+ const k = k_ < minCurvature ? minCurvature : k_;
27
+
28
+ const [tx, ty] = norm;
29
+ const l = sqrt(tx*tx + ty*ty);
30
+ const scale = l*k;
31
+
32
+ return [
33
+ [p[0] + tx/scale, p[1] + ty/scale],
34
+ 1/k
35
+ ];
39
36
  }
40
37
 
41
38