Despite having failed out of geometry in my younger days, it has become my favorite sort of recreational math. I think, back in elhi geometry, too much emphasis was placed on potential practical applications instead of just distilling it down to the reality that this was what math was before there was any sort of formal mathematical system. Geometry is hands-on, it’s playful, and as such I have come to really enjoy playing with it. As much as I enjoy doing constructions with a straightedge and compass, I occasionally poke around to see what tools exist on the computer as well. Recently, I stumbled across a very neat thing: Eukleides.
I’m drawn to Eukleides because it is a language for geometry, and not a mouse-flinging WYSIWYG virtual compass. This seems contradictory given my gushing about geometry being hands-on, and don’t get me wrong – I love a hands-on GUI circle-canvas too1. But sometimes (often times) my brain is in code-mode and it’s easier to express what I’m trying to do in words than to fiddle around with a mouse. And a task like ‘intersecting a couple of circles’ is far more conducive to writing out than, say, laying down an SVG illustration from scratch.
There you have one of the first constructions learned by anyone studying geometry – bisecting an angle with three arcs (or, full-blown circles in this case). Angle ∠abc is bisected by segment bbi. Here’s the code:
% Percent signs are comments a=point(7,0); b=point(0,0) % Semicolons and newlines separate commands a b c triangle 5,-40° g=circle(b,3) d=intersection(g,a.b); e=intersection(g,b.c) d=d; e=e % Intersections return sets (arrays), extract the points h=circle(d,3); i=circle(e,3) bi=intersection(h,i) bi=bi label a 0°; b 180°; c 40° % Label the points d -40° gray; e 90° gray bi 20° a,b,bi; bi,b,c 1.5 % Make the angle markers end draw c.b.a g lightgray; h gray i gray bi b.bi end
Note that the code originally used shades of grey, I shifted these around to match my site’s colors when I converted the resulting EPS file to SVG. The code is pretty straightforward: define some points, make an angle of them, draw a circle, intersect segments ab and bc, make some more circles, intersect where the circles meet, and boom – a bisected angle. The language reminds me a bit of GraphViz/DOT – purpose-built for naturally expressing how things will be drawn.
We can actually prove that the construction works without even generating an image file. Removing the
label sections, and replacing them with some
a=point(7,0); b=point(0,0) a b c triangle 5,-40° g=circle(b,3) d=intersection(g,a.b); e=intersection(g,b.c) d=d;e=e h=circle(d,3); i=circle(e,3) bi=intersection(h,i) bi=bi %%%%%%%% New content starts here: print angle(a,b,c) print angle(a,b,c)/2 print angle(a,b,bi) print angle(bi,b,c)
We get ∠abc, ∠abc/2, ∠abbi, and ∠bcbi. The last three of these should be equal, and:
40 20 20 20
…they are! We can also do fun things like dividing the circumference of a circle by its diameter:
3.14159. Very cool. There are a few improvements I would like to see. Notably, while you can label points etc. with their names, I can’t find a way to add arbitrary labels, or even labels based on functions. So you can’t (seemingly) label a line segment with its length, or an angle with its measure. Also, the interpreter wants ISO 8859-1 encoding, and it uses the degree symbol2 (°) to represent angle measures. This gets all flippy-floppy when moving to UTF-8, and in fact if I forget to convert a file to ISO 8859-1, I’ll get syntax errors if I use degree symbols. Finally, it only outputs to EPS; native SVG would be incredibly welcome.
Eukleides is a lot of fun to play with, and it’s worth mentioning that it has looping and conditionals and the like, so it is programmable and not just computational or presentational. Presumably some pretty interesting opportunities are thus opened up.