/
packed-points.ts
49 lines (47 loc) · 1.3 KB
/
packed-points.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import { TAU } from "@thi.ng/math";
import type { IObjectOf } from "@thi.ng/api";
export const packedPoints = (
ctx: CanvasRenderingContext2D,
attribs: IObjectOf<any>,
opts: IObjectOf<any>,
pts: ArrayLike<number>
) => {
let v: any;
if ((v = attribs.fill) && v !== "none") {
__drawPoints(ctx, opts, pts, "fill", "fillRect");
}
if ((v = attribs.stroke) && v !== "none") {
__drawPoints(ctx, opts, pts, "stroke", "strokeRect");
}
};
const __drawPoints = (
ctx: CanvasRenderingContext2D,
opts: IObjectOf<any>,
pts: ArrayLike<number>,
cmd: "fill" | "stroke",
cmdR: "fillRect" | "strokeRect"
) => {
const { start, cstride, estride, size } = {
start: 0,
cstride: 1,
estride: 2,
size: 1,
...opts
};
let num =
opts && opts.num != null
? opts.num
: ((pts.length - start) / estride) | 0;
if (opts.shape === "circle") {
for (let i = start; --num >= 0; i += estride) {
ctx.beginPath();
ctx.arc(pts[i], pts[i + cstride], size, 0, TAU);
ctx[cmd]();
}
} else {
const r = size / 2;
for (let i = start; --num >= 0; i += estride) {
ctx[cmdR](pts[i] - r, pts[i + cstride] - r, size, size);
}
}
};