@thi.ng/geom
Version:
Functional, polymorphic API for 2D geometry types & SVG generation
82 lines (81 loc) • 2.54 kB
JavaScript
import { defmulti } from "@thi.ng/defmulti/defmulti";
import { add, add2, add3 } from "@thi.ng/vectors/add";
import { set2, set3 } from "@thi.ng/vectors/set";
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 { __copyAttribs } from "./internal/copy.js";
import { __dispatch } from "./internal/dispatch.js";
import { __segmentTransformer } from "./internal/transform.js";
const translate = defmulti(
__dispatch,
{
bpatch: "points",
cubic: "points",
cubic3: "points3",
complexpoly: "group",
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) => new AABB(
add3([], $.pos, delta),
set3([], $.size),
__copyAttribs($.attribs)
),
arc: ($, delta) => {
const a = $.copy();
add2(null, a.pos, delta);
return a;
},
circle: ($, delta) => new Circle(add2([], $.pos, delta), $.r, __copyAttribs($.attribs)),
ellipse: ($, delta) => new Ellipse(
add2([], $.pos, delta),
set2([], $.r),
__copyAttribs($.attribs)
),
extra: ($) => $,
group: ($, delta) => $.copyTransformed((x) => translate(x, delta)),
path: ($, delta) => $.copyTransformed(
__segmentTransformer(
(geo) => translate(geo, delta),
(p) => add([], p, delta)
)
),
points: ($, delta) => $.copyTransformed(
(points) => points.map((x) => add2([], x, delta))
),
points3: ($, delta) => $.copyTransformed(
(points) => points.map((x) => add3([], x, delta))
),
ray: ($, delta) => new Ray(add2([], $.pos, delta), $.dir, __copyAttribs($.attribs)),
ray3: ($, delta) => new Ray3(add3([], $.pos, delta), $.dir, __copyAttribs($.attribs)),
rect: ($, delta) => new Rect(
add2([], $.pos, delta),
set2([], $.size),
__copyAttribs($.attribs)
),
sphere: ($, delta) => new Sphere(add3([], $.pos, delta), $.r, __copyAttribs($.attribs)),
text: ($, delta) => new Text(add2([], $.pos, delta), $.body, __copyAttribs($.attribs))
}
);
export {
translate
};