Community‎ > ‎

Discussions

Discussions collects ideas and suggestions regarding Dr. Geo use and evolution.


Ce sont pour l'instant des notes suite à des échanges avec Alain. Nous les archivons ici car utiles pour d'autres.

Sur la hiérarchie de classe mathItem

DrGWrappedPoint

Le script qui marche pas est ici:
| figure fonction m p a b s r xm y|

fonction := [:x | x*x*x/25-x].

figure := DrGeoCanvas new.

a:=figure point: -5@0.
b:=figure point: 5@0.
s:=figure segment: a to: b.
xm:=figure m point x.

m est en effet un wrapped item, tu n'as pas accès directement à l'item mathématique (le modèle) mais à une encapsulation pour faciliter les manipulations lors de l'écriture des figures programmées Pour accéder au modèle, tu envoies le message mathItem à m, cela donne donc pour la dernière ligne: xm := m mathItem point x

Pour prendre connaissance de l'ensemble du protocole de DrGWrappedPoint, dans un workspace Smalltalk (ce que tu appelles un éditeur texte) tu écris le nom de cette classe DrGWrappedPoint, le sélectionne à la souris et fait Ctrl-b, puis dans le navigateur de classes alors affiché tu cliques sur le bouton hierarchy.

Exemples illustrant l'intérêt des points par bloc

Je me suis mis à réfléchir à des choses qu'on ne pouvait pas faire avant et qu'on peut faire maintenant:

Boucle à grand nombre de répétitions

On peut faire avec des macros mais on fatigue vite. J'ai voulu représenter graphiquement la fonction de Riemann, ça marche même très vite:

|figure a b s m n bloc|
figure:=DrGeoCanvas new.
a:=figure point: -5@0.
b:=figure point: 5@0.
s:=figure segment: a to: b.
m:=figure pointOnCurve: s at: 0.1.
bloc:=[:p| |x y|
x:=p point x.
y:=0.
(1 to: 200) do: [:k|
y:=y+(((x *k*k) sin)/(k*k)).].
x@y].
n:=figure point: bloc parent: m.
figure locusOf: n when: m.

Boucles à condition d'arrêt

Là je doute fort qu'on puisse y arriver autrement; j'ai testé la méthode de Heron, avec ça:

|figure a b s m n bloc|
figure:=DrGeoCanvas new.
a:=figure point: 0@0.
b:=figure point: 10@0.
s:=figure segment: a to: b.
m:=figure pointOnCurve: s at: 0.1.
bloc:=[:p| |u v t r|
u:=1.
r:=p point x.
v:=r.
[(u-v) abs >0.001]
whileTrue:
[t:=(u+v)/2.
u:=t.
v:=r/t.].
r@u].
n:=figure point: bloc parent: m.
s:=figure locusOf: n when: m.
s color: Color blue.

Bien entendu on peut aller plus loin soit en représentant la fonction racine carré en plus, soit en représentant seulement l'erreur d'approximation.

Mon prochain délire: Regarder si on peut faire des animations avec la fonction Delay (trouvée en débuguant)

Alain

Animer une figure programmée

Pour Delay j'ai pas réussi à faire les animations que je voulais, les pauses ralentissent bien le programme mais le rafraichissement de la figure ne se fait pas pendant l'animation, ce qui fait qu'on ne voit rien bouger. Tant pis...

Voici une possibilité, il en existe sans aucun doute d'autres:

|figure p pause|
figure:=DrGeoCanvas new.
p := figure point: 0@0.
pause := Delay forSeconds: 0.2.
[100 timesRepeat: [
p mathItem moveTo: (p mathItem point + (0.1@0)).
figure domain updateAllMathItems.
pause wait]
] fork

Pendant l'animation, le canvas peut-être modifié.

Un autre exemple :

|figure s r u pause|
figure:=DrGeoCanvas new.
s:=figure segment: (figure point: 0@(-1)) to: (figure point: 4@(-1)).
r:=figure pointOnCurve: s at: 0.8.
s:=figure segment: (figure point: 0@0) to: (figure point: 0@1).
u:=figure pointOnCurve: s at: 0.7.
u round small.
u color: Color blue.
1 to: 100 do: [:n|
u:=figure point: [:parents| |y t|
y:=parents first point y.
t:=parents second point x.
(n/5)@t*y*(1-y)]
parents: {u.r}.
u round small.
u color: Color blue.
].
pause := Delay forSeconds: 0.1.
[0 to: 1 by: 0.05 do:[:x |
r mathItem setCurveAbscissa: x.
figure domain updateAllMathItems.
pause wait]
] fork


Fantastique! C'est le rafraichissement par fork qui me manquait! L'animation automatique de curseurs est très puissante en termes d'ergonomie. Voici l'exemple auquel je pensais, dans son contexte: [1].

Alain