Producing a fractal convex solid

Arjen Markus (7 may 2003) Have you ever seen the set of Pythagorean (regular) solids? Or the Archimedean solids that consist of two types of regular polygons? I find them fascinating - both with plain faces or as an Escher drawing.

Keith Vetter produced a script that helps you create them from paper. So I am not the only one. KPV Thanks, see Polyhedron Nets.

Here is my idea of producing a completely different type of solid. It is convex and it has all the characteristics of a fractal - that is: features that are repeated on ever smaller scales.

This is the procedure:

  1. Take a Pythagorean solid - say a cube with a side of 1.
  2. Cut off all corners, by removing a pyramid of side approximately 1/3 (*) (difficult to draw with plain text and I have not written a script yet to show the process)
  3. This leaves an isosceles triangle as a new face and three new corners for each corner that was removed.
  4. The original squares are now turned into regular octagons with side approximately 1/3. (This polyhedron is called a truncated cube, and you can see a picture of it at [L1 ]. KPV)
  5. In the next round, cut off all the new corners again - by removing a pyramid of side 1/3 of the current side, so 1/9 of the original.
  6. We now end up with a solid that has hexadecagons (16-gons), hexagons and triangles as faces - all regular with a side of approximately 1/9.
  7. We can repeat the process ''ad inifinitum".

When we are done (in maths anything can be done, or at least imagined), we have a solid whose every face is a circle! Admittedly, there will be large circles and smaller ones, but there is no angular corner left.

Unless this kind of solid is already described, I claim the name Markus solid for this construction (or perhaps, to make sound more classic, Adrianic solid).

What I have not done yet, is concoct a script that will show the process step by step ...

(*) The approximate factor 1/3 is actually 1-sqrt(2)/2. Just apply Pythagoras' famous theorem ...


Lars H: I doubt there is anything properly factal about the limit solid of this process -- all scaling factors seem to be nice integer powers of the length scaling factor, thus making the page title quite incorrect -- but that doesn't mean the solids produced are uninteresting.

The basic procedure of cutting off corners to produce new facets is certainly not a new one, and it has some interesting applications. One of the 1001 things that were shown to be equivalent to the Four Colour Conjecture of graph theory (this was way before the famous computer-assisted proof of Appel and Haken made it necessary to rename this statement the Four Colour Theorem) was that there, for any convex solid, is some sequence of "cutting off a vertex" operations that will produce a solid in which all facets have a number of edges that is divisible by 3. In the case of the cube, one such sequence is to cut off four of the original vertices (four vertices without common edges) of the cube, thus producing a solid with six hexagons (the original facets) and four triangles.

AM You may be right about it not turning out to be a proper fractal, but if it is, it is a convex one, and I do not know of any others :) Integer powers are however no guarantee that things are not a fractal - just think of the Cantor dust, the number of intervals at each time is a power of 2, yet the fractal dimension is something like ln(2)/ln(3) IIRC.

Still, you have a point.

Lars H: By "integer powers of the length scaling factor", I meant that the exponent was an integer. In the case of the classical Cantor set, the exponent is indeed the non-integer ln(2)/ln(3).


AM Okay, I could not stand it not having a script to illustrate the process. So here, in two dimensions (which is a lot easier than 3!) is the illustration.

You may try different values of the parameter alpha - especially 0.5 and 0.7 surprised me (0.5 because I thought the thing would disappear and 0.7 because, well, see for yourself)

You may also try other polygons, as the algorithm is very general (for 2D at least)

alpha = 0.75 gives a celtic-like design (thanks to Pat Thoyts)

I have not tried a negative value yet, but that would probably not give essentially different patterns.

The 3D equivalent is not as complicated as I thought - I have a sketch of the algorithm, but not yet a script.


 # Script ad hoc: illustrate the truncation of polygons
 # (to be extended to polyhedra)
 #
 proc truncatePolygon { alpha coords } {
    set new_coords {}

    set nocoords [llength $coords]

    set xend [lindex $coords end-1]
    set yend [lindex $coords end]
    for { set i 0 } { $i < $nocoords } { incr i 2 } { 
       set xbgn $xend
       set ybgn $yend

       set xend [lindex $coords $i]
       set yend [lindex $coords [expr {$i+1}]]

       set xnew1 [expr {$xbgn + $alpha*($xend-$xbgn)}]
       set ynew1 [expr {$ybgn + $alpha*($yend-$ybgn)}]
       set xnew2 [expr {$xend + $alpha*($xbgn-$xend)}]
       set ynew2 [expr {$yend + $alpha*($ybgn-$yend)}]

       lappend new_coords $xnew1 $ynew1 $xnew2 $ynew2 
    }

    return $new_coords
 }

 proc drawPolygon { coords generation } {
    .c delete all

    .c create text   200 10 -text "Generations to go: [expr {$generation-1}]" -fill black
    .c create polygon $coords -fill green -outline black
 }

 proc truncateAndDraw { generation } {
   
    if { $generation > 0 } {
       set ::coords [truncatePolygon $::alpha $::coords]
       drawPolygon $::coords $generation
       
       after 1000 [list truncateAndDraw [incr generation -1]]
    }
 }

 #
 # Main code: set up the canvas and loop a number of times
 #

 canvas .c -width 400 -height 420 -background white
 pack   .c -fill both

 #
 # Global data ...
 #
 set coords {10 30 390 30 390 410 10 410}
 set alpha  [expr {1.0-sqrt(2.0)/2.0}]
 #set alpha 0.5
 #set alpha 0.7

 drawPolygon $coords 10
 after 1000 {
    truncateAndDraw 10
 }