From 8c7dd3539696468a45a6c21567e23934c423a81e Mon Sep 17 00:00:00 2001 From: Jean-Marie 'Histausse' Mineau Date: Wed, 22 Oct 2025 13:57:56 +0200 Subject: [PATCH] nice gear --- slides/icons.typ | 76 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/slides/icons.typ b/slides/icons.typ index e261e11..4911fc8 100644 --- a/slides/icons.typ +++ b/slides/icons.typ @@ -90,40 +90,88 @@ //x0: 0pt, y0: 0pt, out-rad: 100pt, in-rad: none, + center-rad: none, nb-teeth: 6, teeth-angle: none, stroke: black + 3pt, fill: luma(70%), - fill-center: white, ) = { let x0 = out-rad let y0 = out-rad let teeth-angle = if teeth-angle == none { 360deg / nb-teeth / 2 } else { teeth-angle } + let inter-teeth-angle = (360deg / nb-teeth) - teeth-angle let in-rad = if in-rad == none { out-rad * 0.75 } else { in-rad } + let center-rad = if center-rad == none { in-rad / 2 } else { center-rad } box(width: 2*out-rad, height: 2*out-rad, { //place(left+bottom, line(start: (0%, -50%), end: (100%, -50%))) //place(left+bottom, line(start: (50%, 0%), end: (50%, -100%))) - polygon( + curve( stroke: stroke, fill: fill, + fill-rule: "even-odd", ..for i in range(nb-teeth) { let angle = i * 360deg / nb-teeth let center_off = calc.sin(teeth-angle/2) * in-rad let (x0_1, y0_1) = polar(x0: x0, y0: y0, r: center_off, th: angle - 90deg) let (x0_2, y0_2) = polar(x0: x0, y0: y0, r: center_off, th: angle + 90deg) - ( - (polar(x0: x0, y0: y0, r: in-rad, th: angle - teeth-angle/2)), - //(polar(x0: x0, y0: y0, r: out-rad, th: angle - teeth-angle/2)), - (polar(x0: x0_1, y0: y0_1, r: out-rad, th: angle)), - (polar(x0: x0_2, y0: y0_2, r: out-rad, th: angle)), - //(polar(x0: x0, y0: y0, r: out-rad, th: angle + teeth-angle/2)), - (polar(x0: x0, y0: y0, r: in-rad, th: angle + teeth-angle/2)), + let p0 = polar(x0: x0_1, y0: y0_1, r: out-rad, th: angle) + let p1 = polar(x0: x0_2, y0: y0_2, r: out-rad, th: angle) + let p2 = polar(x0: x0, y0: y0, r: in-rad, th: angle + inter-teeth-angle/2) + let p3 = polar(x0: x0, y0: y0, r: in-rad, th: angle + 3*inter-teeth-angle/2) + + let u2 = polar(x0: 0pt, y0: 0pt, r: 1pt, th: angle + inter-teeth-angle/2 + 90deg) + let u3 = polar(x0: 0pt, y0: 0pt, r: 1pt, th: angle + 3*inter-teeth-angle/2 + 90deg) + let l2 = 4 * in-rad / 3 * calc.tan(inter-teeth-angle / 4) / 1pt + let l3 = -l2 + //let l2 = 1 + let q2 = (p2.at(0) + l2 * u2.at(0), p2.at(1) + l2 * u2.at(1)) + let q3 = (p3.at(0) + l3 * u3.at(0), p3.at(1) + l3 * u3.at(1)) + + let result = ( + curve.line(p0), + curve.line(p1), + curve.line(p2), + + /* + curve.line(q2), + curve.line(p2), + curve.line(p3), + curve.line(q3), + curve.line(p3), + */ + + + curve.cubic(q2, q3, p3) ) - } + if i == 0 { + result.insert(0, curve.move(p0)) + } + result + + }, + curve.close(mode: "straight"), + ..for i in range(4) { + let angle = i * 360deg / 4 + let p0 = polar(x0: x0, y0: y0, r: center-rad, th: angle) + let u0 = polar(x0: 0pt, y0: 0pt, r: 1pt, th: angle + 90deg) + let p1 = polar(x0: x0, y0: y0, r: center-rad, th: angle+90deg) + let u1 = polar(x0: 0pt, y0: 0pt, r: 1pt, th: angle + 180deg) + let l0 = 4 * center-rad / 3 * calc.tan(90deg / 4) / 1pt + let l1 = -l0 + let q0 = (p0.at(0) + l0 * u0.at(0), p0.at(1) + l0 * u0.at(1)) + let q1 = (p1.at(0) + l1 * u1.at(0), p1.at(1) + l1 * u1.at(1)) + let result = ( + curve.cubic(q0, q1, p1), + ) + if i == 0 { + result.insert(0, curve.move(p0)) + } + result + }, + curve.close() ) - let center-rad = in-rad * 2/3 - place(left+bottom, + /*place(left+bottom, // wtf? dx: out-rad - center-rad, dy: -out-rad + center-rad, @@ -132,7 +180,7 @@ stroke: stroke, fill: fill-center, ) - ) + )*/ }) } @@ -227,9 +275,9 @@ } +#gear() /* #phone(body: [Hello World!]) -#move(dx: 100pt, dy: 100pt, gear()) #wrench() #apk()