@thi.ng/geom-sdf 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/shapes.d.ts CHANGED
@@ -2,8 +2,18 @@ import { ReadonlyVec } from "@thi.ng/vectors";
2
2
  import type { SDFAttribs, SDFn } from "./api.js";
3
3
  /** @internal */
4
4
  export declare const DEFAULT_ATTRIBS: SDFAttribs;
5
+ /**
6
+ * Applies any SDF modifiers specified via {@link SDFAttribs} to the given
7
+ * distance function. Returns a possibly updated distance function.
8
+ *
9
+ * @remarks
10
+ * Order of application is: abs, offset, flip
11
+ *
12
+ * @param fn
13
+ * @param attribs
14
+ */
5
15
  export declare const withSDFAttribs: (fn: SDFn, attribs?: Partial<SDFAttribs>) => SDFn;
6
- export declare const arc2: (apert: ReadonlyVec, ra: number, rb: number, attribs?: Partial<SDFAttribs>) => SDFn;
16
+ export declare const arc2: (center: ReadonlyVec, apert: ReadonlyVec, ra: number, rb: number, attribs?: Partial<SDFAttribs>) => SDFn;
7
17
  export declare const box2: (center: ReadonlyVec, size: ReadonlyVec, attribs?: Partial<SDFAttribs>) => SDFn;
8
18
  export declare const circle2: (center: ReadonlyVec, radius: number, attribs?: Partial<SDFAttribs>) => SDFn;
9
19
  export declare const ellipse2: (center: ReadonlyVec, radii: ReadonlyVec, attribs?: Partial<SDFAttribs>) => SDFn;
@@ -11,5 +21,19 @@ export declare const line2: (a: ReadonlyVec, b: ReadonlyVec, attribs?: Partial<S
11
21
  export declare const points2: (pts: ReadonlyVec[], attribs?: Partial<SDFAttribs>) => SDFn;
12
22
  export declare const polygon2: (pts: ReadonlyVec[], attribs?: Partial<SDFAttribs>) => SDFn;
13
23
  export declare const polyline2: (pts: ReadonlyVec[], attribs?: Partial<SDFAttribs>) => SDFn;
24
+ /**
25
+ * SDF for a single quadratic bezier segment. Similar to {@link line2}, by
26
+ * default only computes the _unsigned_ distance to the segment. To obtain the
27
+ * signed distance (for the "interior" region, if any), set the `abs` attribute
28
+ * explicitly to `false`.
29
+ *
30
+ * @remarks
31
+ * See {@link SDFAttribs.abs} for details.
32
+ *
33
+ * @param a
34
+ * @param b
35
+ * @param c
36
+ * @param attribs
37
+ */
14
38
  export declare const quadratic2: (a: ReadonlyVec, b: ReadonlyVec, c: ReadonlyVec, attribs?: Partial<SDFAttribs>) => SDFn;
15
39
  //# sourceMappingURL=shapes.d.ts.map
package/shapes.js CHANGED
@@ -1,33 +1,81 @@
1
+ import { isFunction } from "@thi.ng/checks/is-function";
1
2
  import { distSq2 } from "@thi.ng/vectors";
2
3
  import { sub2 } from "@thi.ng/vectors/sub";
4
+ import { withBoundingCircle } from "./bounds.js";
3
5
  import { distArc2, distBox2, distCircle2, distEllipse2, distPolygon2, distPolyline2, distQuadratic2, distSegment2, } from "./dist.js";
4
- import { abs as $abs, flip as $flip, round as $round } from "./ops.js";
6
+ import { abs as $abs, flip as $flip, offset as $offset } from "./ops.js";
5
7
  /** @internal */
6
8
  export const DEFAULT_ATTRIBS = {
7
9
  abs: false,
10
+ bounds: false,
11
+ chamfer: 0,
8
12
  combine: "union",
9
13
  flip: false,
14
+ offset: 0,
10
15
  round: 0,
11
16
  smooth: 0,
12
17
  };
18
+ /**
19
+ * Applies any SDF modifiers specified via {@link SDFAttribs} to the given
20
+ * distance function. Returns a possibly updated distance function.
21
+ *
22
+ * @remarks
23
+ * Order of application is: abs, offset, flip
24
+ *
25
+ * @param fn
26
+ * @param attribs
27
+ */
13
28
  export const withSDFAttribs = (fn, attribs) => {
14
29
  if (attribs) {
15
- const { abs, flip, round } = { ...DEFAULT_ATTRIBS, ...attribs };
30
+ const { abs, flip, offset } = { ...DEFAULT_ATTRIBS, ...attribs };
16
31
  if (abs)
17
32
  fn = $abs(fn);
18
- if (round > 0)
19
- fn = $round(fn, round);
33
+ if (isFunction(offset) || offset > 0)
34
+ fn = $offset(fn, offset);
20
35
  if (flip)
21
36
  fn = $flip(fn);
22
37
  }
23
38
  return fn;
24
39
  };
25
- export const arc2 = (apert, ra, rb, attribs) => withSDFAttribs((p) => distArc2(p, apert, ra, rb), attribs);
40
+ export const arc2 = (center, apert, ra, rb, attribs = {}) => {
41
+ const sdf = withSDFAttribs((p) => distArc2(sub2([], p, center), apert, ra, rb), attribs);
42
+ return attribs.bounds ? withBoundingCircle(sdf, center, ra + rb) : sdf;
43
+ };
26
44
  export const box2 = (center, size, attribs) => withSDFAttribs((p) => distBox2(sub2([], p, center), size), attribs);
27
45
  export const circle2 = (center, radius, attribs) => withSDFAttribs((p) => distCircle2(sub2([], p, center), radius), attribs);
28
- export const ellipse2 = (center, radii, attribs) => withSDFAttribs((p) => distEllipse2(sub2([], p, center), radii), attribs);
29
- export const line2 = (a, b, attribs) => withSDFAttribs((p) => distSegment2(a, b, p), attribs);
30
- export const points2 = (pts, attribs) => withSDFAttribs((p) => pts.reduce((acc, q) => Math.min(acc, distSq2(p, q)), Infinity), attribs);
31
- export const polygon2 = (pts, attribs) => withSDFAttribs((p) => distPolygon2(pts, p), attribs);
32
- export const polyline2 = (pts, attribs) => withSDFAttribs((p) => distPolyline2(pts, p), attribs);
33
- export const quadratic2 = (a, b, c, attribs) => withSDFAttribs((p) => distQuadratic2(p, a, b, c), attribs);
46
+ export const ellipse2 = (center, radii, attribs = {}) => {
47
+ const sdf = withSDFAttribs((p) => distEllipse2(sub2([], p, center), radii), attribs);
48
+ return attribs.bounds
49
+ ? withBoundingCircle(sdf, center, Math.max(...radii))
50
+ : sdf;
51
+ };
52
+ export const line2 = (a, b, attribs) => withSDFAttribs((p) => distSegment2(p, a, b), attribs);
53
+ export const points2 = (pts, attribs = {}) => {
54
+ const sdf = withSDFAttribs((p) => pts.reduce((acc, q) => Math.min(acc, distSq2(p, q)), Infinity), attribs);
55
+ return attribs.bounds ? withBoundingCircle(sdf, pts) : sdf;
56
+ };
57
+ export const polygon2 = (pts, attribs = {}) => {
58
+ const sdf = withSDFAttribs((p) => distPolygon2(p, pts), attribs);
59
+ return attribs.bounds ? withBoundingCircle(sdf, pts) : sdf;
60
+ };
61
+ export const polyline2 = (pts, attribs = {}) => {
62
+ const sdf = withSDFAttribs((p) => distPolyline2(p, pts), attribs);
63
+ return attribs.bounds ? withBoundingCircle(sdf, pts) : sdf;
64
+ };
65
+ /**
66
+ * SDF for a single quadratic bezier segment. Similar to {@link line2}, by
67
+ * default only computes the _unsigned_ distance to the segment. To obtain the
68
+ * signed distance (for the "interior" region, if any), set the `abs` attribute
69
+ * explicitly to `false`.
70
+ *
71
+ * @remarks
72
+ * See {@link SDFAttribs.abs} for details.
73
+ *
74
+ * @param a
75
+ * @param b
76
+ * @param c
77
+ * @param attribs
78
+ */
79
+ export const quadratic2 = (a, b, c, attribs) => withSDFAttribs(!attribs || attribs.abs !== false
80
+ ? (p) => distQuadratic2(p, a, b, c)
81
+ : (p) => distQuadratic2(p, a, b, c, true), { ...attribs, abs: false });