Un oeuf de Pâques

 

ulis, 2006-09-02. Un joli oeuf de Pâques dans son papier alu.

Le papier et l'oeuf.


Pourquoi

Parce je me suis longtemps demandé comment faire l'oeuf (oui, j'ai trouvé ;-).


Comment

Finalement un oeuf c'est un ellipsoïde révolutionnaire : il devient plus étroit. Donc on remplace l'équation de l'ellipse :

a x² + b y² = 1

par l'équation de l'oeuf :

a (1 + ky) x² + b y² = 1


Script

  # #########################
  #
  # Un oeuf de Pâques
  #
  # (c) ulis, 2006
  # licence NOL
  # #########################

  package require Tk
  # image : http://wfr.tcl.tk/fichiers/images/ulis/pavage.gif
  set pavage [image create photo -file pavage.gif]

  set width 200
  set height 250
  set ove 0.25
  set xl -0.25
  set yl -0.25

  set w2 [expr {$width / 2}]
  set h2 [expr {$height / 2}]
  set dx [expr {1.0 / $w2}]
  set dy [expr {1.0 / $h2}]
  set zl [expr {sqrt(1.0 - ($xl * $xl + $yl * $yl))}]
  set data [list]
  for {set i 0} {$i < $height} {incr i} \
  {
    set row [list]
    set y [expr {$dy * $i - 1.0}]
    set coef [expr {double($height - $i) / $height}]
    for {set j 0} {$j < $width} {incr j} \
    {
      set x [expr {$dx * $j - 1.0}]
      set x [expr {$x * (1 + $ove * $coef)}]
      set d2 [expr {$x * $x + $y * $y}]
      if {$d2 > 1.0} \
      {
        set z 0.0
        foreach {R G B} {0 0 0} break
      } \
      else \
      {
        set z [expr {0.8 * sqrt(1.1 - $d2)}]
        set c [expr {$xl * $x + $yl * $y + $zl * $z}]
        set c [expr {int(64 + 192 * $c)}]
        foreach {R G B} [$pavage get $j $i] break
        foreach C {R G B} \
        {
          set v [set $C]
          set v [expr {$v * $c / 200}]
          if {$v > 255} { set v 255 }
          set $C $v
        }
      }
      set pixel [format #%2.2x%2.2x%2.2x $R $G $B]
      lappend row $pixel
    }
    lappend data $row
  }

  set img [image create photo]
  $img put $data
  for {set i 0} {$i < $height} {incr i} \
  {
    for {set j 0} {$j < $width} {incr j} \
    {
      if {[lindex $data $i $j] == "#000000"} \
      { $img transparency set $j $i 1 }
    }
  }
  canvas .c -width $width -height $height \
    -bd 0 -highlightt 0
  .c create image $w2 $h2 -image $img
  grid .c

Pour faire l'oeuf

  # #########################
  #
  # Un oeuf (cru)
  #
  # (c) ulis, 2006
  # licence NOL
  # #########################

  package require Tk

  set width 200
  set height 250
  set k 0.25

  set dx [expr {2.0 / $width}]
  set dy [expr {2.0 / $height}]
  set data [list]
  for {set i 0} {$i < $height} {incr i} \
  {
    set y [expr {($dy * $i) - 1.0}]
    set row [list]
    for {set j 0} {$j < $width} {incr j} \
    {
      set x [expr {($dx * $j) - 1.0}]
      set d [expr {(1 + $k * $y) * $x * $x + $y * $y}]
      set pixel [expr {abs($d - 1) < 1.e-2 ? "#888" : "#fff"}]
      lappend row $pixel
    }
    lappend data $row
  }
  set img [image create photo]
  $img put $data
  label .l -image $img
  grid .l

Voir aussi


Discussion


Catégorie Exemple | Catégorie Mathématiques