@thi.ng/geom
Version:
Functional, polymorphic API for 2D geometry types & SVG generation
134 lines (133 loc) • 3.74 kB
JavaScript
import { isNumber } from "@thi.ng/checks/is-number";
import { defmulti } from "@thi.ng/defmulti/defmulti";
import { unsupported } from "@thi.ng/errors/unsupported";
import { mul, mul2, mul3 } from "@thi.ng/vectors/mul";
import { mulN2, mulN3 } from "@thi.ng/vectors/muln";
import { normalize2, normalize3 } from "@thi.ng/vectors/normalize";
import { AABB } from "./api/aabb.js";
import { Circle } from "./api/circle.js";
import { Ellipse } from "./api/ellipse.js";
import { Ray } from "./api/ray.js";
import { Ray3 } from "./api/ray3.js";
import { Rect } from "./api/rect.js";
import { Sphere } from "./api/sphere.js";
import { Text } from "./api/text.js";
import { __asVec } from "./internal/args.js";
import { __copyAttribs } from "./internal/copy.js";
import { __dispatch } from "./internal/dispatch.js";
import { __segmentTransformer } from "./internal/transform.js";
const scale = defmulti(
__dispatch,
{
bpatch: "points",
complexpoly: "group",
cubic: "points",
cubic3: "points3",
group3: "group",
line: "points",
line3: "points3",
path3: "path",
poly: "points",
poly3: "points3",
polyline: "points",
polyline3: "points3",
quad: "points",
quad3: "points3",
quadratic: "points",
quadratic3: "points3",
tri: "points",
tri3: "points3"
},
{
aabb: ($, delta) => {
delta = __asVec(delta, 3);
return new AABB(
mul3([], $.pos, delta),
mul3([], $.size, delta),
__copyAttribs($.attribs)
);
},
arc: ($, delta) => {
delta = __asVec(delta);
const a = $.copy();
mul2(null, a.pos, delta);
mul2(null, a.r, delta);
return a;
},
circle: ($, delta) => isNumber(delta) ? new Circle(
mulN2([], $.pos, delta),
$.r * delta,
__copyAttribs($.attribs)
) : new Ellipse(
mul2([], $.pos, delta),
mulN2([], delta, $.r),
__copyAttribs($.attribs)
),
ellipse: ($, delta) => {
delta = __asVec(delta);
return new Ellipse(
mul2([], $.pos, delta),
mul2([], $.r, delta),
__copyAttribs($.attribs)
);
},
extra: ($) => $,
group: ($, delta) => $.copyTransformed((x) => scale(x, delta)),
path: ($, delta) => {
delta = __asVec(delta);
return $.copyTransformed(
__segmentTransformer(
(geo) => scale(geo, delta),
(p) => mul([], p, delta)
)
);
},
points: ($, delta) => $.copyTransformed(
(points) => points.map(
isNumber(delta) ? (x) => mulN2([], x, delta) : (x) => mul2([], x, delta)
)
),
points3: ($, delta) => $.copyTransformed(
(points) => points.map(
isNumber(delta) ? (x) => mulN3([], x, delta) : (x) => mul3([], x, delta)
)
),
ray: ($, delta) => {
delta = __asVec(delta);
return new Ray(
mul2([], $.pos, delta),
normalize2(null, mul2([], $.dir, delta)),
__copyAttribs($.attribs)
);
},
ray3: ($, delta) => {
delta = __asVec(delta);
return new Ray3(
mul3([], $.pos, delta),
normalize3(null, mul3([], $.dir, delta)),
__copyAttribs($.attribs)
);
},
rect: ($, delta) => {
delta = __asVec(delta);
return new Rect(
mul2([], $.pos, delta),
mul2([], $.size, delta),
__copyAttribs($.attribs)
);
},
sphere: ($, delta) => isNumber(delta) ? new Sphere(
mulN3([], $.pos, delta),
$.r * delta,
__copyAttribs($.attribs)
) : unsupported("can't non-uniformly scale sphere"),
text: ($, delta) => new Text(
mul2([], $.pos, __asVec(delta)),
$.body,
__copyAttribs($.attribs)
)
}
);
export {
scale
};