2023-04-25 11:01:25 +00:00
|
|
|
## API Report File for "@tldraw/primitives"
|
|
|
|
|
|
|
|
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
|
|
import { Box2dModel } from '@tldraw/tlschema';
|
|
|
|
import { Vec2dModel } from '@tldraw/tlschema';
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function angleDelta(a0: number, a1: number): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function approximately(a: number, b: number, precision?: number): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function areAnglesCompatible(a: number, b: number): boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export class Box2d {
|
|
|
|
constructor(x?: number, y?: number, w?: number, h?: number);
|
|
|
|
// (undocumented)
|
|
|
|
get aspectRatio(): number;
|
|
|
|
// (undocumented)
|
|
|
|
get center(): Vec2d;
|
|
|
|
set center(v: Vec2d);
|
|
|
|
// (undocumented)
|
|
|
|
clone(): Box2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Collides: (A: Box2d, B: Box2d) => boolean;
|
|
|
|
// (undocumented)
|
|
|
|
collides(B: Box2d): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
static Common: (boxes: Box2d[]) => Box2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Contains: (A: Box2d, B: Box2d) => boolean;
|
|
|
|
// (undocumented)
|
|
|
|
contains(B: Box2d): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
static ContainsPoint: (A: Box2d, B: number | VecLike, y?: number) => boolean;
|
|
|
|
// (undocumented)
|
|
|
|
containsPoint(V: number | VecLike, y?: number): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
get corners(): Vec2d[];
|
|
|
|
// (undocumented)
|
|
|
|
static Equals(a: Box2d | Box2dModel, b: Box2d | Box2dModel): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
equals(other: Box2d | Box2dModel): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
static Expand(A: Box2d, B: Box2d): Box2d;
|
|
|
|
// (undocumented)
|
|
|
|
expand(A: Box2d): this;
|
|
|
|
// (undocumented)
|
|
|
|
static ExpandBy(A: Box2d, n: number): Box2d;
|
|
|
|
// (undocumented)
|
|
|
|
expandBy(n: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static From(box: Box2dModel): Box2d;
|
|
|
|
// (undocumented)
|
|
|
|
static FromPoints(points: VecLike[]): Box2d;
|
|
|
|
// (undocumented)
|
|
|
|
getHandlePoint(handle: SelectionCorner | SelectionEdge): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
h: number;
|
|
|
|
// (undocumented)
|
|
|
|
get height(): number;
|
|
|
|
set height(n: number);
|
|
|
|
// (undocumented)
|
|
|
|
static Includes: (A: Box2d, B: Box2d) => boolean;
|
|
|
|
// (undocumented)
|
|
|
|
includes(B: Box2d): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
get maxX(): number;
|
|
|
|
// (undocumented)
|
|
|
|
get maxY(): number;
|
|
|
|
// (undocumented)
|
|
|
|
get midX(): number;
|
|
|
|
// (undocumented)
|
|
|
|
get midY(): number;
|
|
|
|
// (undocumented)
|
|
|
|
get minX(): number;
|
|
|
|
set minX(n: number);
|
|
|
|
// (undocumented)
|
|
|
|
get minY(): number;
|
|
|
|
set minY(n: number);
|
|
|
|
// (undocumented)
|
|
|
|
get point(): Vec2d;
|
|
|
|
set point(val: Vec2d);
|
|
|
|
// (undocumented)
|
|
|
|
static Resize(box: Box2d, handle: SelectionCorner | SelectionEdge | string, dx: number, dy: number, isAspectRatioLocked?: boolean): {
|
|
|
|
box: Box2d;
|
|
|
|
scaleX: number;
|
|
|
|
scaleY: number;
|
|
|
|
};
|
|
|
|
// (undocumented)
|
|
|
|
resize(handle: SelectionCorner | SelectionEdge | string, dx: number, dy: number): void;
|
|
|
|
// (undocumented)
|
|
|
|
scale(n: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
set(x?: number, y?: number, w?: number, h?: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
setTo(B: Box2d): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Sides: (A: Box2d, inset?: number) => Vec2d[][];
|
|
|
|
// (undocumented)
|
|
|
|
get sides(): Array<[Vec2d, Vec2d]>;
|
|
|
|
// (undocumented)
|
|
|
|
get size(): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
get snapPoints(): Vec2d[];
|
|
|
|
// (undocumented)
|
|
|
|
snapToGrid(size: number): void;
|
|
|
|
// (undocumented)
|
|
|
|
toFixed(): this;
|
|
|
|
// (undocumented)
|
|
|
|
toJson(): Box2dModel;
|
|
|
|
// (undocumented)
|
|
|
|
translate(delta: VecLike): this;
|
|
|
|
// (undocumented)
|
Measure individual words instead of just line breaks for text exports (#1397)
This diff fixes a number of issues with text export by completely
overhauling how we approach laying out text in exports.
Currently, we try to carefully replicate in-browser behaviour around
line breaks and whitespace collapsing. We do this using an iterative
algorithm that forces the browser to perform a layout for each word, and
attempting to re-implement how the browser does things like whitespace
collapsing & finding line break opportunities. Lots of export issues
come from the fact that this is almost impossible to do well (short of
sending a complete text layout algorithm & full unicode lookup tables).
Luckily, the browser already has a complete text layout algorithm and
full unicode lookup tables! In the new approach, we ask the browser to
lay the text out once. Then, we use the
[`Range`](https://developer.mozilla.org/en-US/docs/Web/API/Range) API to
loop over every character in the rendered text and measure its position.
These character positions are then grouped into "spans". A span is a
contiguous range of either whitespace or non-whitespace characters,
uninterrupted by any browser-inserting line breaks. When we come to
render the SVG, each span gets its own `<tspan>` element, absolutely
positioned according to where it ended up in the user's browser.
This fixes a bunch of issues:
**Misaligned text due to whitespace collapsing at line breaks**
![Kapture 2023-05-17 at 12 07
30](https://github.com/tldraw/tldraw/assets/1489520/5ab66fe0-6ceb-45bb-8787-90ccb124664a)
**Hyphenated text (or text with non-trivial/whitespace-based breaking
rules like Thai) not splitting correctly**
![Kapture 2023-05-17 at 12 21
40](https://github.com/tldraw/tldraw/assets/1489520/d2d5fd13-3e79-48c4-8e76-ae2c70a6471e)
**Weird alignment issues in note shapes**
![Kapture 2023-05-17 at 12 24
59](https://github.com/tldraw/tldraw/assets/1489520/a0e51d57-7c1c-490e-9952-b92417ffdf9e)
**Frame labels not respecting multiple spaces & not truncating
correctly**
![Kapture 2023-05-17 at 12 27
27](https://github.com/tldraw/tldraw/assets/1489520/39b2f53c-0180-460e-b10a-9fd955a6fa78)
#### Quick note on browser compatibility
This approach works well across all browsers, but in some cases actually
_increases_ x-browser variance. Consider these screenshots of the same
element (original above, export below):
![image](https://github.com/tldraw/tldraw/assets/1489520/5633b041-8cb3-4c92-bef6-4f3c202305de)
Notice how on chrome, the whitespace at the end of each line of
right-aligned text is preserved. On safari, it's collapsed. The safari
option looks better - so our manual line-breaking/white-space-collapsing
algorithm preferred safari's approach. That meant that in-app, this
shape looks very slightly different from browser to browser. But out of
the app, the exports would have been the same (although also note that
hyphenation is broken). Now, because these shapes look different across
browsers, the exports now look different across browsers too. We're
relying on the host-browsers text layout algorithm, which means we'll
faithfully reproduce any quirks/inconsistencies of that algorithm. I
think this is an acceptable tradeoff.
### Change Type
- [x] `patch` — Bug Fix
### Test Plan
* Comprehensive testing of text in exports, paying close attention to
details around white-space, line-breaking and alignment
* Consider setting `tldrawDebugSvg = true`
* Check text shapes, geo shapes with labels, arrow shapes with labels,
note shapes, frame labels
* Check different alignments and fonts (including vertical alignment)
### Release Notes
- Add a brief release note for your PR here.
2023-05-22 15:10:03 +00:00
|
|
|
union(box: Box2dModel): this;
|
|
|
|
// (undocumented)
|
2023-04-25 11:01:25 +00:00
|
|
|
w: number;
|
|
|
|
// (undocumented)
|
|
|
|
get width(): number;
|
|
|
|
set width(n: number);
|
|
|
|
// (undocumented)
|
|
|
|
x: number;
|
|
|
|
// (undocumented)
|
|
|
|
y: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function canolicalizeRotation(a: number): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function clamp(n: number, min: number): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function clamp(n: number, min: number, max: number): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function clampRadians(r: number): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export class CubicSegment2d extends BaseSegment2d<CubicSegment2dModel> {
|
|
|
|
// (undocumented)
|
|
|
|
[Symbol.iterator]: (this: InstanceType<typeof CubicSegment2d>) => Generator<VecLike, void, undefined>;
|
|
|
|
constructor(a: VecLike, b: VecLike, c: VecLike, d: VecLike, p?: number);
|
|
|
|
// (undocumented)
|
|
|
|
getPath(head?: boolean): string;
|
|
|
|
// (undocumented)
|
|
|
|
getPoint(t: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
getX(t: number): number;
|
|
|
|
// (undocumented)
|
|
|
|
getY(t: number): number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface CubicSegment2dModel {
|
|
|
|
// (undocumented)
|
|
|
|
a: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
b: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
c: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
d: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
p: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export class CubicSpline2d extends BaseSpline2d<CubicSegment2dModel> {
|
|
|
|
constructor(points: VecLike[], k?: number, p?: number);
|
|
|
|
// (undocumented)
|
|
|
|
static FromPoints(points: Vec2d[]): CubicSpline2d;
|
|
|
|
// (undocumented)
|
|
|
|
getSegmentsFromPoints(points: VecLike[], k?: number, p?: number): CubicSegment2d[];
|
|
|
|
// (undocumented)
|
|
|
|
segments: CubicSegment2d[];
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function decomposeMatrix2d(m: MatLike): {
|
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
scaleX: number;
|
|
|
|
scaleY: number;
|
|
|
|
rotation: number;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function degreesToRadians(d: number): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const EASINGS: {
|
|
|
|
readonly linear: (t: number) => number;
|
|
|
|
readonly easeInQuad: (t: number) => number;
|
|
|
|
readonly easeOutQuad: (t: number) => number;
|
|
|
|
readonly easeInOutQuad: (t: number) => number;
|
|
|
|
readonly easeInCubic: (t: number) => number;
|
|
|
|
readonly easeOutCubic: (t: number) => number;
|
|
|
|
readonly easeInOutCubic: (t: number) => number;
|
|
|
|
readonly easeInQuart: (t: number) => number;
|
|
|
|
readonly easeOutQuart: (t: number) => number;
|
|
|
|
readonly easeInOutQuart: (t: number) => number;
|
|
|
|
readonly easeInQuint: (t: number) => number;
|
|
|
|
readonly easeOutQuint: (t: number) => number;
|
|
|
|
readonly easeInOutQuint: (t: number) => number;
|
|
|
|
readonly easeInSine: (t: number) => number;
|
|
|
|
readonly easeOutSine: (t: number) => number;
|
|
|
|
readonly easeInOutSine: (t: number) => number;
|
|
|
|
readonly easeInExpo: (t: number) => number;
|
|
|
|
readonly easeOutExpo: (t: number) => number;
|
|
|
|
readonly easeInOutExpo: (t: number) => number;
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type EasingType = keyof typeof EASINGS;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const EPSILON: number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function flipSelectionHandleX(handle: SelectionHandle): "bottom_left" | "bottom_right" | "bottom" | "left" | "right" | "top_left" | "top_right" | "top";
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function flipSelectionHandleY(handle: SelectionHandle): "bottom_left" | "bottom_right" | "bottom" | "left" | "right" | "top_left" | "top_right" | "top";
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function getArcLength(C: VecLike, r: number, A: VecLike, B: VecLike): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getDrawLinePathData(id: string, outline: VecLike[], strokeWidth: number): string[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getHeight(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getMaxX(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getMaxY(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getMidX(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getMidY(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getMinX(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getMinY(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function getPointOnCircle(cx: number, cy: number, r: number, a: number): Vec2d;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getPolygonVertices(width: number, height: number, sides: number): Vec2d[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getRoundedInkyPolygonPath(points: VecLike[]): string;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getRoundedPolygonPoints(id: string, outline: VecLike[], offset: number, roundness: number, passes: number): VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export const getStarBounds: (sides: number, w: number, h: number) => Box2d;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function getStroke(points: VecLike[], options?: StrokeOptions): Vec2d[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function getStrokeOutlinePoints(strokePoints: StrokePoint[], options?: StrokeOptions): Vec2d[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function getStrokePoints(rawInputPoints: VecLike[], options?: StrokeOptions): StrokePoint[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function getSweep(C: VecLike, A: VecLike, B: VecLike): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function getWidth(pts: VecLike[]): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectCircleCircle(c1: VecLike, r1: number, c2: VecLike, r2: number): Vec2d[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectCirclePolygon(c: VecLike, r: number, points: VecLike[]): null | VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectCirclePolyline(c: VecLike, r: number, points: VecLike[]): null | VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectLineSegmentCircle(a1: VecLike, a2: VecLike, c: VecLike, r: number): null | VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectLineSegmentLineSegment(a1: VecLike, a2: VecLike, b1: VecLike, b2: VecLike): null | Vec2d;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectLineSegmentPolygon(a1: VecLike, a2: VecLike, points: VecLike[]): null | VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectLineSegmentPolyline(a1: VecLike, a2: VecLike, points: VecLike[]): null | VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectPolygonBounds(points: VecLike[], bounds: Box2d): null | VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function intersectPolygonPolygon(polygonA: VecLike[], polygonB: VecLike[]): null | VecLike[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function isAngleBetween(a: number, b: number, c: number): boolean;
|
|
|
|
|
2023-06-06 13:30:50 +00:00
|
|
|
// @public
|
|
|
|
export const isSafeFloat: (n: number) => boolean;
|
|
|
|
|
2023-04-25 11:01:25 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export function isSelectionCorner(selection: string): selection is SelectionCorner;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function lerpAngles(a0: number, a1: number, t: number): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export class LineSegment2d extends BaseSegment2d<LineSegment2dModel> {
|
|
|
|
constructor(a: VecLike, b: VecLike, p?: number);
|
|
|
|
// (undocumented)
|
|
|
|
a: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
static Angle(A: LineSegment2d): number;
|
|
|
|
// (undocumented)
|
|
|
|
get angle(): number;
|
|
|
|
// (undocumented)
|
|
|
|
b: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
get bounds(): Box2d;
|
|
|
|
getClosestPointTo(point: VecLike): {
|
|
|
|
point: Vec2d;
|
|
|
|
distance: number;
|
|
|
|
};
|
|
|
|
// (undocumented)
|
|
|
|
getNormal(): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
getPath(head?: boolean): string;
|
|
|
|
// (undocumented)
|
|
|
|
getPoint(t: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
getX(t: number): number;
|
|
|
|
// (undocumented)
|
|
|
|
getY(t: number): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Length(A: LineSegment2d): number;
|
|
|
|
// (undocumented)
|
|
|
|
get length(): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Tangent(A: LineSegment2d): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
get tangent(): Vec2d;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface LineSegment2dModel {
|
|
|
|
// (undocumented)
|
|
|
|
a: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
b: VecLike;
|
|
|
|
// (undocumented)
|
|
|
|
p: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function linesIntersect(A: VecLike, B: VecLike, C: VecLike, D: VecLike): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function longAngleDist(a0: number, a1: number): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type MatLike = Matrix2d | Matrix2dModel;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export class Matrix2d {
|
|
|
|
constructor(a: number, b: number, c: number, d: number, e: number, f: number);
|
|
|
|
// (undocumented)
|
|
|
|
a: number;
|
|
|
|
// (undocumented)
|
|
|
|
static Absolute(m: MatLike): Matrix2dModel;
|
|
|
|
// (undocumented)
|
|
|
|
static applyToBounds(m: MatLike, box: Box2d): Box2d;
|
|
|
|
// (undocumented)
|
|
|
|
applyToPoint(point: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static applyToPoint(m: MatLike, point: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
applyToPoints(points: VecLike[]): Vec2d[];
|
|
|
|
// (undocumented)
|
|
|
|
static applyToPoints(m: MatLike, points: VecLike[]): Vec2d[];
|
|
|
|
// (undocumented)
|
|
|
|
static applyToXY(m: MatLike, x: number, y: number): number[];
|
|
|
|
// (undocumented)
|
|
|
|
b: number;
|
|
|
|
// (undocumented)
|
|
|
|
c: number;
|
|
|
|
// (undocumented)
|
|
|
|
clone(): Matrix2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Compose(...matrices: MatLike[]): Matrix2d;
|
|
|
|
// (undocumented)
|
|
|
|
d: number;
|
|
|
|
// (undocumented)
|
|
|
|
static Decompose(m: MatLike): MatrixInfo;
|
|
|
|
// (undocumented)
|
|
|
|
decompose(): MatrixInfo;
|
|
|
|
// (undocumented)
|
|
|
|
decomposed(): MatrixInfo;
|
|
|
|
// (undocumented)
|
|
|
|
e: number;
|
|
|
|
// (undocumented)
|
|
|
|
equals(m: Matrix2d | Matrix2dModel): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
f: number;
|
|
|
|
// (undocumented)
|
|
|
|
static From(m: MatLike): Matrix2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Identity(): Matrix2d;
|
|
|
|
// (undocumented)
|
|
|
|
identity(): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Inverse(m: Matrix2dModel): Matrix2dModel;
|
|
|
|
// (undocumented)
|
|
|
|
invert(): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Multiply(m1: Matrix2dModel, m2: Matrix2dModel): Matrix2dModel;
|
|
|
|
// (undocumented)
|
|
|
|
multiply(m: Matrix2d | Matrix2dModel): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Rotate(r: number, cx?: number, cy?: number): Matrix2d;
|
|
|
|
// (undocumented)
|
|
|
|
rotate(r: number, cx?: number, cy?: number): Matrix2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Scale: {
|
|
|
|
(x: number, y: number): Matrix2dModel;
|
|
|
|
(x: number, y: number, cx: number, cy: number): Matrix2dModel;
|
|
|
|
};
|
|
|
|
// (undocumented)
|
|
|
|
scale(x: number, y: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
setTo(model: Matrix2dModel): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Smooth(m: MatLike, precision?: number): MatLike;
|
|
|
|
// (undocumented)
|
|
|
|
toCssString(): string;
|
|
|
|
// (undocumented)
|
|
|
|
static toCssString(m: MatLike): string;
|
|
|
|
// (undocumented)
|
|
|
|
static Translate(x: number, y: number): Matrix2d;
|
|
|
|
// (undocumented)
|
|
|
|
translate(x: number, y: number): Matrix2d;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface Matrix2dModel {
|
|
|
|
// (undocumented)
|
|
|
|
a: number;
|
|
|
|
// (undocumented)
|
|
|
|
b: number;
|
|
|
|
// (undocumented)
|
|
|
|
c: number;
|
|
|
|
// (undocumented)
|
|
|
|
d: number;
|
|
|
|
// (undocumented)
|
|
|
|
e: number;
|
|
|
|
// (undocumented)
|
|
|
|
f: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export interface MatrixInfo {
|
|
|
|
// (undocumented)
|
|
|
|
rotation: number;
|
|
|
|
// (undocumented)
|
|
|
|
scaleX: number;
|
|
|
|
// (undocumented)
|
|
|
|
scaleY: number;
|
|
|
|
// (undocumented)
|
|
|
|
x: number;
|
|
|
|
// (undocumented)
|
|
|
|
y: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function perimeterOfEllipse(rx: number, ry: number): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const PI: number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const PI2: number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointInBounds(A: VecLike, b: Box2d): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointInCircle(A: VecLike, C: VecLike, r: number): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointInEllipse(A: VecLike, C: VecLike, rx: number, ry: number, rotation?: number): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointInPolygon(A: VecLike, points: VecLike[]): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointInPolyline(A: VecLike, points: VecLike[], distance?: number): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointInRect(A: VecLike, point: VecLike, size: VecLike): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointNearToLineSegment(A: VecLike, p1: VecLike, p2: VecLike, distance?: number): boolean;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function pointNearToPolyline(A: VecLike, points: VecLike[], distance?: number): boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function polygonsIntersect(a: VecLike[], b: VecLike[]): boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export class Polyline2d extends BaseSpline2d<LineSegment2dModel> {
|
|
|
|
constructor(points: VecLike[], k?: number, p?: number);
|
|
|
|
// (undocumented)
|
|
|
|
static FromPoints(points: VecLike[]): Polyline2d;
|
|
|
|
// (undocumented)
|
|
|
|
getSegmentsFromPoints(points: VecLike[], p?: number): LineSegment2d[];
|
|
|
|
// (undocumented)
|
|
|
|
segments: LineSegment2d[];
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function radiansToDegrees(r: number): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function rangeIntersection(a0: number, a1: number, b0: number, b1: number): [number, number] | null;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function rangesOverlap(a0: number, a1: number, b0: number, b1: number): boolean;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const ROTATE_CORNER_TO_SELECTION_CORNER: {
|
|
|
|
readonly top_left_rotate: "top_left";
|
|
|
|
readonly top_right_rotate: "top_right";
|
|
|
|
readonly bottom_right_rotate: "bottom_right";
|
|
|
|
readonly bottom_left_rotate: "bottom_left";
|
|
|
|
readonly mobile_rotate: "top_left";
|
|
|
|
};
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type RotateCorner = 'bottom_left_rotate' | 'bottom_right_rotate' | 'mobile_rotate' | 'top_left_rotate' | 'top_right_rotate';
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function rotateSelectionHandle(handle: SelectionHandle, rotation: number): SelectionHandle;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type SelectionCorner = 'bottom_left' | 'bottom_right' | 'top_left' | 'top_right';
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type SelectionEdge = 'bottom' | 'left' | 'right' | 'top';
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type SelectionHandle = SelectionCorner | SelectionEdge;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function setStrokePointRadii(strokePoints: StrokePoint[], options: StrokeOptions): StrokePoint[];
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function shortAngleDist(a0: number, a1: number): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function simplify(points: VecLike[], tolerance?: number): VecLike[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export function simplify2(points: VecLike[], tolerance?: number): VecLike[];
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const SIN: (x: number) => number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function snapAngle(r: number, segments: number): number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export interface StrokeOptions {
|
|
|
|
easing?: (pressure: number) => number;
|
|
|
|
end?: {
|
|
|
|
cap?: boolean;
|
|
|
|
taper?: boolean | number;
|
|
|
|
easing?: (distance: number) => number;
|
|
|
|
};
|
|
|
|
last?: boolean;
|
|
|
|
simulatePressure?: boolean;
|
|
|
|
size?: number;
|
|
|
|
smoothing?: number;
|
|
|
|
start?: {
|
|
|
|
cap?: boolean;
|
|
|
|
taper?: boolean | number;
|
|
|
|
easing?: (distance: number) => number;
|
|
|
|
};
|
|
|
|
// (undocumented)
|
|
|
|
streamline?: number;
|
|
|
|
thinning?: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export interface StrokePoint {
|
|
|
|
// (undocumented)
|
|
|
|
distance: number;
|
|
|
|
// (undocumented)
|
|
|
|
input: Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
point: Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
pressure: number;
|
|
|
|
// (undocumented)
|
|
|
|
radius: number;
|
|
|
|
// (undocumented)
|
|
|
|
runningLength: number;
|
|
|
|
// (undocumented)
|
|
|
|
vector: Vec2d;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export const TAU: number;
|
|
|
|
|
|
|
|
// @public
|
|
|
|
export function toDomPrecision(v: number): number;
|
|
|
|
|
2023-06-05 18:04:13 +00:00
|
|
|
// @public (undocumented)
|
|
|
|
export function toFixed(v: number): number;
|
|
|
|
|
2023-04-25 11:01:25 +00:00
|
|
|
// @public
|
|
|
|
export function toPrecision(n: number, precision?: number): number;
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export class Vec2d {
|
|
|
|
constructor(x?: number, y?: number, z?: number);
|
|
|
|
// (undocumented)
|
|
|
|
static Abs(A: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
abs(): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Add(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
add(V: VecLike): this;
|
|
|
|
// (undocumented)
|
|
|
|
static AddScalar(A: VecLike, n: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
addScalar(n: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static AddXY(A: VecLike, x: number, y: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
addXY(x: number, y: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Angle(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
angle(B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Average(arr: VecLike[]): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Cast(A: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Clamp(A: Vec2d, min: number, max?: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
clamp(min: number, max?: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Clockwise(A: VecLike, B: VecLike, C: VecLike): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
clone(): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Cpr(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
cpr(V: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Cross(A: VecLike, V: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
cross(V: VecLike): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Dist(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
dist(V: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Dist2(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static DistanceToLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp?: boolean): number;
|
|
|
|
// (undocumented)
|
|
|
|
distanceToLineSegment(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static DistanceToLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Div(A: VecLike, t: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
div(t: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static DivV(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
divV(V: VecLike): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Dpr(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
dpr(V: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Equals(A: VecLike, B: VecLike): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
equals(B: VecLike): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
static EqualsXY(A: VecLike, x: number, y: number): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
equalsXY(x: number, y: number): boolean;
|
|
|
|
// (undocumented)
|
|
|
|
static From({ x, y, z }: Vec2dModel): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static FromArray(v: number[]): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Len(A: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
len(): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Len2(A: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
len2(): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Lrp(A: VecLike, B: VecLike, t: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
lrp(B: VecLike, t: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Max(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Med(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Min(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Mul(A: VecLike, t: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
mul(t: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static MulV(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
mulV(V: VecLike): this;
|
|
|
|
// (undocumented)
|
|
|
|
static NearestPointOnLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp?: boolean): Vec2d;
|
|
|
|
static NearestPointOnLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Neg(A: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
neg(): this;
|
|
|
|
// (undocumented)
|
|
|
|
norm(): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Nudge(A: VecLike, B: VecLike, distance: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
nudge(B: VecLike, distance: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Per(A: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
per(): this;
|
|
|
|
static PointsBetween(A: Vec2dModel, B: Vec2dModel, steps?: number): Vec2d[];
|
|
|
|
// (undocumented)
|
|
|
|
get pressure(): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Pry(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
pry(V: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Rescale(A: VecLike, n: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static Rot(A: VecLike, r?: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
rot(r: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static RotWith(A: VecLike, C: VecLike, r: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
rotWith(C: VecLike, r: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static ScaleWithOrigin(A: VecLike, scale: number, origin: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
set(x?: number, y?: number, z?: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
setTo({ x, y, z }: VecLike): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Slope(A: VecLike, B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
slope(B: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
static Snap(A: VecLike, step?: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static SnapToGrid(A: VecLike, gridSize?: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
snapToGrid(gridSize: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Sub(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
sub(V: VecLike): this;
|
|
|
|
// (undocumented)
|
|
|
|
static SubScalar(A: VecLike, n: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
subScalar(n: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static SubXY(A: VecLike, x: number, y: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
subXY(x: number, y: number): this;
|
|
|
|
// (undocumented)
|
|
|
|
static Tan(A: VecLike, B: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
tan(V: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static ToAngle(A: VecLike): number;
|
|
|
|
// (undocumented)
|
|
|
|
toAngle(): number;
|
|
|
|
// (undocumented)
|
|
|
|
static ToArray(A: VecLike): number[];
|
|
|
|
// (undocumented)
|
|
|
|
toArray(): number[];
|
|
|
|
// (undocumented)
|
|
|
|
static ToFixed(A: VecLike, n?: number): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
toFixed(): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
static ToJson(A: VecLike): {
|
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
z: number | undefined;
|
|
|
|
};
|
|
|
|
// (undocumented)
|
|
|
|
toJson(): Vec2dModel;
|
|
|
|
// (undocumented)
|
|
|
|
static ToString(A: VecLike): string;
|
|
|
|
// (undocumented)
|
|
|
|
toString(): string;
|
|
|
|
// (undocumented)
|
|
|
|
static Uni(A: VecLike): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
uni(): Vec2d;
|
|
|
|
// (undocumented)
|
|
|
|
x: number;
|
|
|
|
// (undocumented)
|
|
|
|
y: number;
|
|
|
|
// (undocumented)
|
|
|
|
z: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @public (undocumented)
|
|
|
|
export type VecLike = Vec2d | Vec2dModel;
|
|
|
|
|
|
|
|
// (No @packageDocumentation comment for this package)
|
|
|
|
|
|
|
|
```
|