import { useMemo, useState } from 'react'; import { ready, ink, rgb } from '../../lib/mrly.js'; import { Row, Slider, Check } from '../../lib/app.jsx'; import { Sketch } from '../../lib/draw.jsx'; import { board, axis } from '../../lib/chart.js'; import { embed } from '../../lib/widget.jsx'; const m = await ready(); export const view = (q) => ({ nodes: JSON.parse(m.farey(q)), stack: JSON.parse(m.farey_novelty(q)) }); export const bars = (seen, q, marks) => (canvas) => { const b = board(canvas, 220, { pad: 24, top: 12, bottom: 30 }); const { ctx } = b; const pale = rgb(ink.fg).join(', '); axis(b, [[0, '0'], [1, '1']]); for (const [num, den, bright] of seen.nodes) { const x = b.x(num / den); ctx.strokeStyle = `rgba(${pale}, ${0.14 + 0.7 * bright / q})`; ctx.lineWidth = bright > q / 3 ? 1.5 : 0.7; ctx.beginPath(); ctx.moveTo(x, b.floor); ctx.lineTo(x, b.y(bright / q)); ctx.stroke(); } if (marks) { ctx.fillStyle = ink.orange; for (const [num, den] of seen.nodes) { if (seen.stack.primes.includes(den)) ctx.fillRect(b.x(num / den) - 1, b.floor, 2, 7); } } }; export function stack() { const [q, setQ] = useState(24); const [marks, setMarks] = useState(true); const seen = useMemo(() => view(q), [q]); return ( <>

{`scales 1 to ${q} light ${seen.stack.lit} fractions; the primes are ${seen.stack.primes.join(', ')}`}

); } embed('farey', { stack });