@thi.ng/text-canvas
Version:
Text based canvas, drawing, plotting, tables with arbitrary formatting (incl. ANSI/HTML)
60 lines (59 loc) • 1.56 kB
JavaScript
import { peek } from "@thi.ng/arrays/peek";
import { hline } from "./hvline.js";
import { charCode, intersectRectCircle } from "./utils.js";
const circle = (canvas, cx, cy, r, char, fill = false, format = canvas.format) => {
if (r < 1) return;
cx |= 0;
cy |= 0;
r |= 0;
const { x1, y1, x2, y2, w: clipw, h: cliph } = peek(canvas.clipRects);
if (!intersectRectCircle(x1, y1, clipw, cliph, cx, cy, r)) return;
char = charCode(
char !== void 0 ? char : peek(canvas.styles).dot,
format
);
let x = 0;
let y = r;
let ymax = r * r;
let sum = ymax + r;
let dx2 = 1;
let dy2 = 2 * r - 1;
const { data, width } = canvas;
const $ = (ox, oy) => ox >= x1 && oy >= y1 && ox < x2 && oy < y2 && (data[ox + oy * width] = char);
while (x <= y) {
if (fill) {
hline(canvas, cx - y, cy + x, y << 1, char, char, char);
x && hline(canvas, cx - y, cy - x, y << 1, char, char, char);
} else {
$(cx - y, cy + x);
y && $(cx + y, cy + x);
if (x) {
$(cx - y, cy - x);
y && $(cx + y, cy - x);
}
if (x !== y) {
$(cx - x, cy - y);
x && $(cx + x, cy - y);
if (y) {
$(cx - x, cy + y);
x && $(cx + x, cy + y);
}
}
}
sum -= dx2;
if (sum <= ymax) {
if (fill && x !== y) {
hline(canvas, cx - x, cy - y, x << 1, char, char, char);
y && hline(canvas, cx - x, cy + y, x << 1, char, char, char);
}
y--;
ymax -= dy2;
dy2 -= 2;
}
x++;
dx2 += 2;
}
};
export {
circle
};