mirror of
https://github.com/excalidraw/excalidraw.git
synced 2024-11-10 11:35:52 +01:00
bbdcd30a73
* new collision api * isPointOnShape * removed redundant code * new collision methods in app * curve shape takes starting point * clean up geometry * curve rotation * freedraw * inside curve * improve ellipse inside check * ellipse distance func * curve inside * include frame name bounds * replace previous private methods for getting elements at x,y * arrow bound text hit detection * keep iframes on top * remove dependence on old collision methods from app * remove old collision functions * move some hit functions outside of app * code refactor * type * text collision from inside * fix context menu test * highest z-index collision * fix 1px away binding test * strictly less * remove unused imports * lint * 'ignore' resize flipping test * more lint fix * skip 'flips while resizing' test * more test * fix merge errors * fix selection in resize test * added a bit more comment --------- Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
import { Point, Polygon, GeometricShape } from "./geometry/shape";
|
|
import {
|
|
pointInEllipse,
|
|
pointInPolygon,
|
|
pointOnCurve,
|
|
pointOnEllipse,
|
|
pointOnLine,
|
|
pointOnPolycurve,
|
|
pointOnPolygon,
|
|
pointOnPolyline,
|
|
close,
|
|
} from "./geometry/geometry";
|
|
|
|
// check if the given point is considered on the given shape's border
|
|
export const isPointOnShape = (
|
|
point: Point,
|
|
shape: GeometricShape,
|
|
tolerance = 0,
|
|
) => {
|
|
// get the distance from the given point to the given element
|
|
// check if the distance is within the given epsilon range
|
|
switch (shape.type) {
|
|
case "polygon":
|
|
return pointOnPolygon(point, shape.data, tolerance);
|
|
case "ellipse":
|
|
return pointOnEllipse(point, shape.data, tolerance);
|
|
case "line":
|
|
return pointOnLine(point, shape.data, tolerance);
|
|
case "polyline":
|
|
return pointOnPolyline(point, shape.data, tolerance);
|
|
case "curve":
|
|
return pointOnCurve(point, shape.data, tolerance);
|
|
case "polycurve":
|
|
return pointOnPolycurve(point, shape.data, tolerance);
|
|
default:
|
|
throw Error(`shape ${shape} is not implemented`);
|
|
}
|
|
};
|
|
|
|
// check if the given point is considered inside the element's border
|
|
export const isPointInShape = (point: Point, shape: GeometricShape) => {
|
|
switch (shape.type) {
|
|
case "polygon":
|
|
return pointInPolygon(point, shape.data);
|
|
case "line":
|
|
return false;
|
|
case "curve":
|
|
return false;
|
|
case "ellipse":
|
|
return pointInEllipse(point, shape.data);
|
|
case "polyline": {
|
|
const polygon = close(shape.data.flat()) as Polygon;
|
|
return pointInPolygon(point, polygon);
|
|
}
|
|
case "polycurve": {
|
|
return false;
|
|
}
|
|
default:
|
|
throw Error(`shape ${shape} is not implemented`);
|
|
}
|
|
};
|
|
|
|
// check if the given element is in the given bounds
|
|
export const isPointInBounds = (point: Point, bounds: Polygon) => {
|
|
return pointInPolygon(point, bounds);
|
|
};
|