@excalidraw/math 0.18.0-4a5c9e9 → 0.18.0-4ce38fb

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 (217) hide show
  1. package/dist/dev/index.js +313 -115
  2. package/dist/dev/index.js.map +4 -4
  3. package/dist/prod/index.js +1 -1
  4. package/dist/types/common/src/colors.d.ts +23 -1
  5. package/dist/types/common/src/constants.d.ts +66 -7
  6. package/dist/types/common/src/keys.d.ts +4 -0
  7. package/dist/types/common/src/points.d.ts +1 -1
  8. package/dist/types/common/src/random.d.ts +7 -0
  9. package/dist/types/common/src/utils.d.ts +6 -43
  10. package/dist/types/element/src/Scene.d.ts +7 -5
  11. package/dist/types/element/src/align.d.ts +2 -2
  12. package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
  13. package/dist/types/element/src/arrows/focus.d.ts +5 -2
  14. package/dist/types/element/src/binding.d.ts +28 -13
  15. package/dist/types/element/src/bounds.d.ts +22 -7
  16. package/dist/types/element/src/bucketFill.d.ts +110 -0
  17. package/dist/types/element/src/collision.d.ts +14 -5
  18. package/dist/types/element/src/comparisons.d.ts +8 -5
  19. package/dist/types/element/src/convertToShape.d.ts +23 -0
  20. package/dist/types/element/src/delta.d.ts +23 -1
  21. package/dist/types/element/src/distribute.d.ts +2 -2
  22. package/dist/types/element/src/dragElements.d.ts +27 -0
  23. package/dist/types/element/src/duplicate.d.ts +64 -3
  24. package/dist/types/element/src/embeddable.d.ts +2 -2
  25. package/dist/types/element/src/flowchart.d.ts +11 -7
  26. package/dist/types/element/src/fractionalIndex.d.ts +2 -2
  27. package/dist/types/element/src/frame.d.ts +11 -10
  28. package/dist/types/element/src/groups.d.ts +9 -9
  29. package/dist/types/element/src/index.d.ts +6 -1
  30. package/dist/types/element/src/linearElementEditor.d.ts +27 -10
  31. package/dist/types/element/src/listMarker.d.ts +34 -0
  32. package/dist/types/element/src/mutateElement.d.ts +1 -1
  33. package/dist/types/element/src/newElement.d.ts +53 -3
  34. package/dist/types/element/src/renderElement.d.ts +21 -7
  35. package/dist/types/element/src/resizeElements.d.ts +2 -2
  36. package/dist/types/element/src/selection.d.ts +6 -6
  37. package/dist/types/element/src/shape.d.ts +27 -1
  38. package/dist/types/element/src/sizeHelpers.d.ts +6 -0
  39. package/dist/types/element/src/sortElements.d.ts +10 -0
  40. package/dist/types/element/src/stickyNote.d.ts +183 -0
  41. package/dist/types/element/src/textElement.d.ts +20 -9
  42. package/dist/types/element/src/transform.d.ts +26 -7
  43. package/dist/types/element/src/typeChecks.d.ts +29 -27
  44. package/dist/types/element/src/types.d.ts +43 -7
  45. package/dist/types/element/src/utils.d.ts +15 -4
  46. package/dist/types/element/src/zindex.d.ts +2 -2
  47. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +87 -18
  48. package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
  49. package/dist/types/excalidraw/actions/actionBoundText.d.ts +58 -12
  50. package/dist/types/excalidraw/actions/actionCanvas.d.ts +265 -940
  51. package/dist/types/excalidraw/actions/actionClipboard.d.ts +58 -12
  52. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +29 -6
  53. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +89 -19
  54. package/dist/types/excalidraw/actions/actionDeselect.d.ts +30 -7
  55. package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -3
  56. package/dist/types/excalidraw/actions/actionElementLink.d.ts +29 -6
  57. package/dist/types/excalidraw/actions/actionElementLock.d.ts +59 -13
  58. package/dist/types/excalidraw/actions/actionExport.d.ts +60 -14
  59. package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
  60. package/dist/types/excalidraw/actions/actionFrame.d.ts +150 -203
  61. package/dist/types/excalidraw/actions/actionGroup.d.ts +73 -27
  62. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +84 -9
  63. package/dist/types/excalidraw/actions/actionLink.d.ts +30 -7
  64. package/dist/types/excalidraw/actions/actionMenu.d.ts +29 -6
  65. package/dist/types/excalidraw/actions/actionProperties.d.ts +96 -34
  66. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +34 -11
  67. package/dist/types/excalidraw/actions/actionStyles.d.ts +30 -7
  68. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +1 -1
  69. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +30 -7
  70. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +33 -11
  71. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +30 -7
  72. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +30 -7
  73. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +33 -11
  74. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
  75. package/dist/types/excalidraw/actions/{actionEmbeddable.d.ts → actionToggleShowHints.d.ts} +45 -19
  76. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +30 -7
  77. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +31 -8
  78. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +30 -7
  79. package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
  80. package/dist/types/excalidraw/actions/index.d.ts +2 -2
  81. package/dist/types/excalidraw/actions/manager.d.ts +1 -0
  82. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  83. package/dist/types/excalidraw/actions/types.d.ts +8 -4
  84. package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
  85. package/dist/types/excalidraw/appState.d.ts +30 -6
  86. package/dist/types/excalidraw/components/Actions.d.ts +17 -12
  87. package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
  88. package/dist/types/excalidraw/components/App.arrowText.d.ts +70 -0
  89. package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
  90. package/dist/types/excalidraw/components/App.clipboard.d.ts +31 -0
  91. package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
  92. package/dist/types/excalidraw/components/App.d.ts +301 -93
  93. package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
  94. package/dist/types/excalidraw/components/App.duplicate.d.ts +101 -0
  95. package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
  96. package/dist/types/excalidraw/components/App.pan.d.ts +62 -0
  97. package/dist/types/excalidraw/components/App.text.d.ts +146 -0
  98. package/dist/types/excalidraw/components/App.textTool.d.ts +140 -0
  99. package/dist/types/excalidraw/components/App.toolDrag.d.ts +63 -0
  100. package/dist/types/excalidraw/components/App.viewport.d.ts +113 -0
  101. package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
  102. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -3
  103. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
  104. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +5 -1
  105. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +9 -2
  106. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
  107. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
  108. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
  109. package/dist/types/excalidraw/components/ColorPicker/colorTopPicksDnD.d.ts +11 -0
  110. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -1
  111. package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
  112. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -2
  113. package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
  114. package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -1
  115. package/dist/types/excalidraw/components/FileDropOverlay.d.ts +2 -0
  116. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +4 -1
  117. package/dist/types/excalidraw/components/FontPicker/FontPickerList.d.ts +6 -1
  118. package/dist/types/excalidraw/components/FontPicker/fontTopPicksDnD.d.ts +12 -0
  119. package/dist/types/excalidraw/components/IconButton.d.ts +48 -0
  120. package/dist/types/excalidraw/components/Island.d.ts +7 -0
  121. package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
  122. package/dist/types/excalidraw/components/LayerUI.d.ts +5 -2
  123. package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
  124. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +6 -2
  125. package/dist/types/excalidraw/components/LibraryUnit.d.ts +7 -2
  126. package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
  127. package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
  128. package/dist/types/excalidraw/components/MobileMenu.d.ts +4 -4
  129. package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
  130. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  131. package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
  132. package/dist/types/excalidraw/components/Popover.d.ts +1 -3
  133. package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
  134. package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
  135. package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
  136. package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
  137. package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
  138. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
  139. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -2
  140. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
  141. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
  142. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
  143. package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
  144. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  145. package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +4 -4
  146. package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +3 -3
  147. package/dist/types/excalidraw/components/ToolPopover.d.ts +3 -6
  148. package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
  149. package/dist/types/excalidraw/components/Tools.d.ts +151 -0
  150. package/dist/types/excalidraw/components/Tooltip.d.ts +15 -1
  151. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksContextMenu.d.ts +14 -0
  152. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksTip.d.ts +11 -0
  153. package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +58 -0
  154. package/dist/types/excalidraw/components/UserList.d.ts +3 -2
  155. package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
  156. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -1
  157. package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +3 -0
  158. package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  159. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -1
  160. package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
  161. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -2
  162. package/dist/types/excalidraw/components/icons.d.ts +7 -1
  163. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +10 -4
  164. package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
  165. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
  166. package/dist/types/excalidraw/data/blob.d.ts +62 -16
  167. package/dist/types/excalidraw/data/index.d.ts +4 -4
  168. package/dist/types/excalidraw/data/json.d.ts +37 -14
  169. package/dist/types/excalidraw/data/library.d.ts +1 -1
  170. package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
  171. package/dist/types/excalidraw/eraser/index.d.ts +2 -3
  172. package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
  173. package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
  174. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  175. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
  176. package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
  177. package/dist/types/excalidraw/lasso/index.d.ts +2 -3
  178. package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
  179. package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
  180. package/dist/types/excalidraw/renderer/animation.d.ts +5 -1
  181. package/dist/types/excalidraw/renderer/helpers.d.ts +25 -0
  182. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +2 -4
  183. package/dist/types/excalidraw/scene/Renderer.d.ts +489 -20
  184. package/dist/types/excalidraw/scene/export.d.ts +3 -3
  185. package/dist/types/excalidraw/scene/index.d.ts +2 -2
  186. package/dist/types/excalidraw/scene/types.d.ts +7 -4
  187. package/dist/types/excalidraw/snapping.d.ts +7 -7
  188. package/dist/types/excalidraw/types.d.ts +531 -29
  189. package/dist/types/excalidraw/viewport.d.ts +302 -0
  190. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +13 -3
  191. package/dist/types/fractional-indexing/src/index.d.ts +29 -0
  192. package/dist/types/laser-pointer/src/index.d.ts +2 -0
  193. package/dist/types/laser-pointer/src/math.d.ts +16 -0
  194. package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
  195. package/dist/types/laser-pointer/src/state.d.ts +36 -0
  196. package/dist/types/math/src/constants.d.ts +0 -1
  197. package/dist/types/math/src/curve.d.ts +23 -13
  198. package/dist/types/math/src/index.d.ts +1 -0
  199. package/dist/types/math/src/pca.d.ts +79 -0
  200. package/dist/types/math/src/point.d.ts +1 -0
  201. package/dist/types/math/src/polygon.d.ts +25 -1
  202. package/dist/types/math/src/segment.d.ts +6 -0
  203. package/dist/types/utils/src/export.d.ts +4 -3
  204. package/dist/types/utils/src/index.d.ts +1 -2
  205. package/dist/types/utils/src/shape.d.ts +2 -2
  206. package/package.json +2 -2
  207. package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
  208. package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
  209. package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
  210. package/dist/types/excalidraw/components/MobileToolBar.d.ts +0 -10
  211. package/dist/types/excalidraw/components/ToolButton.d.ts +0 -49
  212. package/dist/types/excalidraw/components/shapes.d.ts +0 -263
  213. package/dist/types/excalidraw/cursor.d.ts +0 -5
  214. package/dist/types/excalidraw/scene/scroll.d.ts +0 -18
  215. package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
  216. package/dist/types/utils/src/bbox.d.ts +0 -9
  217. package/dist/types/utils/src/withinBounds.d.ts +0 -19
package/dist/dev/index.js CHANGED
@@ -152,6 +152,9 @@ var pointScaleFromOrigin = (p, mid, multiplier) => pointTranslate(mid, vectorSca
152
152
  var isPointWithinBounds = (p, q, r) => {
153
153
  return q[0] <= Math.max(p[0], r[0]) && q[0] >= Math.min(p[0], r[0]) && q[1] <= Math.max(p[1], r[1]) && q[1] >= Math.min(p[1], r[1]);
154
154
  };
155
+ var isValidPoint = (point) => {
156
+ return Array.isArray(point) && point.length === 2 && isFiniteNumber(point[0]) && isFiniteNumber(point[1]);
157
+ };
155
158
 
156
159
  // src/constants.ts
157
160
  var LegendreGaussN24TValues = [
@@ -259,8 +262,15 @@ var initial_guesses = [
259
262
  [0.2, 0],
260
263
  [0.8, 0]
261
264
  ];
262
- var calculate = ([t0, s0], l, c) => {
263
- const solution = solveWithAnalyticalJacobian(c, l, t0, s0, 0.01, 4);
265
+ var calculate = ([t0, s0], l, c, tolerance = 0.01, iterLimit = 4) => {
266
+ const solution = solveWithAnalyticalJacobian(
267
+ c,
268
+ l,
269
+ t0,
270
+ s0,
271
+ tolerance,
272
+ iterLimit
273
+ );
264
274
  if (!solution) {
265
275
  return null;
266
276
  }
@@ -270,22 +280,40 @@ var calculate = ([t0, s0], l, c) => {
270
280
  }
271
281
  return bezierEquation(c, t);
272
282
  };
273
- function curveIntersectLineSegment(c, l) {
274
- let solution = calculate(initial_guesses[0], l, c);
283
+ function curveIntersectLineSegment(c, l, opts) {
284
+ let solution = calculate(
285
+ initial_guesses[0],
286
+ l,
287
+ c,
288
+ opts?.tolerance,
289
+ opts?.iterLimit
290
+ );
275
291
  if (solution) {
276
292
  return [solution];
277
293
  }
278
- solution = calculate(initial_guesses[1], l, c);
294
+ solution = calculate(
295
+ initial_guesses[1],
296
+ l,
297
+ c,
298
+ opts?.tolerance,
299
+ opts?.iterLimit
300
+ );
279
301
  if (solution) {
280
302
  return [solution];
281
303
  }
282
- solution = calculate(initial_guesses[2], l, c);
304
+ solution = calculate(
305
+ initial_guesses[2],
306
+ l,
307
+ c,
308
+ opts?.tolerance,
309
+ opts?.iterLimit
310
+ );
283
311
  if (solution) {
284
312
  return [solution];
285
313
  }
286
314
  return [];
287
315
  }
288
- function curveClosestPoint(c, p, tolerance = 1e-3) {
316
+ function curveClosestParameter(c, p, tolerance = 1e-3) {
289
317
  const localMinimum = (min, max, f, e = tolerance) => {
290
318
  let m = min;
291
319
  let n = max;
@@ -302,7 +330,7 @@ function curveClosestPoint(c, p, tolerance = 1e-3) {
302
330
  };
303
331
  const maxSteps = 30;
304
332
  let closestStep = 0;
305
- for (let min = Infinity, step = 0; step < maxSteps; step++) {
333
+ for (let min = Infinity, step = 0; step <= maxSteps; step++) {
306
334
  const d = pointDistance(p, bezierEquation(c, step / maxSteps));
307
335
  if (d < min) {
308
336
  min = d;
@@ -311,22 +339,18 @@ function curveClosestPoint(c, p, tolerance = 1e-3) {
311
339
  }
312
340
  const t0 = Math.max((closestStep - 1) / maxSteps, 0);
313
341
  const t1 = Math.min((closestStep + 1) / maxSteps, 1);
314
- const solution = localMinimum(
342
+ const param = localMinimum(
315
343
  t0,
316
344
  t1,
317
345
  (t) => pointDistance(p, bezierEquation(c, t))
318
346
  );
319
- if (!solution) {
320
- return null;
321
- }
322
- return bezierEquation(c, solution);
347
+ return param ?? closestStep / maxSteps;
323
348
  }
324
- function curvePointDistance(c, p) {
325
- const closest = curveClosestPoint(c, p);
326
- if (!closest) {
327
- return 0;
328
- }
329
- return pointDistance(p, closest);
349
+ function curveClosestPoint(c, p, tolerance = 1e-3) {
350
+ return bezierEquation(c, curveClosestParameter(c, p, tolerance));
351
+ }
352
+ function curvePointDistance(c, p, tolerance = 1e-3) {
353
+ return pointDistance(p, curveClosestPoint(c, p, tolerance));
330
354
  }
331
355
  function isCurve(v) {
332
356
  return Array.isArray(v) && v.length === 4 && isPoint(v[0]) && isPoint(v[1]) && isPoint(v[2]) && isPoint(v[3]);
@@ -444,14 +468,13 @@ function curveLengthAtParameter(c, t) {
444
468
  }
445
469
  return z1 * sum;
446
470
  }
447
- function curvePointAtLength(c, percent) {
471
+ function curvePointAtLength(c, percent, totalLength = curveLength(c)) {
448
472
  if (percent <= 0) {
449
473
  return bezierEquation(c, 0);
450
474
  }
451
475
  if (percent >= 1) {
452
476
  return bezierEquation(c, 1);
453
477
  }
454
- const totalLength = curveLength(c);
455
478
  const targetLength = totalLength * percent;
456
479
  let tMin = 0;
457
480
  let tMax = 1;
@@ -500,6 +523,9 @@ var ellipseDistanceFromPoint = (p, ellipse2) => {
500
523
  vectorFromPoint(p),
501
524
  vectorScale(vectorFromPoint(center), -1)
502
525
  );
526
+ if (a === b) {
527
+ return Math.abs(Math.hypot(translatedPoint[0], translatedPoint[1]) - a);
528
+ }
503
529
  const px = Math.abs(translatedPoint[0]);
504
530
  const py = Math.abs(translatedPoint[1]);
505
531
  let tx = 0.707;
@@ -515,6 +541,9 @@ var ellipseDistanceFromPoint = (p, ellipse2) => {
515
541
  const qy = py - ey;
516
542
  const r = Math.hypot(ry, rx);
517
543
  const q = Math.hypot(qy, qx);
544
+ if (q === 0) {
545
+ break;
546
+ }
518
547
  tx = Math.min(1, Math.max(0, (qx * r / q + ex) / a));
519
548
  ty = Math.min(1, Math.max(0, (qy * r / q + ey) / b));
520
549
  const t = Math.hypot(ty, tx);
@@ -522,8 +551,8 @@ var ellipseDistanceFromPoint = (p, ellipse2) => {
522
551
  ty /= t;
523
552
  }
524
553
  const [minX, minY] = [
525
- a * tx * Math.sign(translatedPoint[0]),
526
- b * ty * Math.sign(translatedPoint[1])
554
+ a * tx * (translatedPoint[0] < 0 ? -1 : 1),
555
+ b * ty * (translatedPoint[1] < 0 ? -1 : 1)
527
556
  ];
528
557
  return pointDistance(pointFromVector(translatedPoint), pointFrom(minX, minY));
529
558
  };
@@ -610,93 +639,98 @@ function linesIntersectAt(a, b) {
610
639
  return null;
611
640
  }
612
641
 
613
- // src/segment.ts
614
- function lineSegment(a, b) {
615
- return [a, b];
616
- }
617
- var isLineSegment = (segment) => Array.isArray(segment) && segment.length === 2 && isPoint(segment[0]) && isPoint(segment[1]);
618
- var lineSegmentRotate = (l, angle, origin) => {
619
- return lineSegment(
620
- pointRotateRads(l[0], origin || pointCenter(l[0], l[1]), angle),
621
- pointRotateRads(l[1], origin || pointCenter(l[0], l[1]), angle)
622
- );
623
- };
624
- var segmentsIntersectAt = (a, b) => {
625
- const a0 = vectorFromPoint(a[0]);
626
- const a1 = vectorFromPoint(a[1]);
627
- const b0 = vectorFromPoint(b[0]);
628
- const b1 = vectorFromPoint(b[1]);
629
- const r = vectorSubtract(a1, a0);
630
- const s = vectorSubtract(b1, b0);
631
- const denominator = vectorCross(r, s);
632
- if (denominator === 0) {
633
- return null;
634
- }
635
- const i = vectorSubtract(vectorFromPoint(b[0]), vectorFromPoint(a[0]));
636
- const u = vectorCross(i, r) / denominator;
637
- const t = vectorCross(i, s) / denominator;
638
- if (u === 0) {
639
- return null;
640
- }
641
- const p = vectorAdd(a0, vectorScale(r, t));
642
- if (t >= 0 && t < 1 && u >= 0 && u < 1) {
643
- return pointFromVector(p);
642
+ // src/pca.ts
643
+ function centroid(points) {
644
+ let cx = 0;
645
+ let cy = 0;
646
+ for (const [x, y] of points) {
647
+ cx += x;
648
+ cy += y;
644
649
  }
645
- return null;
646
- };
647
- var pointOnLineSegment = (point, line2, threshold = PRECISION) => {
648
- const distance = distanceToLineSegment(point, line2);
649
- if (distance === 0) {
650
- return true;
650
+ return pointFrom(cx / points.length, cy / points.length);
651
+ }
652
+ function principalAxes(points) {
653
+ if (points.length < 2) {
654
+ console.error("Degenerate point set: at least two points are required");
651
655
  }
652
- return distance < threshold;
653
- };
654
- var distanceToLineSegment = (point, line2) => {
655
- const [x, y] = point;
656
- const [[x1, y1], [x2, y2]] = line2;
657
- const A = x - x1;
658
- const B = y - y1;
659
- const C = x2 - x1;
660
- const D = y2 - y1;
661
- const dot = A * C + B * D;
662
- const len_sq = C * C + D * D;
663
- let param = -1;
664
- if (len_sq !== 0) {
665
- param = dot / len_sq;
656
+ const c = centroid(points);
657
+ let m20 = 0;
658
+ let m02 = 0;
659
+ let m11 = 0;
660
+ for (const [x, y] of points) {
661
+ const dx = x - c[0];
662
+ const dy = y - c[1];
663
+ m20 += dx * dx;
664
+ m02 += dy * dy;
665
+ m11 += dx * dy;
666
666
  }
667
- let xx;
668
- let yy;
669
- if (param < 0) {
670
- xx = x1;
671
- yy = y1;
672
- } else if (param > 1) {
673
- xx = x2;
674
- yy = y2;
667
+ m20 /= points.length;
668
+ m02 /= points.length;
669
+ m11 /= points.length;
670
+ const trace = m20 + m02;
671
+ const diff = Math.hypot(m20 - m02, 2 * m11);
672
+ const majorVariance = (trace + diff) / 2;
673
+ const minorVariance = (trace - diff) / 2;
674
+ let major;
675
+ if (Math.abs(m11) > Number.EPSILON) {
676
+ major = vectorNormalize(vector(majorVariance - m02, m11));
675
677
  } else {
676
- xx = x1 + param * C;
677
- yy = y1 + param * D;
678
+ major = m20 >= m02 ? vector(1, 0) : vector(0, 1);
678
679
  }
679
- const dx = x - xx;
680
- const dy = y - yy;
681
- return Math.sqrt(dx * dx + dy * dy);
682
- };
683
- function lineSegmentIntersectionPoints(l, s, threshold) {
684
- const candidate = linesIntersectAt(line(l[0], l[1]), line(s[0], s[1]));
685
- if (!candidate || !pointOnLineSegment(candidate, s, threshold) || !pointOnLineSegment(candidate, l, threshold)) {
686
- return null;
680
+ return {
681
+ centroid: c,
682
+ major,
683
+ minor: vectorNormal(major),
684
+ majorVariance,
685
+ minorVariance
686
+ };
687
+ }
688
+ function principalCoords(points, axes, scale = 1) {
689
+ const { centroid: c, major, minor } = axes;
690
+ return points.map(([x, y]) => {
691
+ const dx = x - c[0];
692
+ const dy = y - c[1];
693
+ return [
694
+ (dx * major[0] + dy * major[1]) * scale,
695
+ (dx * minor[0] + dy * minor[1]) * scale
696
+ ];
697
+ });
698
+ }
699
+ function orientPrincipalAxes(points, axes) {
700
+ const u = principalCoords(points, axes).map(([uu]) => uu);
701
+ if (skewness(u) <= 0) {
702
+ return axes;
687
703
  }
688
- return candidate;
704
+ const major = vectorScale(axes.major, -1);
705
+ return { ...axes, major, minor: vectorNormal(major) };
689
706
  }
690
- function lineSegmentsDistance(s1, s2) {
691
- if (lineSegmentIntersectionPoints(s1, s2)) {
692
- return 0;
707
+ function elongation(axes) {
708
+ return axes.majorVariance > 0 ? axes.minorVariance / axes.majorVariance : 1;
709
+ }
710
+ function standardizedMoment(values, order) {
711
+ const n = values.length;
712
+ let mean = 0;
713
+ for (const v of values) {
714
+ mean += v;
693
715
  }
694
- return Math.min(
695
- distanceToLineSegment(s1[0], s2),
696
- distanceToLineSegment(s1[1], s2),
697
- distanceToLineSegment(s2[0], s1),
698
- distanceToLineSegment(s2[1], s1)
699
- );
716
+ mean /= n;
717
+ let variance = 0;
718
+ let moment = 0;
719
+ for (const v of values) {
720
+ const d = v - mean;
721
+ variance += d * d;
722
+ moment += d ** order;
723
+ }
724
+ variance /= n;
725
+ moment /= n;
726
+ const sigma = Math.sqrt(variance);
727
+ return sigma > Number.EPSILON ? moment / sigma ** order : 0;
728
+ }
729
+ function skewness(values) {
730
+ return standardizedMoment(values, 3);
731
+ }
732
+ function kurtosis(values) {
733
+ return standardizedMoment(values, 4);
700
734
  }
701
735
 
702
736
  // src/polygon.ts
@@ -742,21 +776,84 @@ var polygonIncludesPointNonZero = (point, polygon2) => {
742
776
  }
743
777
  return windingNumber !== 0;
744
778
  };
745
- var pointOnPolygon = (p, poly, threshold = PRECISION) => {
746
- let on = false;
747
- for (let i = 0, l = poly.length - 1; i < l; i++) {
748
- if (pointOnLineSegment(p, lineSegment(poly[i], poly[i + 1]), threshold)) {
749
- on = true;
750
- break;
751
- }
752
- }
753
- return on;
754
- };
755
779
  function polygonClose(polygon2) {
756
780
  return polygonIsClosed(polygon2) ? polygon2 : [...polygon2, polygon2[0]];
757
781
  }
758
- function polygonIsClosed(polygon2) {
759
- return pointsEqual(polygon2[0], polygon2[polygon2.length - 1]);
782
+ function polygonIsClosed(polygon2, tolerance = PRECISION) {
783
+ return pointsEqual(polygon2[0], polygon2[polygon2.length - 1], tolerance);
784
+ }
785
+ function polygonSignedArea(polygon2, tolerance = PRECISION) {
786
+ const pts = polygonIsClosed(polygon2, tolerance) ? polygon2.slice(0, -1) : polygon2;
787
+ let sum = 0;
788
+ for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {
789
+ sum += pts[j][0] * pts[i][1] - pts[i][0] * pts[j][1];
790
+ }
791
+ return sum / 2;
792
+ }
793
+ function polygonArea(polygon2, tolerance = PRECISION) {
794
+ return Math.abs(polygonSignedArea(polygon2, tolerance));
795
+ }
796
+ function convexHull(points) {
797
+ if (points.length < 3) {
798
+ return [...points];
799
+ }
800
+ const sorted = [...points].sort(
801
+ (a, b) => a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]
802
+ );
803
+ const cross = (o, a, b) => (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
804
+ const half = (pts) => {
805
+ const chain = [];
806
+ for (const p of pts) {
807
+ while (chain.length >= 2 && cross(chain[chain.length - 2], chain[chain.length - 1], p) <= 0) {
808
+ chain.pop();
809
+ }
810
+ chain.push(p);
811
+ }
812
+ chain.pop();
813
+ return chain;
814
+ };
815
+ const hull = [...half(sorted), ...half([...sorted].reverse())];
816
+ return hull.length >= 3 ? hull : [...points];
817
+ }
818
+ function simplifyConvexPolygon(polygon2, angleThreshold) {
819
+ if (polygon2.length < 3) {
820
+ return [...polygon2];
821
+ }
822
+ const turnAt = (i) => {
823
+ const prev = polygon2[(i - 1 + polygon2.length) % polygon2.length];
824
+ const curr = polygon2[i];
825
+ const next = polygon2[(i + 1) % polygon2.length];
826
+ const inAngle = Math.atan2(curr[1] - prev[1], curr[0] - prev[0]);
827
+ const outAngle = Math.atan2(next[1] - curr[1], next[0] - curr[0]);
828
+ return Math.abs(normalizeTurn(outAngle - inAngle));
829
+ };
830
+ let start = 0;
831
+ for (let i = 1; i < polygon2.length; i++) {
832
+ if (turnAt(i) > turnAt(start)) {
833
+ start = i;
834
+ }
835
+ }
836
+ const simplified = [];
837
+ let accumulated = 0;
838
+ for (let k = 0; k < polygon2.length; k++) {
839
+ const i = (start + k) % polygon2.length;
840
+ accumulated += turnAt(i);
841
+ if (accumulated >= angleThreshold) {
842
+ simplified.push(polygon2[i]);
843
+ accumulated = 0;
844
+ }
845
+ }
846
+ return simplified.length >= 3 ? simplified : [...polygon2];
847
+ }
848
+ function normalizeTurn(angle) {
849
+ let a = angle;
850
+ while (a > Math.PI) {
851
+ a -= 2 * Math.PI;
852
+ }
853
+ while (a < -Math.PI) {
854
+ a += 2 * Math.PI;
855
+ }
856
+ return a;
760
857
  }
761
858
 
762
859
  // src/range.ts
@@ -788,6 +885,91 @@ var rangeIncludesValue = (value, [min, max]) => {
788
885
  return value >= min && value <= max;
789
886
  };
790
887
 
888
+ // src/segment.ts
889
+ function lineSegment(a, b) {
890
+ return [a, b];
891
+ }
892
+ var isLineSegment = (segment) => Array.isArray(segment) && segment.length === 2 && isPoint(segment[0]) && isPoint(segment[1]);
893
+ var lineSegmentRotate = (l, angle, origin) => {
894
+ return lineSegment(
895
+ pointRotateRads(l[0], origin || pointCenter(l[0], l[1]), angle),
896
+ pointRotateRads(l[1], origin || pointCenter(l[0], l[1]), angle)
897
+ );
898
+ };
899
+ var segmentsIntersectAt = (a, b) => {
900
+ const a0 = vectorFromPoint(a[0]);
901
+ const a1 = vectorFromPoint(a[1]);
902
+ const b0 = vectorFromPoint(b[0]);
903
+ const b1 = vectorFromPoint(b[1]);
904
+ const r = vectorSubtract(a1, a0);
905
+ const s = vectorSubtract(b1, b0);
906
+ const denominator = vectorCross(r, s);
907
+ if (denominator === 0) {
908
+ return null;
909
+ }
910
+ const i = vectorSubtract(vectorFromPoint(b[0]), vectorFromPoint(a[0]));
911
+ const u = vectorCross(i, r) / denominator;
912
+ const t = vectorCross(i, s) / denominator;
913
+ if (u === 0) {
914
+ return null;
915
+ }
916
+ const p = vectorAdd(a0, vectorScale(r, t));
917
+ if (t >= 0 && t < 1 && u >= 0 && u < 1) {
918
+ return pointFromVector(p);
919
+ }
920
+ return null;
921
+ };
922
+ var pointOnLineSegment = (point, line2, threshold = PRECISION) => {
923
+ const distance = distanceToLineSegment(point, line2);
924
+ if (distance === 0) {
925
+ return true;
926
+ }
927
+ return distance < threshold;
928
+ };
929
+ var distanceToLineSegment = (point, line2) => {
930
+ return pointDistance(
931
+ point,
932
+ lineSegmentPointAt(line2, lineSegmentClosestParameter(point, line2))
933
+ );
934
+ };
935
+ function lineSegmentPointAt(line2, t) {
936
+ const [[x1, y1], [x2, y2]] = line2;
937
+ return pointFrom(x1 + t * (x2 - x1), y1 + t * (y2 - y1));
938
+ }
939
+ function lineSegmentIntersectionPoints(l, s, threshold) {
940
+ const candidate = linesIntersectAt(line(l[0], l[1]), line(s[0], s[1]));
941
+ if (!candidate || !pointOnLineSegment(candidate, s, threshold) || !pointOnLineSegment(candidate, l, threshold)) {
942
+ return null;
943
+ }
944
+ return candidate;
945
+ }
946
+ function lineSegmentsDistance(s1, s2) {
947
+ if (lineSegmentIntersectionPoints(s1, s2)) {
948
+ return 0;
949
+ }
950
+ return Math.min(
951
+ distanceToLineSegment(s1[0], s2),
952
+ distanceToLineSegment(s1[1], s2),
953
+ distanceToLineSegment(s2[0], s1),
954
+ distanceToLineSegment(s2[1], s1)
955
+ );
956
+ }
957
+ function lineSegmentClosestParameter(point, line2) {
958
+ const [x, y] = point;
959
+ const [[x1, y1], [x2, y2]] = line2;
960
+ const A = x - x1;
961
+ const B = y - y1;
962
+ const C = x2 - x1;
963
+ const D = y2 - y1;
964
+ const dot = A * C + B * D;
965
+ const len_sq = C * C + D * D;
966
+ let param = 0;
967
+ if (len_sq !== 0) {
968
+ param = dot / len_sq;
969
+ }
970
+ return Math.max(0, Math.min(1, param));
971
+ }
972
+
791
973
  // src/rectangle.ts
792
974
  function rectangle(topLeft, bottomRight) {
793
975
  return [topLeft, bottomRight];
@@ -824,10 +1006,13 @@ export {
824
1006
  average,
825
1007
  bezierEquation,
826
1008
  cartesian2Polar,
1009
+ centroid,
827
1010
  clamp,
1011
+ convexHull,
828
1012
  curve,
829
1013
  curveCatmullRomCubicApproxPoints,
830
1014
  curveCatmullRomQuadraticApproxPoints,
1015
+ curveClosestParameter,
831
1016
  curveClosestPoint,
832
1017
  curveIntersectLineSegment,
833
1018
  curveLength,
@@ -844,6 +1029,7 @@ export {
844
1029
  ellipseLineIntersectionPoints,
845
1030
  ellipseSegmentInterceptPoints,
846
1031
  ellipseTouchesPoint,
1032
+ elongation,
847
1033
  isCloseTo,
848
1034
  isCurve,
849
1035
  isFiniteNumber,
@@ -851,15 +1037,20 @@ export {
851
1037
  isPoint,
852
1038
  isPointWithinBounds,
853
1039
  isRightAngleRads,
1040
+ isValidPoint,
854
1041
  isVector,
1042
+ kurtosis,
855
1043
  line,
856
1044
  lineSegment,
1045
+ lineSegmentClosestParameter,
857
1046
  lineSegmentIntersectionPoints,
1047
+ lineSegmentPointAt,
858
1048
  lineSegmentRotate,
859
1049
  lineSegmentsDistance,
860
1050
  linesIntersectAt,
861
1051
  normalizeRadians,
862
1052
  offsetPointsForQuadraticBezier,
1053
+ orientPrincipalAxes,
863
1054
  pointCenter,
864
1055
  pointDistance,
865
1056
  pointDistanceSq,
@@ -868,16 +1059,20 @@ export {
868
1059
  pointFromPair,
869
1060
  pointFromVector,
870
1061
  pointOnLineSegment,
871
- pointOnPolygon,
872
1062
  pointRotateDegs,
873
1063
  pointRotateRads,
874
1064
  pointScaleFromOrigin,
875
1065
  pointTranslate,
876
1066
  pointsEqual,
877
1067
  polygon,
1068
+ polygonArea,
878
1069
  polygonFromPoints,
879
1070
  polygonIncludesPoint,
880
1071
  polygonIncludesPointNonZero,
1072
+ polygonIsClosed,
1073
+ polygonSignedArea,
1074
+ principalAxes,
1075
+ principalCoords,
881
1076
  radiansBetweenAngles,
882
1077
  radiansDifference,
883
1078
  radiansToDegrees,
@@ -893,6 +1088,9 @@ export {
893
1088
  round,
894
1089
  roundToStep,
895
1090
  segmentsIntersectAt,
1091
+ simplifyConvexPolygon,
1092
+ skewness,
1093
+ standardizedMoment,
896
1094
  triangleIncludesPoint,
897
1095
  vector,
898
1096
  vectorAdd,