Spirale d'or

 

ulis, le 11-07-2005. La spirale d'or est une approximation de la spirale logarithmique utilisée par le nautile pour construire sa coquille.


Pourquoi

C'est tellement facile avec le canvas !


Comment

Prenez un rectangle d'or. Coupez-le en carrés. Ornez chaque carré d'un quart de cercle. N'oubliez pas de tourner.


Pour les matheux

Le rectangle d'or a ses côtés dans un rapport égal à PHI. PHI est le nombre d'or : (1 + sqrt(5)) / 2 ou 1.6180339...

La spirale logarithmique approximée par la spirale d'or a pour équation polaire : ro = a * phi ^ (theta / (pi/2))

Les diagonales des rectangles d'or se coupent au point limite.


Le script

  # packages

  package require Tk

  # parameters

  set width 400
  set x     1
  set y     1
  set theta -90
  set trace 1

  # create canvas

  set PHI [expr {(1 + sqrt(5)) / 2}]
  set height [expr {$width / $PHI}]

  set width2 [expr {$width + 2 * $x}]
  set height2 [expr {$height + 2 * $y}]
  canvas .c -width $width2 -height $height2 \
    -bd 0 -highlightt 0
  pack .c

  # fill it

  set coef  1
  while {$width > 1} \
  {
    # 1
    if {$trace} \
    {
      set xr [expr {$x + $coef * $width}]
      set yr [expr {$y + $coef * $height}]
      .c create rectangle $x $y $xr $yr -outline gray60
    }
    set xd [expr {$x + 2 * $coef * $height}]
    set yd [expr {$y + 2 * $coef * $height}]
    incr theta -90
    .c create arc $x $y $xd $yd  \
      -start $theta -extent -90 -style arc
    set x [expr {$x + $coef * $width}]
    set width [expr {$width - $height}]
    # 2
    if {$trace} \
    {
      set xr [expr {$x - $coef * $width}]
      set yr [expr {$y + $coef * $height}]
      .c create rectangle $x $y $xr $yr -outline gray60
    }
    set xd [expr {$x - 2 * $coef * $width}]
    set yd [expr {$y + 2 * $coef * $width}]
    incr theta -90
    .c create arc $x $y $xd $yd  \
      -start $theta -extent -90 -style arc
    set y [expr {$y + $coef * $height}]
    set height [expr {$height - $width}]
    set coef [expr {$coef * -1}]
  }

La spirale logarithmique

  # packages

  package require Tk

  # create canvas

  canvas .c -bd 0 -highlightt 0
  pack .c

  # fill it

  set pi2 [expr {acos(0)}]
  set delta 1.e-3
  set k 5

  for {set theta 0} {$theta < 8 * $pi2} {set theta [expr {$theta + $delta}]} \
  {
    set ro [expr {$k * exp(0.5 * $theta / $pi2)}]
    set x [expr {-int($ro * cos($theta))}]
    set y [expr {int($ro * sin($theta))}]
    .c create line $x $y [incr x] [incr y]
  }

  # show it

  foreach {x0 y0 x1 y1} [.c bbox all] break
  set dx [expr {-$x0}]
  set dy [expr {-$y0}]
  .c move all $dx $dy
  set width [expr {abs($x1 - $x0)}]
  set height [expr {abs($y1 - $y0)}]
  .c config -width $width -height $height

Voir aussi


Catégorie Exemple | Catégorie Mathématiques