Version 4 of Producing a fractal convex solid

Updated 2003-05-08 07:31:12

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)


# 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