Lab 14: Eyebrows with poly()
Builds a curved eyebrow out of a six-point polygon instead of a single straight line — a bend that reads as far more expressive than a flat diagonal ever could.
Sample Program Code
Each eyebrow is one array of offsets from the eye's center, placed with shapes.poly():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | |
Here's what that program draws:

A Filled Polygon Costs About a Dozen Rows
shapes.poly() fills the eyebrow with the same scanline algorithm from Lab 8 — one hline() per row the shape covers, which for a brow this size is roughly a dozen rows. That's cheap enough that a filled, curved eyebrow costs barely more than the straight-line version from Lab 10 did.
Try drawing the brows with NO_FILL instead of FILL. An outlined brow is a thin wire frame, and at this size it reads as a scratch, not a brow — which is exactly why every stroke in this kit, lines included, gets thickened rather than left as a single pixel wide.