Archive for July 5th, 2019
GCMC includes a
typeset function converting a more-or-less ASCII string into the coordinate points (a “vectorlist” containing a “path”) defining its character strokes and pen motions. The coordinates are relative to an origin at the lower-left corner of the line, with the font’s capital-X height set to 1.0, so you apply a
scale function to make them whatever size you want and hand them to the
engrave library routine, which squirts the corresponding G-Code into the output file.
Such G-Code can annotate plots:
The scaled coordinates cover a distance L along a straight line, so putting them on an arc will cover the same distance. The arc is part of a circle with radius R and a circumference 2πR, so … polar coordinates to the rescue!
The total text length L corresponds to the total angle A along the arc:
A = 360° L / 2πR
It’s entirely possible to have a text line longer than the entire circumference of the circle, whereupon the right end overlaps the left. Smaller characters fit better on smaller circles:
The X coordinate of each point in the path (always positive from the X origin) in the path gives its angle (positive counterclockwise) from 0°:
a = 360° x / 2πR (say "eks")
You can add a constant angle of either sign to slew the whole text arc around the center point.
The letter baseline Y=0 sits at radius R, so the Y coordinate of each point (positive above and negative below the Y=0 baseline) gives its radius r:
r = R - y
That puts the bottom of the text outward, so it reads properly when you’re facing the center point.
Homework: Tweak the signs so it reads properly when you’re standing inside the circle reading outward.
Converting from polar back to XY:
x = r × cos(a) (say "times") y = r × sin(a)
You can add an XY offset to the result, thereby plunking the point wherever you want.
This obviously works best for small characters relative to the arc radius, as the lines connecting the points remain resolutely straight. That’s probably what you wanted anyway, but letters like, say, “m” definitely manspread.
Overall, it looks pretty good:
A doodle helped lay out the geometry:
The GCMC source code as a GitHub Gist: