@deepnest/geometryutil
Version:
This tool is used within Applications provides by [www.deepnest.net](https://www.deepnest.net/).
137 lines (136 loc) • 4.71 kB
TypeScript
/*!
* General purpose geometry functions for polygon/Bezier calculations
* Copyright 2015 Jack Qiao
* Converted to TypeScript by Josef Fröhle, 2024
* Licensed under the MIT license
*/
interface Point {
x: number;
y: number;
marked?: boolean;
}
interface Polygon extends Array<Point> {
offsetx?: number;
offsety?: number;
x?: number;
y?: number;
width?: number;
height?: number;
}
declare function _almostEqual(a: number, b: number, tolerance?: number): boolean;
declare function _withinDistance(p1: Point, p2: Point, distance: number): boolean;
declare function _lineIntersect(A: Point, B: Point, E: Point, F: Point, infinite?: boolean): {
x: number;
y: number;
} | null;
export declare const GeometryUtil: {
withinDistance: typeof _withinDistance;
lineIntersect: typeof _lineIntersect;
almostEqual: typeof _almostEqual;
almostEqualPoints: (a: Point, b: Point, tolerance?: number) => boolean;
QuadraticBezier: {
isFlat: (p1: Point, p2: Point, c1: Point, tol: number) => boolean;
linearize: (p1: Point, p2: Point, c1: Point, tol: number) => Point[];
subdivide: (p1: Point, p2: Point, c1: Point, t: number) => {
p1: Point;
p2: Point;
c1: Point;
}[];
};
CubicBezier: {
isFlat: (p1: Point, p2: Point, c1: Point, c2: Point, tol: number) => boolean;
linearize: (p1: Point, p2: Point, c1: Point, c2: Point, tol: number) => Point[];
subdivide: (p1: Point, p2: Point, c1: Point, c2: Point, t: number) => ({
p1: Point;
p2: {
x: number;
y: number;
};
c1: {
x: number;
y: number;
};
c2: {
x: number;
y: number;
};
} | {
p1: {
x: number;
y: number;
};
p2: Point;
c1: {
x: number;
y: number;
};
c2: {
x: number;
y: number;
};
})[];
};
Arc: {
linearize: (p1: Point, p2: Point, rx: number, ry: number, angle: number, largearc: number, sweep: number, tol: number) => Point[];
centerToSvg: (center: Point, rx: number, ry: number, theta1: number, extent: number, angleDegrees: number) => {
p1: {
x: number;
y: number;
};
p2: {
x: number;
y: number;
};
rx: number;
ry: number;
angle: number;
largearc: number;
sweep: number;
};
svgToCenter: (p1: Point, p2: Point, rx: number, ry: number, angleDegrees: number, largearc: number, sweep: number) => {
center: {
x: number;
y: number;
};
rx: number;
ry: number;
theta: number;
extent: number;
angle: number;
};
};
getPolygonBounds: (polygon: Polygon) => {
x: number;
y: number;
width: number;
height: number;
} | null;
pointInPolygon: (point: Point, polygon: Polygon, tolerance?: number) => boolean | null;
polygonArea: (polygon: Polygon) => number;
intersect: (A: Polygon, B: Polygon) => boolean;
polygonEdge: (polygon: Polygon, normal: Point) => Point[] | null;
pointLineDistance: (p: Point, s1: Point, s2: Point, normal: Point, s1inclusive: boolean, s2inclusive: boolean) => number | null;
pointDistance: (p: Point, s1: Point, s2: Point, normal: Point, infinite?: boolean) => number | null;
segmentDistance: (A: Point, B: Point, E: Point, F: Point, direction: Point) => number | null;
polygonSlideDistance: (A: Polygon, B: Polygon, direction: Point, ignoreNegative: boolean) => number | null;
polygonProjectionDistance: (A: Polygon, B: Polygon, direction: Point) => number | null;
searchStartPoint: (A: Polygon, B: Polygon, inside: boolean, NFP?: Polygon[]) => {
x: number;
y: number;
} | null;
isRectangle: (poly: Polygon, tolerance?: number) => boolean;
noFitPolygonRectangle: (A: Polygon, B: Polygon) => {
x: number;
y: number;
}[][] | null;
noFitPolygon: (A: Polygon, B: Polygon, inside: boolean, searchEdges: boolean) => {
x: number;
y: number;
}[][] | null;
polygonHull: (A: Polygon, B: Polygon) => {
x: number;
y: number;
}[] | null;
rotatePolygon: (polygon: Polygon, angle: number) => Polygon;
};
export {};