UNPKG

@thi.ng/text-canvas

Version:

Text based canvas, drawing, plotting, tables with arbitrary formatting (incl. ANSI/HTML)

60 lines (59 loc) 1.56 kB
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 };