@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.
- package/dist/dev/index.js +313 -115
- package/dist/dev/index.js.map +4 -4
- package/dist/prod/index.js +1 -1
- package/dist/types/common/src/colors.d.ts +23 -1
- package/dist/types/common/src/constants.d.ts +66 -7
- package/dist/types/common/src/keys.d.ts +4 -0
- package/dist/types/common/src/points.d.ts +1 -1
- package/dist/types/common/src/random.d.ts +7 -0
- package/dist/types/common/src/utils.d.ts +6 -43
- package/dist/types/element/src/Scene.d.ts +7 -5
- package/dist/types/element/src/align.d.ts +2 -2
- package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
- package/dist/types/element/src/arrows/focus.d.ts +5 -2
- package/dist/types/element/src/binding.d.ts +28 -13
- package/dist/types/element/src/bounds.d.ts +22 -7
- package/dist/types/element/src/bucketFill.d.ts +110 -0
- package/dist/types/element/src/collision.d.ts +14 -5
- package/dist/types/element/src/comparisons.d.ts +8 -5
- package/dist/types/element/src/convertToShape.d.ts +23 -0
- package/dist/types/element/src/delta.d.ts +23 -1
- package/dist/types/element/src/distribute.d.ts +2 -2
- package/dist/types/element/src/dragElements.d.ts +27 -0
- package/dist/types/element/src/duplicate.d.ts +64 -3
- package/dist/types/element/src/embeddable.d.ts +2 -2
- package/dist/types/element/src/flowchart.d.ts +11 -7
- package/dist/types/element/src/fractionalIndex.d.ts +2 -2
- package/dist/types/element/src/frame.d.ts +11 -10
- package/dist/types/element/src/groups.d.ts +9 -9
- package/dist/types/element/src/index.d.ts +6 -1
- package/dist/types/element/src/linearElementEditor.d.ts +27 -10
- package/dist/types/element/src/listMarker.d.ts +34 -0
- package/dist/types/element/src/mutateElement.d.ts +1 -1
- package/dist/types/element/src/newElement.d.ts +53 -3
- package/dist/types/element/src/renderElement.d.ts +21 -7
- package/dist/types/element/src/resizeElements.d.ts +2 -2
- package/dist/types/element/src/selection.d.ts +6 -6
- package/dist/types/element/src/shape.d.ts +27 -1
- package/dist/types/element/src/sizeHelpers.d.ts +6 -0
- package/dist/types/element/src/sortElements.d.ts +10 -0
- package/dist/types/element/src/stickyNote.d.ts +183 -0
- package/dist/types/element/src/textElement.d.ts +20 -9
- package/dist/types/element/src/transform.d.ts +26 -7
- package/dist/types/element/src/typeChecks.d.ts +29 -27
- package/dist/types/element/src/types.d.ts +43 -7
- package/dist/types/element/src/utils.d.ts +15 -4
- package/dist/types/element/src/zindex.d.ts +2 -2
- package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +87 -18
- package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
- package/dist/types/excalidraw/actions/actionBoundText.d.ts +58 -12
- package/dist/types/excalidraw/actions/actionCanvas.d.ts +265 -940
- package/dist/types/excalidraw/actions/actionClipboard.d.ts +58 -12
- package/dist/types/excalidraw/actions/actionCropEditor.d.ts +29 -6
- package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +89 -19
- package/dist/types/excalidraw/actions/actionDeselect.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -3
- package/dist/types/excalidraw/actions/actionElementLink.d.ts +29 -6
- package/dist/types/excalidraw/actions/actionElementLock.d.ts +59 -13
- package/dist/types/excalidraw/actions/actionExport.d.ts +60 -14
- package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
- package/dist/types/excalidraw/actions/actionFrame.d.ts +150 -203
- package/dist/types/excalidraw/actions/actionGroup.d.ts +73 -27
- package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +84 -9
- package/dist/types/excalidraw/actions/actionLink.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionMenu.d.ts +29 -6
- package/dist/types/excalidraw/actions/actionProperties.d.ts +96 -34
- package/dist/types/excalidraw/actions/actionSelectAll.d.ts +34 -11
- package/dist/types/excalidraw/actions/actionStyles.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +1 -1
- package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +33 -11
- package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +33 -11
- package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
- package/dist/types/excalidraw/actions/{actionEmbeddable.d.ts → actionToggleShowHints.d.ts} +45 -19
- package/dist/types/excalidraw/actions/actionToggleStats.d.ts +30 -7
- package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +31 -8
- package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +30 -7
- package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
- package/dist/types/excalidraw/actions/index.d.ts +2 -2
- package/dist/types/excalidraw/actions/manager.d.ts +1 -0
- package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
- package/dist/types/excalidraw/actions/types.d.ts +8 -4
- package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
- package/dist/types/excalidraw/appState.d.ts +30 -6
- package/dist/types/excalidraw/components/Actions.d.ts +17 -12
- package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
- package/dist/types/excalidraw/components/App.arrowText.d.ts +70 -0
- package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
- package/dist/types/excalidraw/components/App.clipboard.d.ts +31 -0
- package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
- package/dist/types/excalidraw/components/App.d.ts +301 -93
- package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
- package/dist/types/excalidraw/components/App.duplicate.d.ts +101 -0
- package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
- package/dist/types/excalidraw/components/App.pan.d.ts +62 -0
- package/dist/types/excalidraw/components/App.text.d.ts +146 -0
- package/dist/types/excalidraw/components/App.textTool.d.ts +140 -0
- package/dist/types/excalidraw/components/App.toolDrag.d.ts +63 -0
- package/dist/types/excalidraw/components/App.viewport.d.ts +113 -0
- package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
- package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -3
- package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
- package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +5 -1
- package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +9 -2
- package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
- package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
- package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
- package/dist/types/excalidraw/components/ColorPicker/colorTopPicksDnD.d.ts +11 -0
- package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -1
- package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
- package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -2
- package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
- package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -1
- package/dist/types/excalidraw/components/FileDropOverlay.d.ts +2 -0
- package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +4 -1
- package/dist/types/excalidraw/components/FontPicker/FontPickerList.d.ts +6 -1
- package/dist/types/excalidraw/components/FontPicker/fontTopPicksDnD.d.ts +12 -0
- package/dist/types/excalidraw/components/IconButton.d.ts +48 -0
- package/dist/types/excalidraw/components/Island.d.ts +7 -0
- package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
- package/dist/types/excalidraw/components/LayerUI.d.ts +5 -2
- package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
- package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +6 -2
- package/dist/types/excalidraw/components/LibraryUnit.d.ts +7 -2
- package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
- package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
- package/dist/types/excalidraw/components/MobileMenu.d.ts +4 -4
- package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
- package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
- package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
- package/dist/types/excalidraw/components/Popover.d.ts +1 -3
- package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
- package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
- package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
- package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
- package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
- package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
- package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
- package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +4 -4
- package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +3 -3
- package/dist/types/excalidraw/components/ToolPopover.d.ts +3 -6
- package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
- package/dist/types/excalidraw/components/Tools.d.ts +151 -0
- package/dist/types/excalidraw/components/Tooltip.d.ts +15 -1
- package/dist/types/excalidraw/components/TopPicksDnD/TopPicksContextMenu.d.ts +14 -0
- package/dist/types/excalidraw/components/TopPicksDnD/TopPicksTip.d.ts +11 -0
- package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +58 -0
- package/dist/types/excalidraw/components/UserList.d.ts +3 -2
- package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
- package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -1
- package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +3 -0
- package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
- package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -1
- package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
- package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -2
- package/dist/types/excalidraw/components/icons.d.ts +7 -1
- package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +10 -4
- package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
- package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
- package/dist/types/excalidraw/data/blob.d.ts +62 -16
- package/dist/types/excalidraw/data/index.d.ts +4 -4
- package/dist/types/excalidraw/data/json.d.ts +37 -14
- package/dist/types/excalidraw/data/library.d.ts +1 -1
- package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
- package/dist/types/excalidraw/eraser/index.d.ts +2 -3
- package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
- package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
- package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
- package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
- package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
- package/dist/types/excalidraw/lasso/index.d.ts +2 -3
- package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
- package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
- package/dist/types/excalidraw/renderer/animation.d.ts +5 -1
- package/dist/types/excalidraw/renderer/helpers.d.ts +25 -0
- package/dist/types/excalidraw/renderer/interactiveScene.d.ts +2 -4
- package/dist/types/excalidraw/scene/Renderer.d.ts +489 -20
- package/dist/types/excalidraw/scene/export.d.ts +3 -3
- package/dist/types/excalidraw/scene/index.d.ts +2 -2
- package/dist/types/excalidraw/scene/types.d.ts +7 -4
- package/dist/types/excalidraw/snapping.d.ts +7 -7
- package/dist/types/excalidraw/types.d.ts +531 -29
- package/dist/types/excalidraw/viewport.d.ts +302 -0
- package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +13 -3
- package/dist/types/fractional-indexing/src/index.d.ts +29 -0
- package/dist/types/laser-pointer/src/index.d.ts +2 -0
- package/dist/types/laser-pointer/src/math.d.ts +16 -0
- package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
- package/dist/types/laser-pointer/src/state.d.ts +36 -0
- package/dist/types/math/src/constants.d.ts +0 -1
- package/dist/types/math/src/curve.d.ts +23 -13
- package/dist/types/math/src/index.d.ts +1 -0
- package/dist/types/math/src/pca.d.ts +79 -0
- package/dist/types/math/src/point.d.ts +1 -0
- package/dist/types/math/src/polygon.d.ts +25 -1
- package/dist/types/math/src/segment.d.ts +6 -0
- package/dist/types/utils/src/export.d.ts +4 -3
- package/dist/types/utils/src/index.d.ts +1 -2
- package/dist/types/utils/src/shape.d.ts +2 -2
- package/package.json +2 -2
- package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
- package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
- package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
- package/dist/types/excalidraw/components/MobileToolBar.d.ts +0 -10
- package/dist/types/excalidraw/components/ToolButton.d.ts +0 -49
- package/dist/types/excalidraw/components/shapes.d.ts +0 -263
- package/dist/types/excalidraw/cursor.d.ts +0 -5
- package/dist/types/excalidraw/scene/scroll.d.ts +0 -18
- package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
- package/dist/types/utils/src/bbox.d.ts +0 -9
- 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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
342
|
+
const param = localMinimum(
|
|
315
343
|
t0,
|
|
316
344
|
t1,
|
|
317
345
|
(t) => pointDistance(p, bezierEquation(c, t))
|
|
318
346
|
);
|
|
319
|
-
|
|
320
|
-
return null;
|
|
321
|
-
}
|
|
322
|
-
return bezierEquation(c, solution);
|
|
347
|
+
return param ?? closestStep / maxSteps;
|
|
323
348
|
}
|
|
324
|
-
function
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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 *
|
|
526
|
-
b * ty *
|
|
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/
|
|
614
|
-
function
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
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
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
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
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
const [
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
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
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
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
|
-
|
|
677
|
-
yy = y1 + param * D;
|
|
678
|
+
major = m20 >= m02 ? vector(1, 0) : vector(0, 1);
|
|
678
679
|
}
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
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
|
-
|
|
704
|
+
const major = vectorScale(axes.major, -1);
|
|
705
|
+
return { ...axes, major, minor: vectorNormal(major) };
|
|
689
706
|
}
|
|
690
|
-
function
|
|
691
|
-
|
|
692
|
-
|
|
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
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
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,
|