@flighthq/path 0.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 (115) hide show
  1. package/dist/containsPathPoint.d.ts +13 -0
  2. package/dist/containsPathPoint.d.ts.map +1 -0
  3. package/dist/containsPathPoint.js +194 -0
  4. package/dist/containsPathPoint.js.map +1 -0
  5. package/dist/copyPath.d.ts +4 -0
  6. package/dist/copyPath.d.ts.map +1 -0
  7. package/dist/copyPath.js +28 -0
  8. package/dist/copyPath.js.map +1 -0
  9. package/dist/dashPath.d.ts +3 -0
  10. package/dist/dashPath.d.ts.map +1 -0
  11. package/dist/dashPath.js +105 -0
  12. package/dist/dashPath.js.map +1 -0
  13. package/dist/fitPathCurves.d.ts +3 -0
  14. package/dist/fitPathCurves.d.ts.map +1 -0
  15. package/dist/fitPathCurves.js +222 -0
  16. package/dist/fitPathCurves.js.map +1 -0
  17. package/dist/flattenPath.d.ts +3 -0
  18. package/dist/flattenPath.d.ts.map +1 -0
  19. package/dist/flattenPath.js +145 -0
  20. package/dist/flattenPath.js.map +1 -0
  21. package/dist/forEachPathSegment.d.ts +3 -0
  22. package/dist/forEachPathSegment.d.ts.map +1 -0
  23. package/dist/forEachPathSegment.js +66 -0
  24. package/dist/forEachPathSegment.js.map +1 -0
  25. package/dist/getPathBounds.d.ts +3 -0
  26. package/dist/getPathBounds.d.ts.map +1 -0
  27. package/dist/getPathBounds.js +167 -0
  28. package/dist/getPathBounds.js.map +1 -0
  29. package/dist/getPathContourLengths.d.ts +3 -0
  30. package/dist/getPathContourLengths.d.ts.map +1 -0
  31. package/dist/getPathContourLengths.js +21 -0
  32. package/dist/getPathContourLengths.js.map +1 -0
  33. package/dist/getPathLength.d.ts +3 -0
  34. package/dist/getPathLength.d.ts.map +1 -0
  35. package/dist/getPathLength.js +23 -0
  36. package/dist/getPathLength.js.map +1 -0
  37. package/dist/getPathNearestPoint.d.ts +3 -0
  38. package/dist/getPathNearestPoint.d.ts.map +1 -0
  39. package/dist/getPathNearestPoint.js +47 -0
  40. package/dist/getPathNearestPoint.js.map +1 -0
  41. package/dist/getPathPointAtDistance.d.ts +5 -0
  42. package/dist/getPathPointAtDistance.d.ts.map +1 -0
  43. package/dist/getPathPointAtDistance.js +100 -0
  44. package/dist/getPathPointAtDistance.js.map +1 -0
  45. package/dist/getPathSegmentAtParameter.d.ts +8 -0
  46. package/dist/getPathSegmentAtParameter.d.ts.map +1 -0
  47. package/dist/getPathSegmentAtParameter.js +163 -0
  48. package/dist/getPathSegmentAtParameter.js.map +1 -0
  49. package/dist/getPathSignedArea.d.ts +4 -0
  50. package/dist/getPathSignedArea.d.ts.map +1 -0
  51. package/dist/getPathSignedArea.js +43 -0
  52. package/dist/getPathSignedArea.js.map +1 -0
  53. package/dist/index.d.ts +23 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +23 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/offsetPath.d.ts +3 -0
  58. package/dist/offsetPath.d.ts.map +1 -0
  59. package/dist/offsetPath.js +146 -0
  60. package/dist/offsetPath.js.map +1 -0
  61. package/dist/path.d.ts +17 -0
  62. package/dist/path.d.ts.map +1 -0
  63. package/dist/path.js +293 -0
  64. package/dist/path.js.map +1 -0
  65. package/dist/pathMeshPool.d.ts +6 -0
  66. package/dist/pathMeshPool.d.ts.map +1 -0
  67. package/dist/pathMeshPool.js +58 -0
  68. package/dist/pathMeshPool.js.map +1 -0
  69. package/dist/reversePath.d.ts +3 -0
  70. package/dist/reversePath.d.ts.map +1 -0
  71. package/dist/reversePath.js +95 -0
  72. package/dist/reversePath.js.map +1 -0
  73. package/dist/simplifyPath.d.ts +3 -0
  74. package/dist/simplifyPath.d.ts.map +1 -0
  75. package/dist/simplifyPath.js +78 -0
  76. package/dist/simplifyPath.js.map +1 -0
  77. package/dist/strokePath.d.ts +4 -0
  78. package/dist/strokePath.d.ts.map +1 -0
  79. package/dist/strokePath.js +458 -0
  80. package/dist/strokePath.js.map +1 -0
  81. package/dist/tessellatePath.d.ts +3 -0
  82. package/dist/tessellatePath.d.ts.map +1 -0
  83. package/dist/tessellatePath.js +107 -0
  84. package/dist/tessellatePath.js.map +1 -0
  85. package/dist/tessellatePathTyped.d.ts +3 -0
  86. package/dist/tessellatePathTyped.d.ts.map +1 -0
  87. package/dist/tessellatePathTyped.js +12 -0
  88. package/dist/tessellatePathTyped.js.map +1 -0
  89. package/dist/transformPath.d.ts +4 -0
  90. package/dist/transformPath.d.ts.map +1 -0
  91. package/dist/transformPath.js +62 -0
  92. package/dist/transformPath.js.map +1 -0
  93. package/package.json +37 -0
  94. package/src/containsPathPoint.test.ts +125 -0
  95. package/src/copyPath.test.ts +56 -0
  96. package/src/dashPath.test.ts +76 -0
  97. package/src/fitPathCurves.test.ts +65 -0
  98. package/src/flattenPath.test.ts +87 -0
  99. package/src/forEachPathSegment.test.ts +82 -0
  100. package/src/getPathBounds.test.ts +84 -0
  101. package/src/getPathContourLengths.test.ts +51 -0
  102. package/src/getPathLength.test.ts +33 -0
  103. package/src/getPathNearestPoint.test.ts +64 -0
  104. package/src/getPathPointAtDistance.test.ts +94 -0
  105. package/src/getPathSegmentAtParameter.test.ts +178 -0
  106. package/src/getPathSignedArea.test.ts +45 -0
  107. package/src/offsetPath.test.ts +78 -0
  108. package/src/path.test.ts +376 -0
  109. package/src/pathMeshPool.test.ts +78 -0
  110. package/src/reversePath.test.ts +51 -0
  111. package/src/simplifyPath.test.ts +69 -0
  112. package/src/strokePath.test.ts +150 -0
  113. package/src/tessellatePath.test.ts +62 -0
  114. package/src/tessellatePathTyped.test.ts +26 -0
  115. package/src/transformPath.test.ts +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fitPathCurves.js","sourceRoot":"","sources":["../src/fitPathCurves.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,uFAAuF;AACvF,wFAAwF;AACxF,4FAA4F;AAC5F,8FAA8F;AAC9F,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,MAAsB,EAAE,SAAiB,EAAE,GAAS,EAAE,gBAAgB,GAAG,IAAI;IACzG,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvD,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpB,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAE7B,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAEpB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClH,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;QAE3B,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QACrB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YACb,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,MAAM;gBAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;gBACrB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChD,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7C,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,MAAM;YAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAuB,EAAE,CAAS;IACrD,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;YAAE,SAAS;QACvC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACpD,IAAI,GAAG,GAAG,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAuB,EAAE,GAAW;IAC9D,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAuB,EAAE,GAAW;IAC/D,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAuB,EAAE,KAAa,EAAE,IAAY;IACnF,MAAM,CAAC,GAAa,CAAC,CAAC,CAAC,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CACf,GAAuB,EACvB,KAAa,EACb,IAAY,EACZ,KAAuB,EACvB,KAAuB,EACvB,WAAmB,EACnB,GAAS;IAET,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9G,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,IAAI,CACX,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAC7B,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EACjC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAChC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EACb,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAClB,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,uBAAuB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAElD,MAAM,cAAc,GAAG,CAAC,CAAC;IACzB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE1E,IAAI,MAAM,GAAG,WAAW,EAAE,CAAC;YACzB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QAED,IAAI,IAAI,GAAG,cAAc,EAAE,CAAC;YAC1B,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACzD,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YAC5F,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,GAAuB,EACvB,KAAa,EACb,IAAY,EACZ,CAAqB,EACrB,KAAuB,EACvB,KAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAE1B,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7B,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7B,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAE7B,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,MAAM,IAAI,GACR,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/G,MAAM,IAAI,GACR,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACxG,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;QAC9B,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAClC,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IAEnB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9G,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QACrC,MAAM,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IACvC,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnH,MAAM,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAEjC,IAAI,MAAM,GAAG,OAAO,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;QACzC,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM;QAClC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM;QACtC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM;QACjC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM;QACrC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QACb,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,GAAuB,EACvB,KAAa,EACb,IAAY,EACZ,MAA0B,EAC1B,CAAqB;IAErB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,UAAU,GAAG,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,EAAE,GACN,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9G,MAAM,EAAE,GACN,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9G,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACjC,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACtB,OAAO,GAAG,MAAM,CAAC;YACjB,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CACrB,GAAuB,EACvB,KAAa,EACb,IAAY,EACZ,CAAqB,EACrB,MAA0B;IAE1B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA0B,EAAE,EAAU,EAAE,EAAU,EAAE,CAAS;IAC1F,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,EAAE,GACN,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9G,MAAM,EAAE,GACN,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9G,MAAM,GAAG,GACP,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrH,MAAM,GAAG,GACP,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAErH,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IAC9C,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IAEtE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAuB,EAAE,GAAW;IAChE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Path } from '@flighthq/types';
2
+ export declare function flattenPath(path: Readonly<Path>, tolerance?: number): number[][];
3
+ //# sourceMappingURL=flattenPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenPath.d.ts","sourceRoot":"","sources":["../src/flattenPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAS5C,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,SAAO,GAAG,MAAM,EAAE,EAAE,CAiF9E"}
@@ -0,0 +1,145 @@
1
+ import { PathCommand } from '@flighthq/types';
2
+ // Flattens a Path's curves into straight-line contours. Each contour is a flat
3
+ // [x0, y0, x1, y1, ...] polyline in the path's own coordinate space; quadratic and cubic segments are
4
+ // adaptively subdivided until their deviation from a chord is within `tolerance` (path units).
5
+ // Consumers (clip stencil fill, future hardware shape fills) take these contours; the path's winding
6
+ // rule travels on the path itself, not here. Verb/stride semantics mirror the canvas command reader.
7
+ // A CLOSE verb appends the contour's start point, making the closure explicit in the output.
8
+ export function flattenPath(path, tolerance = 0.25) {
9
+ const commands = path.commands;
10
+ const data = path.data;
11
+ const toleranceSq = tolerance * tolerance;
12
+ const contours = [];
13
+ let contour = null;
14
+ let x = 0;
15
+ let y = 0;
16
+ // Start point of the current contour — used by CLOSE to append the closing segment.
17
+ let contourStartX = 0;
18
+ let contourStartY = 0;
19
+ let di = 0;
20
+ for (let ci = 0; ci < commands.length; ci++) {
21
+ const command = commands[ci];
22
+ if (command === PathCommand.MOVE_TO) {
23
+ x = data[di];
24
+ y = data[di + 1];
25
+ di += 2;
26
+ contourStartX = x;
27
+ contourStartY = y;
28
+ contour = [x, y];
29
+ contours.push(contour);
30
+ }
31
+ else if (command === PathCommand.WIDE_MOVE_TO) {
32
+ x = data[di + 2];
33
+ y = data[di + 3];
34
+ di += 4;
35
+ contourStartX = x;
36
+ contourStartY = y;
37
+ contour = [x, y];
38
+ contours.push(contour);
39
+ }
40
+ else if (command === PathCommand.LINE_TO) {
41
+ contour = ensureContour(contours, contour);
42
+ x = data[di];
43
+ y = data[di + 1];
44
+ di += 2;
45
+ contour.push(x, y);
46
+ }
47
+ else if (command === PathCommand.WIDE_LINE_TO) {
48
+ contour = ensureContour(contours, contour);
49
+ x = data[di + 2];
50
+ y = data[di + 3];
51
+ di += 4;
52
+ contour.push(x, y);
53
+ }
54
+ else if (command === PathCommand.CURVE_TO) {
55
+ contour = ensureContour(contours, contour);
56
+ flattenQuadratic(contour, x, y, data[di], data[di + 1], data[di + 2], data[di + 3], toleranceSq, 0);
57
+ x = data[di + 2];
58
+ y = data[di + 3];
59
+ di += 4;
60
+ }
61
+ else if (command === PathCommand.CUBIC_CURVE_TO) {
62
+ contour = ensureContour(contours, contour);
63
+ flattenCubic(contour, x, y, data[di], data[di + 1], data[di + 2], data[di + 3], data[di + 4], data[di + 5], toleranceSq, 0);
64
+ x = data[di + 4];
65
+ y = data[di + 5];
66
+ di += 6;
67
+ }
68
+ else if (command === PathCommand.CLOSE) {
69
+ // Explicit authored closure: append the start point if the current position is not already there.
70
+ if (contour !== null && (x !== contourStartX || y !== contourStartY)) {
71
+ contour.push(contourStartX, contourStartY);
72
+ }
73
+ x = contourStartX;
74
+ y = contourStartY;
75
+ // Reset contour so the next draw verb starts a fresh implicit contour if needed.
76
+ contour = null;
77
+ }
78
+ // NO_OP and unrecognized verbs consume no data and are skipped.
79
+ }
80
+ return contours;
81
+ }
82
+ const MAX_SUBDIVISION_DEPTH = 16;
83
+ // Starts an implicit contour at the origin when a draw verb precedes any move, mirroring the canvas
84
+ // reader's moveTo(0, 0) fallback. Returns the contour to draw into.
85
+ function ensureContour(contours, contour) {
86
+ if (contour !== null)
87
+ return contour;
88
+ const started = [0, 0];
89
+ contours.push(started);
90
+ return started;
91
+ }
92
+ // Squared perpendicular distance from (px, py) to the segment (x0,y0)-(x1,y1) — used as the flatness
93
+ // test for curve subdivision so we avoid a sqrt per check.
94
+ function distanceToChordSq(px, py, x0, y0, x1, y1) {
95
+ const dx = x1 - x0;
96
+ const dy = y1 - y0;
97
+ const lengthSq = dx * dx + dy * dy;
98
+ if (lengthSq === 0) {
99
+ const ax = px - x0;
100
+ const ay = py - y0;
101
+ return ax * ax + ay * ay;
102
+ }
103
+ const cross = dx * (y0 - py) - dy * (x0 - px);
104
+ return (cross * cross) / lengthSq;
105
+ }
106
+ // Appends the flattened points of a cubic Bezier (excluding the start, including the end) via
107
+ // recursive de Casteljau subdivision at the midpoint.
108
+ function flattenCubic(out, x0, y0, c1x, c1y, c2x, c2y, x1, y1, toleranceSq, depth) {
109
+ const d1 = distanceToChordSq(c1x, c1y, x0, y0, x1, y1);
110
+ const d2 = distanceToChordSq(c2x, c2y, x0, y0, x1, y1);
111
+ if (depth >= MAX_SUBDIVISION_DEPTH || (d1 <= toleranceSq && d2 <= toleranceSq)) {
112
+ out.push(x1, y1);
113
+ return;
114
+ }
115
+ const x01 = (x0 + c1x) / 2;
116
+ const y01 = (y0 + c1y) / 2;
117
+ const x12 = (c1x + c2x) / 2;
118
+ const y12 = (c1y + c2y) / 2;
119
+ const x23 = (c2x + x1) / 2;
120
+ const y23 = (c2y + y1) / 2;
121
+ const x012 = (x01 + x12) / 2;
122
+ const y012 = (y01 + y12) / 2;
123
+ const x123 = (x12 + x23) / 2;
124
+ const y123 = (y12 + y23) / 2;
125
+ const xm = (x012 + x123) / 2;
126
+ const ym = (y012 + y123) / 2;
127
+ flattenCubic(out, x0, y0, x01, y01, x012, y012, xm, ym, toleranceSq, depth + 1);
128
+ flattenCubic(out, xm, ym, x123, y123, x23, y23, x1, y1, toleranceSq, depth + 1);
129
+ }
130
+ // Appends the flattened points of a quadratic Bezier (excluding the start, including the end).
131
+ function flattenQuadratic(out, x0, y0, cx, cy, x1, y1, toleranceSq, depth) {
132
+ if (depth >= MAX_SUBDIVISION_DEPTH || distanceToChordSq(cx, cy, x0, y0, x1, y1) <= toleranceSq) {
133
+ out.push(x1, y1);
134
+ return;
135
+ }
136
+ const x01 = (x0 + cx) / 2;
137
+ const y01 = (y0 + cy) / 2;
138
+ const x12 = (cx + x1) / 2;
139
+ const y12 = (cy + y1) / 2;
140
+ const xm = (x01 + x12) / 2;
141
+ const ym = (y01 + y12) / 2;
142
+ flattenQuadratic(out, x0, y0, x01, y01, xm, ym, toleranceSq, depth + 1);
143
+ flattenQuadratic(out, xm, ym, x12, y12, x1, y1, toleranceSq, depth + 1);
144
+ }
145
+ //# sourceMappingURL=flattenPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenPath.js","sourceRoot":"","sources":["../src/flattenPath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Path, PathSegment } from '@flighthq/types';
2
+ export declare function forEachPathSegment(path: Readonly<Path>, visitor: (segment: PathSegment) => void): void;
3
+ //# sourceMappingURL=forEachPathSegment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forEachPathSegment.d.ts","sourceRoot":"","sources":["../src/forEachPathSegment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAUzD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAkDtG"}
@@ -0,0 +1,66 @@
1
+ import { PathCommand } from '@flighthq/types';
2
+ // Iterates over all segments in `path`, calling `visitor` once for each decoded segment. Each call
3
+ // receives a `PathSegment` value describing the verb and its coordinates. The visitor receives
4
+ // segments in command-stream order; WIDE_MOVE_TO and WIDE_LINE_TO are normalized to their moveTo
5
+ // and lineTo equivalents (the dummy coordinate pair is dropped). NO_OP verbs are skipped silently.
6
+ //
7
+ // This is the canonical way for consumers to walk path segments without re-implementing the
8
+ // commands/data stride decode that flattenPath does internally.
9
+ export function forEachPathSegment(path, visitor) {
10
+ const commands = path.commands;
11
+ const data = path.data;
12
+ let di = 0;
13
+ for (let ci = 0; ci < commands.length; ci++) {
14
+ const command = commands[ci];
15
+ if (command === PathCommand.MOVE_TO) {
16
+ const x = data[di];
17
+ const y = data[di + 1];
18
+ di += 2;
19
+ visitor({ kind: 'moveTo', x, y });
20
+ }
21
+ else if (command === PathCommand.WIDE_MOVE_TO) {
22
+ // Normalize to moveTo; the dummy pair at [di, di+1] is discarded.
23
+ const x = data[di + 2];
24
+ const y = data[di + 3];
25
+ di += 4;
26
+ visitor({ kind: 'moveTo', x, y });
27
+ }
28
+ else if (command === PathCommand.LINE_TO) {
29
+ const x = data[di];
30
+ const y = data[di + 1];
31
+ di += 2;
32
+ visitor({ kind: 'lineTo', x, y });
33
+ }
34
+ else if (command === PathCommand.WIDE_LINE_TO) {
35
+ // Normalize to lineTo; the dummy pair at [di, di+1] is discarded.
36
+ const x = data[di + 2];
37
+ const y = data[di + 3];
38
+ di += 4;
39
+ visitor({ kind: 'lineTo', x, y });
40
+ }
41
+ else if (command === PathCommand.CURVE_TO) {
42
+ const controlX = data[di];
43
+ const controlY = data[di + 1];
44
+ const x = data[di + 2];
45
+ const y = data[di + 3];
46
+ di += 4;
47
+ visitor({ kind: 'curveTo', controlX, controlY, x, y });
48
+ }
49
+ else if (command === PathCommand.CUBIC_CURVE_TO) {
50
+ const control1X = data[di];
51
+ const control1Y = data[di + 1];
52
+ const control2X = data[di + 2];
53
+ const control2Y = data[di + 3];
54
+ const x = data[di + 4];
55
+ const y = data[di + 5];
56
+ di += 6;
57
+ visitor({ kind: 'cubicCurveTo', control1X, control1Y, control2X, control2Y, x, y });
58
+ }
59
+ else if (command === PathCommand.CLOSE) {
60
+ visitor({ kind: 'close' });
61
+ // CLOSE consumes 0 data values.
62
+ }
63
+ // NO_OP and unrecognized verbs consume no data and are skipped.
64
+ }
65
+ }
66
+ //# sourceMappingURL=forEachPathSegment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forEachPathSegment.js","sourceRoot":"","sources":["../src/forEachPathSegment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Path, RectangleLike } from '@flighthq/types';
2
+ export declare function getPathBounds(path: Readonly<Path>, out: RectangleLike): boolean;
3
+ //# sourceMappingURL=getPathBounds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathBounds.d.ts","sourceRoot":"","sources":["../src/getPathBounds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAS3D,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CA6E/E"}
@@ -0,0 +1,167 @@
1
+ import { PathCommand } from '@flighthq/types';
2
+ // Computes the axis-aligned bounding rectangle of `path` including true bezier extrema (not just
3
+ // control-point hull). Writes the result into `out`. Returns `true` if the path contains any
4
+ // geometry; returns `false` and sets `out` to an empty zero-rectangle for an empty path.
5
+ //
6
+ // Extrema for cubic beziers are found by solving the derivative equations B'(t)=0 (a quadratic in
7
+ // t); only roots in [0,1] are included. Quadratic bezier extrema use a single linear root.
8
+ export function getPathBounds(path, out) {
9
+ const commands = path.commands;
10
+ const data = path.data;
11
+ let minX = Infinity;
12
+ let minY = Infinity;
13
+ let maxX = -Infinity;
14
+ let maxY = -Infinity;
15
+ let x = 0;
16
+ let y = 0;
17
+ let di = 0;
18
+ const expand = (px, py) => {
19
+ if (px < minX)
20
+ minX = px;
21
+ if (px > maxX)
22
+ maxX = px;
23
+ if (py < minY)
24
+ minY = py;
25
+ if (py > maxY)
26
+ maxY = py;
27
+ };
28
+ for (let ci = 0; ci < commands.length; ci++) {
29
+ const command = commands[ci];
30
+ if (command === PathCommand.MOVE_TO) {
31
+ x = data[di];
32
+ y = data[di + 1];
33
+ di += 2;
34
+ expand(x, y);
35
+ }
36
+ else if (command === PathCommand.WIDE_MOVE_TO) {
37
+ x = data[di + 2];
38
+ y = data[di + 3];
39
+ di += 4;
40
+ expand(x, y);
41
+ }
42
+ else if (command === PathCommand.LINE_TO) {
43
+ const nx = data[di];
44
+ const ny = data[di + 1];
45
+ di += 2;
46
+ expand(nx, ny);
47
+ x = nx;
48
+ y = ny;
49
+ }
50
+ else if (command === PathCommand.WIDE_LINE_TO) {
51
+ const nx = data[di + 2];
52
+ const ny = data[di + 3];
53
+ di += 4;
54
+ expand(nx, ny);
55
+ x = nx;
56
+ y = ny;
57
+ }
58
+ else if (command === PathCommand.CURVE_TO) {
59
+ const cx = data[di];
60
+ const cy = data[di + 1];
61
+ const ax = data[di + 2];
62
+ const ay = data[di + 3];
63
+ di += 4;
64
+ expandQuadraticBounds(x, y, cx, cy, ax, ay, expand);
65
+ x = ax;
66
+ y = ay;
67
+ }
68
+ else if (command === PathCommand.CUBIC_CURVE_TO) {
69
+ const c1x = data[di];
70
+ const c1y = data[di + 1];
71
+ const c2x = data[di + 2];
72
+ const c2y = data[di + 3];
73
+ const ax = data[di + 4];
74
+ const ay = data[di + 5];
75
+ di += 6;
76
+ expandCubicBounds(x, y, c1x, c1y, c2x, c2y, ax, ay, expand);
77
+ x = ax;
78
+ y = ay;
79
+ }
80
+ // CLOSE, NO_OP, and unrecognized verbs consume no data and do not affect bounds.
81
+ }
82
+ if (minX === Infinity) {
83
+ out.x = 0;
84
+ out.y = 0;
85
+ out.width = 0;
86
+ out.height = 0;
87
+ return false;
88
+ }
89
+ out.x = minX;
90
+ out.y = minY;
91
+ out.width = maxX - minX;
92
+ out.height = maxY - minY;
93
+ return true;
94
+ }
95
+ // Calls `cb` for each root t ∈ (0,1) of the cubic derivative B'(t) = 0 along one axis.
96
+ function cubicExtremumRoots(p0, p1, p2, p3, cb) {
97
+ // Quadratic coefficients of the derivative (after dividing out the factor of 3).
98
+ const a = -p0 + 3 * p1 - 3 * p2 + p3;
99
+ const b = 2 * (p0 - 2 * p1 + p2);
100
+ const c = p1 - p0;
101
+ if (Math.abs(a) < 1e-12) {
102
+ // Degenerate to linear: b*t + c = 0
103
+ if (Math.abs(b) < 1e-12)
104
+ return;
105
+ const t = -c / b;
106
+ if (t > 0 && t < 1)
107
+ cb(t);
108
+ return;
109
+ }
110
+ const discriminant = b * b - 4 * a * c;
111
+ if (discriminant < 0)
112
+ return;
113
+ const sqrtD = Math.sqrt(discriminant);
114
+ const t1 = (-b + sqrtD) / (2 * a);
115
+ const t2 = (-b - sqrtD) / (2 * a);
116
+ if (t1 > 0 && t1 < 1)
117
+ cb(t1);
118
+ if (t2 > 0 && t2 < 1 && Math.abs(t2 - t1) > 1e-12)
119
+ cb(t2);
120
+ }
121
+ function evalCubic(p0, p1, p2, p3, t) {
122
+ const mt = 1 - t;
123
+ return mt * mt * mt * p0 + 3 * mt * mt * t * p1 + 3 * mt * t * t * p2 + t * t * t * p3;
124
+ }
125
+ function evalQuadratic(p0, p1, p2, t) {
126
+ const mt = 1 - t;
127
+ return mt * mt * p0 + 2 * mt * t * p1 + t * t * p2;
128
+ }
129
+ // Expands `expand` with the bounding extrema of a cubic bezier from (x0,y0) to (x3,y3).
130
+ // Extrema found by solving the quadratic B'(t) = 0 for each axis; only roots in (0,1) included.
131
+ function expandCubicBounds(x0, y0, c1x, c1y, c2x, c2y, x3, y3, expand) {
132
+ expand(x3, y3);
133
+ // B'(t) coefficients for one axis: at^2 + bt + c = 0
134
+ // a = 3*(-P0 + 3P1 - 3P2 + P3)
135
+ // b = 6*(P0 - 2P1 + P2)
136
+ // c = 3*(P1 - P0)
137
+ cubicExtremumRoots(x0, c1x, c2x, x3, (t) => {
138
+ expand(evalCubic(x0, c1x, c2x, x3, t), evalCubic(y0, c1y, c2y, y3, t));
139
+ });
140
+ cubicExtremumRoots(y0, c1y, c2y, y3, (t) => {
141
+ expand(evalCubic(x0, c1x, c2x, x3, t), evalCubic(y0, c1y, c2y, y3, t));
142
+ });
143
+ }
144
+ // Expands `expand` with the bounding extrema of a quadratic bezier from (x0,y0) to (x2,y2) with
145
+ // control point (cx,cy). The extreme point along each axis (if it lies in [0,1]) is evaluated.
146
+ function expandQuadraticBounds(x0, y0, cx, cy, x2, y2, expand) {
147
+ // The endpoint is always included; include the start of the segment via the caller.
148
+ expand(x2, y2);
149
+ // B(t) = (1-t)^2*P0 + 2t(1-t)*P1 + t^2*P2
150
+ // B'(t) = 2(1-t)*(P1-P0) + 2t*(P2-P1) = 0 → t = (P0-P1) / (P0 - 2*P1 + P2)
151
+ const tx = quadraticExtremumT(x0, cx, x2);
152
+ if (tx !== null)
153
+ expand(evalQuadratic(x0, cx, x2, tx), evalQuadratic(y0, cy, y2, tx));
154
+ const ty = quadraticExtremumT(y0, cy, y2);
155
+ if (ty !== null)
156
+ expand(evalQuadratic(x0, cx, x2, ty), evalQuadratic(y0, cy, y2, ty));
157
+ }
158
+ // Returns the parameter t in (0,1) at which the quadratic bezier coordinate has its extremum,
159
+ // or null if the denominator is zero (linear segment in that axis) or t is outside (0,1).
160
+ function quadraticExtremumT(p0, p1, p2) {
161
+ const denom = p0 - 2 * p1 + p2;
162
+ if (denom === 0)
163
+ return null;
164
+ const t = (p0 - p1) / denom;
165
+ return t > 0 && t < 1 ? t : null;
166
+ }
167
+ //# sourceMappingURL=getPathBounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathBounds.js","sourceRoot":"","sources":["../src/getPathBounds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Path } from '@flighthq/types';
2
+ export declare function getPathContourLengths(path: Readonly<Path>, tolerance?: number): number[];
3
+ //# sourceMappingURL=getPathContourLengths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathContourLengths.d.ts","sourceRoot":"","sources":["../src/getPathContourLengths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM5C,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,SAAO,GAAG,MAAM,EAAE,CAOtF"}
@@ -0,0 +1,21 @@
1
+ import { flattenPath } from './flattenPath';
2
+ // Returns an array of arc lengths, one per contour in the path. Curves are adaptively flattened
3
+ // to `tolerance` path units before measurement. An empty path returns an empty array.
4
+ export function getPathContourLengths(path, tolerance = 0.25) {
5
+ const contours = flattenPath(path, tolerance);
6
+ const lengths = [];
7
+ for (let ci = 0; ci < contours.length; ci++) {
8
+ lengths.push(contourLength(contours[ci]));
9
+ }
10
+ return lengths;
11
+ }
12
+ function contourLength(contour) {
13
+ let len = 0;
14
+ for (let i = 2; i < contour.length; i += 2) {
15
+ const dx = contour[i] - contour[i - 2];
16
+ const dy = contour[i + 1] - contour[i - 1];
17
+ len += Math.sqrt(dx * dx + dy * dy);
18
+ }
19
+ return len;
20
+ }
21
+ //# sourceMappingURL=getPathContourLengths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathContourLengths.js","sourceRoot":"","sources":["../src/getPathContourLengths.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,gGAAgG;AAChG,sFAAsF;AACtF,MAAM,UAAU,qBAAqB,CAAC,IAAoB,EAAE,SAAS,GAAG,IAAI;IAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,OAA2B;IAChD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Path } from '@flighthq/types';
2
+ export declare function getPathLength(path: Readonly<Path>, tolerance?: number): number;
3
+ //# sourceMappingURL=getPathLength.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathLength.d.ts","sourceRoot":"","sources":["../src/getPathLength.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAO5C,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,SAAO,GAAG,MAAM,CAO5E"}
@@ -0,0 +1,23 @@
1
+ import { flattenPath } from './flattenPath';
2
+ // Returns the total arc length of `path` by summing the Euclidean lengths of all flattened segments.
3
+ // Curves are adaptively approximated to `tolerance` path units before measurement.
4
+ // An empty path returns 0.
5
+ export function getPathLength(path, tolerance = 0.25) {
6
+ const contours = flattenPath(path, tolerance);
7
+ let total = 0;
8
+ for (let ci = 0; ci < contours.length; ci++) {
9
+ total += contourLength(contours[ci]);
10
+ }
11
+ return total;
12
+ }
13
+ // Returns the summed Euclidean length of the polyline segments in one flattened contour.
14
+ function contourLength(contour) {
15
+ let len = 0;
16
+ for (let i = 2; i < contour.length; i += 2) {
17
+ const dx = contour[i] - contour[i - 2];
18
+ const dy = contour[i + 1] - contour[i - 1];
19
+ len += Math.sqrt(dx * dx + dy * dy);
20
+ }
21
+ return len;
22
+ }
23
+ //# sourceMappingURL=getPathLength.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathLength.js","sourceRoot":"","sources":["../src/getPathLength.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,qGAAqG;AACrG,mFAAmF;AACnF,2BAA2B;AAC3B,MAAM,UAAU,aAAa,CAAC,IAAoB,EAAE,SAAS,GAAG,IAAI;IAClE,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,KAAK,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,SAAS,aAAa,CAAC,OAA2B;IAChD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Path, Vector2Like } from '@flighthq/types';
2
+ export declare function getPathNearestPoint(path: Readonly<Path>, px: number, py: number, out: Vector2Like, tolerance?: number): number;
3
+ //# sourceMappingURL=getPathNearestPoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathNearestPoint.d.ts","sourceRoot":"","sources":["../src/getPathNearestPoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAOzD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,WAAW,EAChB,SAAS,SAAO,GACf,MAAM,CAuCR"}
@@ -0,0 +1,47 @@
1
+ import { flattenPath } from './flattenPath';
2
+ // Finds the closest point on `path` to (px, py), writing the result into `out`. Returns the
3
+ // distance from (px, py) to the nearest point. Returns -1 and leaves `out` unchanged for an
4
+ // empty path. Curves are adaptively flattened to `tolerance` before the query.
5
+ export function getPathNearestPoint(path, px, py, out, tolerance = 0.25) {
6
+ const contours = flattenPath(path, tolerance);
7
+ let bestDistSq = Infinity;
8
+ let bestX = 0;
9
+ let bestY = 0;
10
+ for (let ci = 0; ci < contours.length; ci++) {
11
+ const contour = contours[ci];
12
+ for (let i = 2; i < contour.length; i += 2) {
13
+ const ax = contour[i - 2];
14
+ const ay = contour[i - 1];
15
+ const bx = contour[i];
16
+ const by = contour[i + 1];
17
+ const dx = bx - ax;
18
+ const dy = by - ay;
19
+ const lenSq = dx * dx + dy * dy;
20
+ let t;
21
+ if (lenSq === 0) {
22
+ t = 0;
23
+ }
24
+ else {
25
+ t = ((px - ax) * dx + (py - ay) * dy) / lenSq;
26
+ if (t < 0)
27
+ t = 0;
28
+ else if (t > 1)
29
+ t = 1;
30
+ }
31
+ const cx = ax + t * dx;
32
+ const cy = ay + t * dy;
33
+ const distSq = (px - cx) * (px - cx) + (py - cy) * (py - cy);
34
+ if (distSq < bestDistSq) {
35
+ bestDistSq = distSq;
36
+ bestX = cx;
37
+ bestY = cy;
38
+ }
39
+ }
40
+ }
41
+ if (bestDistSq === Infinity)
42
+ return -1;
43
+ out.x = bestX;
44
+ out.y = bestY;
45
+ return Math.sqrt(bestDistSq);
46
+ }
47
+ //# sourceMappingURL=getPathNearestPoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathNearestPoint.js","sourceRoot":"","sources":["../src/getPathNearestPoint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,4FAA4F;AAC5F,4FAA4F;AAC5F,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CACjC,IAAoB,EACpB,EAAU,EACV,EAAU,EACV,GAAgB,EAChB,SAAS,GAAG,IAAI;IAEhB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAChC,IAAI,CAAS,CAAC;YACd,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,CAAC,GAAG,CAAC,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC;oBAAE,CAAC,GAAG,CAAC,CAAC;qBACZ,IAAI,CAAC,GAAG,CAAC;oBAAE,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7D,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;gBACxB,UAAU,GAAG,MAAM,CAAC;gBACpB,KAAK,GAAG,EAAE,CAAC;gBACX,KAAK,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,CAAC;IACvC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACd,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Path, Vector2Like } from '@flighthq/types';
2
+ export declare function getPathPointAtDistance(path: Readonly<Path>, distance: number, out: Vector2Like, tolerance?: number): boolean;
3
+ export declare function getPathPositionAtDistance(path: Readonly<Path>, distance: number, pointOut: Vector2Like, tangentOut: Vector2Like, tolerance?: number): boolean;
4
+ export declare function getPathTangentAtDistance(path: Readonly<Path>, distance: number, out: Vector2Like, tolerance?: number): boolean;
5
+ //# sourceMappingURL=getPathPointAtDistance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPathPointAtDistance.d.ts","sourceRoot":"","sources":["../src/getPathPointAtDistance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAYzD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,WAAW,EAChB,SAAS,SAAO,GACf,OAAO,CAGT;AAID,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,WAAW,EACvB,SAAS,SAAO,GACf,OAAO,CAKT;AAMD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,WAAW,EAChB,SAAS,SAAO,GACf,OAAO,CAGT"}