This commit is contained in:
parent
f9d4b9b044
commit
8c7dd35396
1 changed files with 62 additions and 14 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue