Creating Pen Plotter Art with Julia
/home/rps/media/img/plotwork/kaiser-w-ball-orig.jpeg
This is Kaiser. I want to turn him into plotter art, so I need to convert this
jpeg
into something I can feed to my HP7475A from the 80s. That means HPGL
but its no problem to get there from an SVG
via Inkscape.
The actually-tricky constraints are:
- The plotter doesn’t do fills. It thinks in points and lines. So we can’t just segment the image into regions and have it shade them automatically.
- Color-wise, our potential palette is limited to the 24 pack of “Electro Pop” ultra-fine tip sharpies I’ve modified the plotter to use.
I figure we’ll worry about color once we have something plot-able, so first we gotta translate this image into a vector of dots and lines.
Pseudofills: Stipples & Hatches
Google turns up two promising artistic techniques: stippling and hatching, which are dot and line-based fills, respectively. Here are some (human artist) examples–
TODO Add stipple / hatching images.
There is already an algorithmic stippler for the EggBot plotter called StippleGen. I fiddled with it but wanted more control, so let’s implement our own.
How?
First, notice that we can mimic shades of gray by varying either the density or size of the black dots that make up the stippling:
TODO Add stipple / halftone example.
Adrian Secord has a paper, “Weighted Voronoi Stippling,” that calculates the stippling’s dot distribution by generating a Voronoi diagram. It’s how StippleGen works, and has been covered by a few other writeups on the web. The paper’s examples look excellent:
TODO Add paper clippings.
What’s a Voronoi diagram? How does it work? Who cares! There’s a VoronoiDelaunay.jl package already–maybe it’ll do all the work for us and we won’t have to learn a thing.
using Pkg
Pkg.add("VoronoiDelaunay")
using VoronoiDelaunay
import Images: imread
function stipple(imgf)
img = imread(imgf)
tess = from_image(img, 25000)
return tess
end
The JuliaImages package includes
function stipple(img)
end