function base_digit_set(A) {
let eps = 10 ** -8;
let left_of_line = ([cx, cy], [[ax, ay], [bx, by]]) =>
(bx - ax) * (cy - ay) - (cx - ax) * (by - ay) > 0;
let left_of_or_on_line = ([cx, cy], [[ax, ay], [bx, by]]) =>
(bx - ax) * (cy - ay) - (cx - ax) * (by - ay) > -eps;
let u = [A[0][0], A[1][0]];
let v = [A[0][1], A[1][1]];
if (left_of_line(u, [[0, 0], v])) {
[u, v] = [v, u];
}
let [ux, uy] = u;
let [vx, vy] = v;
let xs = [0, ux, vx, ux + vx];
let xmin = d3.min(xs);
let xmax = d3.max(xs);
let ys = [0, uy, vy, uy + vy];
let ymin = d3.min(ys);
let ymax = d3.max(ys);
let nominations = d3
.range(xmin, xmax + 1)
.map((x) => d3.range(ymin, ymax + 1).map((y) => [x, y]))
.flat();
return nominations.filter(
(w) =>
left_of_or_on_line(w, [[0, 0], u]) &&
left_of_line(w, [u, [ux + vx, uy + vy]]) &&
left_of_line(w, [[ux + vx, uy + vy], v]) &&
left_of_or_on_line(w, [v, [0, 0]])
);
}