Dr. Geo 16.03

18
26
mar.
2016
Éducation

Dr. Geo est un environnement libre de géométrie interactive et de programmation. Il est aussi bien destiné à un public jeune de l'école primaire ou du secondaire I, qu'à des plus grands pour expérimenter la géométrie et/ou la programmation. Il est propulsé par l'environnement de développement dynamique Pharo, supporté par l'INRIA/RMOD.

Une figure récursive programmée avec Dr. Geo

Cette version apporte quelques fonctions supplémentaires mais surtout plusieurs correctifs dans l'utilisation des figures programmées.

Dr. Geo est donc plus sûr dans la conception de figures interactives codées. Lorsque conçues de façon itératives, ces figures comptent plusieurs milliers d'objets.

Quelques exemples de figures programmées

Les échantillons sont présentés avec le code source et son résultat après exécution du code. Les constructions sont toutes récursives et les figures obtenues sont déformables interactivement.

Fractale de Koch

  | canvas koch |
canvas := DrGeoCanvas new fullscreen. 
koch := [ ].
koch := [ :a :b :k | |ab c d v |
    k > 0 ifTrue: [ 
        ab := (canvas segment: a to: b) hide.
        c := (canvas pointOnCurve: ab at: 1 / 3) hide.
        d := (canvas pointOnCurve: ab at: 2 / 3) hide.
        v := (canvas 
        altIntersectionOf: (canvas perpendicularBisector: ab) hide 
        and: (canvas circleCenter: c to: d) hide) hide.
        koch value: a value: c value: k - 1. 
        koch value: c value: v value: k - 1. 
        koch value: v value: d value: k - 1.
        koch value: d value: b value: k - 1].
    canvas segment: a to: b].
koch 
    value: ((canvas point: -8@3) name: 'A')
    value: ((canvas point: 8@3) name: 'B')
    value: 5

Fractale de Koch

Spirale de Fibonacci

  |canvas shape alfa fibo a b m s|
canvas := DrGeoCanvas new fullscreen.
alfa := (canvas freeValue: -90 degreesToRadians) hide.
shape := [:c :o :f| | e p |
   e := (canvas rotate: o center: c angle: alfa) hide.
   (canvas arcCenter: c from: o to: e) large.
   p := canvas translate: e vector: (canvas vector: c to: o) hide.
   (canvas polygon: { c. o. p hide. e }) name: f.
   e].
fibo := [ ].
fibo := [ :f :o :c :k | | e f1 f2 f3|
"f1: term Fn-1, f2: term Fn, o & c: origin and center of spiral arm
e: extremity of the spiral arm"
   f1 := f first.
   f2 := f second.
   f3 := f1 + f2.
   e := shape value: c value: o value: f2. 
   c := (canvas scale: c center: e factor: f3 / f2) hide.
   k > 0 ifTrue: [ 
      fibo value: {f2. f3} value: e value: c value: k - 1 ]].
a := canvas point: 1@0.
b := canvas point: -1 @0.
m := (canvas middleOf: a and: b) hide.
s := shape value: m value: a value: 1.
shape value: m value: s value: 1.
fibo value: {1. 2} value: b value: a value: 10

Spirale interactive de Fibonacci

Sierpinski dragon

  | canvas dragon rec|
canvas := DrGeoCanvas new fullscreen. 
dragon := [  ].
dragon := [ :a :b :k | | c m n |
    k > 0 ifTrue: [ 
        c := canvas 
            altIntersectionOf: (canvas circleCenter: a to: b) hide
            and: (canvas circleCenter: b to: a) hide.
        c hide.
        m := (canvas middleOf: a and: c) hide.
        n := (canvas middleOf: b and: c) hide.
        dragon value: m value: a value: k - 1.  
        dragon value: m value: n value: k - 1.  
        dragon value: b value: n value: k - 1].
    k = 0 ifTrue: [ canvas segment: a to: b ].
].  

rec := 5.
canvas text: 'Sierpinski Dragon, recursion: ', rec printString at: 0@0.
dragon value: (canvas point: -4@1.5) value: (canvas point: 4@1.5) value: rec

Sierpinski dragon

Branches

  | canvas branch alfa beta gamma delta|
canvas := DrGeoCanvas new fullscreen.
alfa := (canvas freeValue: 135 degreesToRadians) hide.
beta := (canvas freeValue: 202.5 degreesToRadians) hide.
gamma := (canvas freeValue: 68.5 degreesToRadians ) hide.
delta := (canvas freeValue: 157.5 degreesToRadians ) hide.

branch := [  ].
branch := [ :a :b :k | | m am mb c d e bc cd de f g h bf fg gh |
    m := (canvas middleOf: a and: b) hide.
    am := canvas segment: a to: m.
    mb := canvas segment: m to: b.
    ""
    c := (canvas rotate: m center: b angle: alfa) hide.
    d := (canvas rotate: b center: c angle: beta) hide.
    e := (canvas rotate: c center: d angle: beta) hide.
    bc := canvas segment: b to: c.
    cd := canvas segment: c to: d.
    de := canvas segment: d to: e.
    ""
    f := (canvas rotate: c center: b angle: gamma) hide.
    g := (canvas rotate: b center: f angle: delta) hide.
    h := (canvas rotate: f center: g angle: delta) hide.
    bf := canvas segment: b to: f.
    fg := canvas segment: f to: g.
    gh := canvas segment: g to: h.
    k > 0 ifTrue: [ 
        branch value: a value: m value: k - 1.
        branch value: m value: b value: k - 1.
        branch value: b value: c value: k - 1.
        branch value: c value: d value: k - 1.
        branch value: d value: e value: k - 1.
        branch value: b value: f value: k - 1.
        branch value: f value: g value: k - 1.      
        branch value: g value: h value: k - 1.
    ]
].

branch value: (canvas point: 0 @ -2) value: (canvas point: 0 @ 1) value: 3

Branches

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.