Version 6 of Producing a fractal convex solid

Updated 2003-05-08 07:33:29

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 ...


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)


 # 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
 }  

Category Mathematics