@thi.ng/geom
Version:
Functional, polymorphic API for 2D geometry types & SVG generation
55 lines • 2.46 kB
TypeScript
import type { MultiFn1 } from "@thi.ng/defmulti";
import type { IShape, IShape2, IShape3 } from "./api.js";
import type { Arc } from "./api/arc.js";
import type { Circle } from "./api/circle.js";
import type { Ellipse } from "./api/ellipse.js";
import type { Rect } from "./api/rect.js";
/**
* Function overrides for {@link applyTransforms}.
*/
export type ApplyTransformsFn = {
(shape: Arc): IShape2;
(shape: Circle): IShape2;
(shape: Ellipse): IShape2;
(shape: Rect): IShape2;
<T extends IShape2>(shape: T): T;
<T extends IShape3>(shape: T): T;
} & MultiFn1<IShape, IShape>;
/**
* Applies any spatial transformation attributes defined (if any) for the given
* shape. If no such attributes exist, the original shape is returned as is.
*
* @remarks
* The following attributes are considered:
*
* - `transform`: A 2x3 (for 2D) or 4x4 (for 3D) transformation matrix
* - `translate`: Translation/offset vector
* - `scale`: A scale factor (scalar for uniform or vector for non-uniform)
* - `rotate`: Rotation angle (in radians, 2D only)
* - `rotate[XYZ]`: Rotation angle (in radians, 3D only)
*
* If the `transform` attrib is given, the others will be ignored. If any of the
* other 3 attribs is provided, the order of application is: rotate, scale,
* translate. Any of these relevant attributes will be removed from the
* transformed shapes to ensure idempotent behavior.
*
* For (@link group} shapes, the children are processed in depth-first order
* with any transformations to the group itself applied post-order.
*
* Note: Where possible, this function delegates to {@link rotate} (for 2D),
* {@link rotateX}, {@link rotateY}, {@link rotateZ} (all for 3D), {@link scale}
* and {@link translate} to realize individual/partial transformation aspects to
* increase the likelihood of retaining original shape types. E.g. uniformly
* scaling a circle with a scalar factor retains a circle, but scaling
* non-uniformly will convert it to an ellipse... Similarly, rotating a rect
* will convert it to a quad etc.
*
* For those shape types for which a shape conversion _might_ be involved, the
* function only returns a generic `IShape2` or `IShape3` type. To find out if a
* shape conversion will apply, please consult the docs for the above linked
* transformation functions.
*
* @param shape
*/
export declare const applyTransforms: ApplyTransformsFn;
//# sourceMappingURL=apply-transforms.d.ts.map