To follow on from this recent topic, today’s post looks at a simple script to generate various hyperbolic tessellations, laying them out in an order that makes some sense of the progressive nature of the patterns that can be generated using the HT command.
Here’s an AutoCAD script (which can be saved as an .scr and executed using the SCRIPT command) to generate all the valid {n k} patterns where n <= 11 and k <= 7 (n being the number of sides in each polygon, k is the number of polygons that meet at each vertex). The application module implementing the HT command (using the code in the previous post, must be NETLOADed before this script will function properly, of course).
_zoom _w 0,0 50,25
; k=3 series
_text _j _m 25,5 0.2 0 {7 3}
_circle 25,5 2 _ht l 7 3 _s
_text _j _m 30,5 0.2 0 {8 3}
_circle 30,5 2 _ht l 8 3 _s
_text _j _m 35,5 0.2 0 {9 3}
_circle 35,5 2 _ht l 9 3 _s
_text _j _m 40,5 0.2 0 {10 3}
_circle 40,5 2 _ht l 10 3 _s
_text _j _m 45,5 0.2 0 {11 3}
_circle 45,5 2 _ht l 11 3 _s
; k=4 series
_text _j _m 15,10 0.2 0 {5 4}
_circle 15,10 2 _ht l 5 4 _s
_text _j _m 20,10 0.2 0 {6 4}
_circle 20,10 2 _ht l 6 4 _s
_text _j _m 25,10 0.2 0 {7 4}
_circle 25,10 2 _ht l 7 4 _s
_text _j _m 30,10 0.2 0 {8 4}
_circle 30,10 2 _ht l 8 4 _s
_text _j _m 35,10 0.2 0 {9 4}
_circle 35,10 2 _ht l 9 4 _s
_text _j _m 40,10 0.2 0 {10 4}
_circle 40,10 2 _ht l 10 4 _s
_text _j _m 45,10 0.2 0 {11 4}
_circle 45,10 2 _ht l 11 4 _s
; k=5 series
_text _j _m 10,15 0.2 0 {4 5}
_circle 10,15 2 _ht l 4 5 _s
_text _j _m 15,15 0.2 0 {5 5}
_circle 15,15 2 _ht l 5 5 _s
_text _j _m 20,15 0.2 0 {6 5}
_circle 20,15 2 _ht l 6 5 _s
_text _j _m 25,15 0.2 0 {7 5}
_circle 25,15 2 _ht l 7 5 _s
_text _j _m 30,15 0.2 0 {8 5}
_circle 30,15 2 _ht l 8 5 _s
_text _j _m 35,15 0.2 0 {9 5}
_circle 35,15 2 _ht l 9 5 _s
_text _j _m 40,15 0.2 0 {10 5}
_circle 40,15 2 _ht l 10 5 _s
_text _j _m 45,15 0.2 0 {11 5}
_circle 45,15 2 _ht l 11 5 _s
; k=6 series
_text _j _m 10,20 0.2 0 {4 6}
_circle 10,20 2 _ht l 4 6 _s
_text _j _m 15,20 0.2 0 {5 6}
_circle 15,20 2 _ht l 5 6 _s
_text _j _m 20,20 0.2 0 {6 6}
_circle 20,20 2 _ht l 6 6 _s
_text _j _m 25,20 0.2 0 {7 6}
_circle 25,20 2 _ht l 7 6 _s
_text _j _m 30,20 0.2 0 {8 6}
_circle 30,20 2 _ht l 8 6 _s
_text _j _m 35,20 0.2 0 {9 6}
_circle 35,20 2 _ht l 9 6 _s
_text _j _m 40,20 0.2 0 {10 6}
_circle 40,20 2 _ht l 10 6 _s
_text _j _m 45,20 0.2 0 {11 6}
_circle 45,20 2 _ht l 11 6 _s
; k=7 series
_text _j _m 5,25 0.2 0 {3 7}
_circle 5,25 2 _ht l 3 7 _s
_text _j _m 10,25 0.2 0 {4 7}
_circle 10,25 2 _ht l 4 7 _s
_text _j _m 15,25 0.2 0 {5 7}
_circle 15,25 2 _ht l 5 7 _s
_text _j _m 20,25 0.2 0 {6 7}
_circle 20,25 2 _ht l 6 7 _s
_text _j _m 25,25 0.2 0 {7 7}
_circle 25,25 2 _ht l 7 7 _s
_text _j _m 30,25 0.2 0 {8 7}
_circle 30,25 2 _ht l 8 7 _s
_text _j _m 35,25 0.2 0 {9 7}
_circle 35,25 2 _ht l 9 7 _s
_text _j _m 40,25 0.2 0 {10 7}
_circle 40,25 2 _ht l 10 7 _s
_text _j _m 45,25 0.2 0 {11 7}
_circle 45,25 2 _ht l 11 7 _s
_zoom _e
Just looking at the output results (extracted manually from the command-line output), we can see the level used and the number of polygons created for each tessellation:
{7 3} (level 5) => 617 polygons.
{8 3} (level 4) => 609 polygons.
{9 3} (level 3) => 271 polygons.
{10 3} (level 3) => 421 polygons.
{11 3} (level 3) => 617 polygons.
{5 4} (level 4) => 761 polygons.
{6 4} (level 3) => 505 polygons.
{7 4} (level 2) => 127 polygons.
{8 4} (level 2) => 177 polygons.
{9 4} (level 2) => 235 polygons.
{10 4} (level 2) => 301 polygons.
{11 4} (level 2) => 375 polygons.
{4 5} (level 4) => 913 polygons.
{5 5} (level 3) => 841 polygons.
{6 5} (level 2) => 199 polygons.
{7 5} (level 2) => 295 polygons.
{8 5} (level 2) => 409 polygons.
{9 5} (level 2) => 541 polygons.
{10 5} (level 2) => 691 polygons.
{11 5} (level 2) => 859 polygons.
{4 6} (level 3) => 673 polygons.
{5 6} (level 2) => 221 polygons.
{6 6} (level 2) => 361 polygons.
{7 6} (level 2) => 533 polygons.
{8 6} (level 2) => 737 polygons.
{9 6} (level 2) => 973 polygons.
{10 6} (level 1) => 41 polygons.
{11 6} (level 1) => 45 polygons.
{3 7} (level 4) => 496 polygons.
{4 7} (level 2) => 181 polygons.
{5 7} (level 2) => 351 polygons.
{6 7} (level 2) => 571 polygons.
{7 7} (level 2) => 841 polygons.
{8 7} (level 1) => 41 polygons.
{9 7} (level 1) => 46 polygons.
{10 7} (level 1) => 51 polygons.
{11 7} (level 1) => 56 polygons.
And here are the patterns, themselves:
Just to see the difference, here are the same tessellations with curved geometry (as per the implementation in the second post in the series). Created using a simple search & replace in the above script, from “_s” to “_c”.
Thinking about future directions for this investigation… (some of which have been suggested by Alex Fielder, after previewing drafts of these posts…)
- Clearly it’d be great to get to 3D and get the results integrated with Inventor and Autodesk’s Simulation (FEA) tools.
- Remaining in 2D, it’d be interesting to see about supporting non-circular boundaries.
- One option for this would be to use the minimal enclosing circle around the geometry as the boundary, and then trim back the results or filter them based on whether they’re inside or outside/intersecting the enclosing geometry.
- Ideally the fill pattern would be generated in a way that followed the shape being filled, rather than relying on a circle at all. That seems more of a stretch, though, given the nature of the geometry.
If you have your own ideas on uses and directions for this implementation, please post a comment!