Next: , Previous: , Up: Top   [Contents][Index]


5 Figure Smalltalk de Dr.Geo

Les Figures Smalltalk de Dr.Geo – (FSD) – sont des figures écrites en langage Smalltalk. Il ne s’agit donc plus de construire une figure à l’aide de l’interface graphique de Dr.Geo mais plutôt de décrire une figure dans le langage Smalltalk. Nous avons apporté le plus grand soin afin que la syntaxe utilisée soit facile et légère.

5.1 Figure Smalltalk par l’exemple

En lui-même Smalltalk est un langage de très haut niveau. Lorsqu’une figure est définie dans ce langage, nous disposons également de toute sa puissance pour par exemple définir récursivement telle partie de la figure, ou bien pour placer aléatoirement certains objets de telle sorte qu’à chaque ouverture de la figure, celle-ci est légèrement différente. Bref, les FSD sont libérées du carcan de l’interface graphique tout en étant renforcées par le langage Smalltalk.

Une FSD est un code source Smalltalk à exécuter dans un espace de travail – workspace. C’est une fenêtre texte depuis laquelle du code Smalltalk est écrit et exécuté. Pour ouvrir un tel espace, faire Ctrl-k lorsque aucune fenêtre n’est sélectionnée. On peut aussi y coller du texte par Ctrl-v. See workspace, pour plus d’information sur cet outil.

Nous allons étudier plusieurs exemples, chacun d’eux sera écrit dans un workspace et exécuté en sélectionnant le code puis la séquence de touches Ctrl-d pour Do-it!17.

Commençons par étudier un exemple simple de FSD :

DrGeoCanvas new

C’est la plus petite FSD que nous puissions définir. Lors de son exécution, celle-ci va simplement créer une nouvelle figure vide. Le canevas Dr.Geo est affiché dans une fenêtre simplifiée puisqu’elle ne comporte pas la barre d’outils, seulement la barre des menus.

Abordons un deuxième exemple :

| c item |
c := DrGeoCanvas new.
item := c point: 1.2 @ -2.
item name: 'A'.

Cette FSD définit une figure avec un point libre A de coordonnées initiales (1,2 ; -2). Quelques explications sur ce code :

Poursuivons avec un troisième exemple :

| c triangle hasard m n p |

triangle := [:p1 :p2 :p3 |
	c segment: p1 to: p2.
	c segment: p2 to: p3.
	c segment: p3 to: p1].
 
hasard := [5 - 10 atRandom].

c := DrGeoCanvas new.
m := c point: hasard value @ 0.
n := c point: 5 @ 0.
p := c point: hasard value @ 3.
triangle value: m value: n value: p.

Cet exemple est particulièrement intéressant, il nous montre trois choses importantes :

  1. L’introduction d’une construction de plus haut niveau, non prévue au départ par Dr.Geo. Ici nous avons défini le bloc de code triangle qui, à partir de trois points, construit le triangle passant par ces trois points. Nous pouvons comparer ceci avec les macro-constructions mais avec une approche différente, orientée programmation.
  2. La définition d’un bloc de code associé, ici nous avons défini hasard qui retourne un nombre entier compris entre -5 et 5. Nous utilisons ce bloc pour placer au hasard certains points de notre figure, ainsi à chaque exécution la figure est légèrement différente.
  3. L’affectation du résultat d’une construction à une variable n’est pas obligatoire, nous l’utilisons lorsque nous souhaitons garder une référence de l’objet créé. Par exemple dans le bloc de code triangle, nous ne gardons pas de référence des segments créés, en revanche lorsque nous définissons nos trois points nous avons besoin de garder une référence dans des variables temporaires. Ainsi, lors de l’utilisation du bloc de code triangle, nous passons en paramètre les variables m, n et p.

Pour clore cette section, voici un dernier exemple :

| c a b d |

c := DrGeoCanvas new.
a := c point: 1@0.
b := c point: 5@0.
d := c line: a to: b.
a color: Color yellow;
   round;
   large.
b hide.
d dashed.

Deux points et une droite sont créés. Ensuite des commandes sont utilisées pour modifier l’aspect des objets, voire pour en cacher.

Nous avons terminé notre petite visite guidée des Figures Smalltalk Dr. Geo. Dans les sections suivantes nous exposons l’ensemble des commandes disponibles pour définir des FSD.

5.2 Méthodes de référence pour les Figures Smalltalk Dr.Geo

Pour construire un objet, vous envoyez un message au canevas l’objet construit est édité en lui envoyant des messages spécifiques.

Cependant, avant tout ajout d’un objet dans un canevas, ce dernier doit être créé avec la commande DrGeoCanvas new.

5.2.1 Commandes générales

Method on DrGeoCanvas: <DrGeoCanvas> new

⇒ Canevas et affiche celui-ci dans une fenêtre. Le résultat est nécessaire pour créer des objets dans ce canevas, il est donc important de le placer dans une variable.

| canvas |
canvas := DrGeoCanvas new.
Method on DrGeoCanvas: do: bloc

bloc, bloc de code Smalltalk contenant des instructions de construction et/ou d’animation de la figure interactive.

Exécute le bloc de code dans un processus en tâche de fond. A utiliser lorsque la construction doit se faire sous les yeux de l’utilisateur ou bien lorsque la figure est animée.

| canvas point | 
canvas := DrGeoCanvas new.
point := canvas point: 0@0.
canvas do: [ 
   -5 to: 5 by: 0.1 do: [:x |
      point moveTo: x@(x cos * 3).
      (Delay forMilliseconds: 100) wait.
      canvas update]
]
Method on DrGeoCanvas: update

Mise à jour du canevas après modification d’attributs de quelques items. La plupart du temps ce n’est pas nécessaire.

Method on DrGeoCanvas: fullscreen

La fenêtre du canevas est étendue pour couvrir tout l’écran.

Method on DrGeoCanvas: gridOn

Affiche la grille du canevas.

Method on DrGeoCanvas: centerTo: aPoint

aPoint, coordonnées d’un point.

Le canevas est décalé afin d’afficher le point donné en argument au centre de la fenêtre du canevas.

canvas centerTo: 5@0
Method on DrGeoCanvas: scale: anInteger

anInteger, échelle du canevas. Une unité représente approximativement 1 pixel.

Modifie l’échelle du canevas.

canvas scale: 10

Point.

Method on DrGeoCanvas: <DrGWrappedPoint> point: pointOuBloc

pointOuBloc, un couple de coordonnées (x,y) ou un bloc de code retournant un couple de coordonnées. Dans le deuxième cas, le bloc est exécuté à chaque fois que les coordonnées du point sont demandées.

⇒ référence d’un point libre du plan de coordonnées pointOuBloc

| fig |
fig := DrGeoCanvas new.
fig point: 5@2.
fig point: [ 5 atRandom @ 5 atRandom ].
Method on DrGeoCanvas: <DrGWrappedPoint> pointX:Y: v1 v2

v1, un objet valeur

v2, une objet valeur

⇒ référence d’un point contraint par ses coordonnées

canvas 
   pointX: (canvas freeValue: 2) hide 
   Y: (canvas freeValue: 5) hide.
Method on DrGeoCanvas: <DrGWrappedPoint> pointOnCurve:at: curve a

curve, référence d’une ligne (droite, demi-droite, segment, etc.)

a, abscisse curviligne du point libre, la valeur est normalisée sur [0 ; 1]

⇒ référence d’un point libre sur une ligne

myPoint := canvas pointOnCurve: s1 at: 0.5.
Method on DrGeoCanvas: <DrGWrappedPoint> middleOf:and: p1 p2

p1, référence d’un point ou d’un couple de coordonnées

p2, référence d’un point ou d’un couple de coordonnées

⇒ référence du milieu des deux points

| a i |
a := canvas point: 1@1.
i := canvas middleOf: a and: 4@4.
Method on DrGeoCanvas: <DrGWrappedPoint> middleOf: s

s, référence d’un segment

⇒ référence du milieu du segment

canvas middleOf: s.
Method on DrGeoCanvas: <DrGWrappedPoint> intersectionOf:and: l1 l2

l1, référence d’une ligne

l2, référence d’une ligne

⇒ référence du point d’intersection des deux lignes

canvas intersectionOf: droite and: segment
Method on DrGeoCanvas: <DrGWrappedPoint> altIntersectionOf:and: l1 l2

l1, référence d’une ligne

l2, référence d’une ligne

⇒ référence de l’autre point d’intersection des deux lignes, lorsqu’il existe

canvas altIntersectionOf: droite and: circle.
Method on DrGeoCanvas: <DrGWrappedPoint> point:parent: bloc item

bloc, bloc de code retournant un point

item, référence d’un item géométrique

⇒ référence d’un point dont les coordonnées sont calculées avec le bloc de code ayant comme argument item

| figure s mobile c block |
figure := DrGeoCanvas new.
s := figure segment: -5@0 to: 5@0.
mobile := figure pointOnCurve: s at: 0.1.
block := [:mathItem | |x|
   x := mathItem point x.
   x @ (x * x * x / 25 - x)].
c := figure point: block parent: mobile.
figure locusOf: c when: mobile.
Method on DrGeoCanvas: <DrGWrappedPoint> point:parents bloc liste

bloc, bloc de code retournant un point

liste, une collection d’items géométriques

⇒ référence d’un point dont les coordonnées sont calculées avec le bloc de code ayant comme argument liste

| figure d m p |
figure:=DrGeoCanvas new.
d := figure line: -2 @ 1 to: 3 @ 3.
d color: Color blue.
m := figure point: 1 @ -1.
p := figure 
   point: [:parents | parents first closestPointTo: parents second point]
   parents: {d . m}.

Droite.

Method on DrGeoCanvas: <DrGWrappedCurve> line:to: p1 p2

p1, référence d’un point ou d’un couple de coordonnées

p2, référence d’un point ou d’un couple de coordonnées

⇒ référence d’une droite passant par deux points

| p1 |
p1 := canvas point: 0@0.
canvas line: p1 to: 1@2.
Method on DrGeoCanvas: <DrGWrappedCurve> parallel:at: d p

d, référence d’une direction (droite, segment, vecteur,...)

p, référence d’un point ou d’un couple de coordonnées

⇒ référence d’une droite parallèle à la direction de d et passant par p

| a |
a := canvas point: 1@5.
canvas parallel: d at: a.
Method on DrGeoCanvas: <DrGWrappedCurve> perpendicular:at: d p

d, référence d’une direction (droite, segment, vecteur,...)

p, référence d’un point ou d’un couple de coordonnées

⇒ référence d’une droite perpendiculaire à la direction de d et passant par p

canvas perpendicular: d at: 1@5.
Method on DrGeoCanvas: <DrGWrappedCurve> perpendicularBisector: s

s, référence d’un segment

⇒ référence de la médiatrice du segment s

canvas perpendicularBisector: (canvas segment: 0@0 to: 4@4)
Method on DrGeoCanvas: <DrGWrappedCurve> perpendicularBisector:to: a b

a, référence d’un point ou d’un couple de coordonnées

b, référence d’un point ou d’un couple de coordonnées

⇒ référence de la médiatrice du segment ab

canvas perpendicularBisector: 0@0 to: 4@4
Method on DrGeoCanvas: <DrGWrappedCurve> angleBisector: a

a, référence d’un angle géométrique défini par trois points

⇒ référence de la bissectrice de l’angle a

canvas angleBisector: angle
Method on DrGeoCanvas: <DrGWrappedCurve> angleBisectorSummit:side1:side2 a b c

a,b,c, points définissant l’angle géométrique bac

⇒ référence de la bissectrice de l’angle bac

canvas angleBisectorSummit: 0@0 side1: 1@0 side2: 0@1

Demi-droite.

Method on DrGeoCanvas: <DrGWrappedCurve> ray:to: o p

o, référence d’un point ou d’un couple de coordonnées, origine de la demi-droite

p, référence d’un point ou d’un couple de coordonnées, point de la demi-droite

⇒ référence d’une demi-droite définie par son origine et un point

| a |
a := canvas point: 1@5.
canvas ray: 0@0 to: a.

Segment.

Method on DrGeoCanvas: <DrGWrappedSegment> segment:to: p1 p2

p1, référence d’un point ou d’un couple de coordonnées

p2, référence d’un point ou d’un couple de coordonnées

⇒ référence d’un segment défini par ses extrémités

| a |
a := canvas point: 5@5.
canvas segment: 10@10 to: a.

Cercle.

Method on DrGeoCanvas: <DrGWrappedFilledCircle> circleCenter:to: c p

c, référence d’un point ou d’un couple de coordonnées, centre du cercle

p, référence d’un point ou d’un couple de coordonnées, point du cercle

⇒ référence d’un cercle défini par son centre et un point

| a |
a := canvas point: 1@5.
canvas circleCenter: a to: 10@4.
Method on DrGeoCanvas: <DrGWrappedFilledCircle> circleCenter:radius: c r

c, référence d’un point ou d’un couple de coordonnées, centre du cercle

r, référence d’un item numérique ou d’une valeur numérique, rayon du cercle

⇒ référence d’un cercle défini par son centre et son rayon

| a r |
a := canvas point: 1@5.
r := canvas freeValue: 4.
canvas circleCenter: a radius: r.
canvas circleCenter: 4@4 radius: 5

Arc de cercle.

Method on DrGeoCanvas: <DrGWrappedFinitCurve> arc:to:to: p1 p2 p3

p1, référence d’un point ou d’un couple de coordonnées, 1ère extrémité de l’arc

p2, référence d’un point ou d’un couple de coordonnées de l’arc

p3, référence d’un point ou d’un couple de coordonnées, 2ème extrémité de l’arc

⇒ référence d’un arc de cercle défini par ses extrémités et un point

| a b |
a := canvas point: 1@5.
b := canvas point: 0@5.
canvas arc: a to: b to: -1 @ -2.
Method on DrGeoCanvas: <DrGWrappedFinitCurve> arcCenter:from:to: O A B

O, référence d’un point ou d’un couple de coordonnées, centre de l’arc

A, référence d’un point ou d’un couple de coordonnées, origine de l’arc

B, référence d’un point ou d’un couple de coordonnées, tel que l’angle de l’arc est AOB

⇒ référence d’un arc de cercle défini par son centre et l’angle AOB

| a b |
a := canvas point: 1@5.
b := canvas point: 0@5.
canvas arcCenter: a from: b to: -1 @ -2.

Polygone.

Method on DrGeoCanvas: <DrGWrappedFilledCurve> polygon: collection

collection, une liste de références de points ou de couples de coordonnées ; sommets du polygone

⇒ référence d’un polygone défini par ses sommets

| b |
b := canvas point: 1@3.
canvas polygon: {1@2. b. 0@0. d}
Method on DrGeoCanvas: <DrGWrappedFilledCurve> regularPolygonCenter:vertex:sides: c s n

c, référence d’un point ou d’un couple de coordonnées, centre du polygone

s, référence d’un point ou d’un couple de coordonnées, sommet du polygone

n, référence d’une valeur ou valeur, nombre de sommets du polygone

⇒ référence d’un polygone régulier défini par son centre, un de ses sommets, et son nombre de sommets

| b |
b := canvas point: 1@3.
canvas regularPolygonCenter: b vertex: 1@1 sides: 7.

Les transformations géométriques.

Les transformations géométriques permettent la construction des tranformés d’objets. Elles s’appliquent à des références d’objets de type point, segment, droite, demi-droite, vecteur, cercle, arc de cercle et polygone.

Method on DrGeoCanvas: <DrGWrappedCurve> rotate:center:angle: i c a

i, référence de l’objet à transformer (point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone)

c, référence d’un point ou d’un couple de coordonnées, centre de la rotation

a, référence d’un item valeur ou d’une valeur, angle de la rotation

⇒ référence de l’objet transformé

| c k l |
c := canvas point: 5@5.
k := 3.1415.
l := canvas line: 0@0 to: 5@5.
canvas rotate: l center: c angle: k.
canvas rotate: l center: 0@0 angle: Float pi / 3.
Method on DrGeoCanvas: <DrGWrappedCurve> scale:center:factor: i c k

i, référence de l’objet à transformer (point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone)

c, référence d’un point ou d’un couple de coordonnées, centre de l’homothétie

k, référence d’un item valeur ou d’une valeur, facteur de l’homothétie

⇒ référence de l’objet transformé

| c k l |
c := canvas point: 5@5.
k := -3.
l := canvas line: 0@0 to: 5@5.
canvas scale: l center: c angle: k.
canvas scale: l center: 0@0 angle: 5.
Method on DrGeoCanvas: <DrGWrappedCurve> symmetry:center i c

i, référence de l’objet à transformer (point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone)

c, référence d’un point ou d’un couple de coordonnées, centre de la symétrie

⇒ référence de l’objet transformé

| a |
a := canvas point: 4@2.
canvas symmetry: a center: 0@0
Method on DrGeoCanvas: <DrGWrappedCurve> reflect:axe: i axe

i, référence de l’objet à transformer (point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone)

axe, référence d’une droite, axe de la réflexion

⇒ référence de l’objet transformé

Method on DrGeoCanvas: <DrGWrappedCurve> translate:vector: i v

i, référence de l’objet à transformer (point, segment, droite, demi-droite, vecteur, cercle, arc-cercle, polygone)

v, référence d’un item vecteur ou d’un couple de coordonnées

⇒ référence de l’objet transformé

| u a|
u := canvas vector: 1@1 to: 3@2.
a := canvas translate: (canvas point: 2@1) vector: u
| u a|
a := canvas translate: (canvas point: 2@1) vector: 2@1

Lieu d’un point.

Method on DrGeoCanvas: <DrGWrappedCurve> locusOf:when: c m

m, référence d’un point mobile sur une ligne c, référence d’un point fixe dépendant du point m

⇒ référence d’un lieu

canvas locusOf: p when: mobile

Vecteur.

Method on DrGeoCanvas: <DrGWrappedCurve> vector:to: o e

o, référence d’un point ou d’un couple de coordonnées, origine du vecteur

e, référence d’un point ou d’un couple de coordonnées, extrémité du vecteur

⇒ référence d’un vecteur

| b |
b := canvas point: 0@5.
canvas vector: b to: -1 @ -2
Method on DrGeoCanvas: <DrGWrappedCurve> vector: p

p, référence d’un point ou d’un couple de coordonnées, coordonnées du vecteur

⇒ référence d’un vecteur

| p |
p := canvas point: 5@5.
canvas vector: p.
canvas vector: -5 @ -5

Nombre.

Method on DrGWrappedPoint: <Point> coordinates

⇒ coordonnées (statiques) d’un point

| c p |
p := pointOnCurve: segment at: 0.5.
c := p coordinates.
c x
Method on DrGeoCanvas: <DrGWrappedValue> abscissaOf: item

item, un point ou un vecteur

⇒ abscisse (dynamique) de item

| m x |
m := canvas middleOf: 10@5 and: 7@8.
x := canvas abscissaOf: m
Method on DrGeoCanvas: <DrGWrappedValue> ordinateOf: item

item, un point ou un vecteur

⇒ ordonnée (dynamique) de item

| m x |
m := canvas middleOf: 10@5 and: 7@8.
x := canvas ordinateOf: m
Method on DrGeoCanvas: <DrGWrappedValue> freeValue: v

v, la valeur initiale du nombre

⇒ référence d’un nombre libre

v := canvas freeValue: (-1 arcCos).
v show
Method on DrGWrappedValue: value: aNumber

aNumber, un nombre

Modifie la valeur d’un objet nombre libre

v := canvas freeValue: 3.
v show.
v value: Float pi
Method on DrGeoCanvas: <DrGWrappedValue> lengthOf: item

item, référence d’un segment, cercle, arc ou vecteur

⇒ référence d’un nombre, longueur de l’item

canvas lengthOf: v1
Method on DrGeoCanvas: <DrGWrappedValue> distance:to: item point

item, référence d’une droite ou d’un point

point, référence d’un point

⇒ référence d’un nombre, distance entre deux points ou un point et une droite

d := canvas line: 0@0 to: 1@1.
canvas distance: d to: 12@2.
canvas distance: 0@0 to: 12@2
Method on DrGeoCanvas: <DrGWrappedValue> slopeOf: line

line, référence d’une droite

⇒ référence d’un nombre, pente de la droite

| p |
p := canvas slopeOf: d

Angle.

Method on DrGeoCanvas: <DrGWrappedValue> angle:to:to a b c

a, référence d’un point

b, référence d’un point, sommet de l’angle

c, référence d’un point

⇒ référence d’un angle géométrique abc

canvas angle: a to: b to: c
Method on DrGeoCanvas: <DrGWrappedValue> angle:to: v1 v2

v1, référence d’un vecteur

v2, référence d’un vecteur

⇒ référence d’un angle orienté formé par les deux vecteurs

| v1 v2 a |
v1 := canvas vector: a to: b.
v2 := canvas vector: a to: c.
a := canvas angle: v1 to: v2

Équation.

Method on DrGeoCanvas: <DrGWrappedValue> equationOf: item

item, référence d’une droite ou d’un cercle

⇒ référence d’une équation de la droite ou du cercle

| e d |
d := canvas line: 0@0 to: 15@13.
e := canvas equationOf: e

Texte.

Method on DrGeoCanvas: <DrGWrappedText> text: string

string, une chaîne de caractères

⇒ référence d’un objet texte positionné arbitrairement

canvas text: 'Hello'
Method on DrGeoCanvas: <DrGWrappedText> text:at string point

string, une chaîne de caractères

point, un couple de coordonnées

⇒ référence d’un objet texte positionné à aPoint

canvas text: 'Hello,
je suis heureux !' at: 0@0
Method on DrGWrappedText: text: string

string, une chaîne de caractères

Modifie le texte d’un objet texte

monTexte := canvas text: 'Hello'.
monTexte text: 'Au revoir'

5.2.2 Modification d’attributs d’objets

Pour modifier les attributs d’un objet déjà créé, nous lui envoyons le message approprié. La modification des attributs se fait donc toujours à posteriori.

Method on DrGWrappedItem: color: color

color, une instance de Color, voir ses méthodes de classe pour des définitions existantes : Color black, Color red, Color blue, Color orange, Color yellow,...

Modifie la couleur d’un item

pointA color: Color green
Method on DrGWrappedText: backgroundColor: color

color, une instance de Color

Modifie la couleur d’arrière plan d’un texte

monTexte backgroundColor: Color green
Method on DrGWrappedItem: name: string

string, une chaîne de caractères

Renomme un item

segment name: '[AB]'
Method on DrGWrappedItem: hide

Masque un item

Method on DrGWrappedItem: show

Montre un item

Method on DrGWrappedCurve: small

Donne une épaisseur fine à une ligne (droite, demi-droite, cercle, lieu, etc.)

circle small
Method on DrGWrappedCurve: normal

Donne une épaisseur normale à une ligne (droite, demi-droite, cercle, lieu, etc.)

arc normal
Method on DrGWrappedCurve: large

Donne une épaisseur large à une ligne (droite, demi-droite, cercle, lieu, etc.)

polygon large
Method on DrGWrappedCurve: plain

Donne un style de trait continue à une ligne (droite, demi-droite, cercle, lieu, etc.)

polygon plain
Method on DrGWrappedCurve: dashed

Donne un style de trait en tirets à une ligne (droite, demi-droite, cercle, lieu, etc.)

polygon dashed
Method on DrGWrappedCurve: dotted

Donne un style de trait en pointillés à une ligne (droite, demi-droite, cercle, lieu, etc.)

arc dotted
Method on DrGWrappedPoint: cross

Donne une forme en croix à un point

a := canvas point: 0@0.
a cross
Method on DrGWrappedPoint: round

Donne une forme en rond à un point

a round
Method on DrGWrappedPoint: square

Donne une forme carrée à un point

a square
Method on DrGWrappedPoint: small

Donne une petite taille à un point

a small
Method on DrGWrappedPoint: large

Donne une taille large à un point

a large
Method on DrGWrappedItem: moveTo: point

point, couple de coordonnées

Déplace un point ou une valeur à la position donnée, pour peu que cela ait un sens

| a |
a := canvas point: 0@0.
a moveTo: 5@5.
canvas update

5.2.3 Méthodes complémentaires

La classe DrGeoCanvas propose dans la catégorie helpers des méthodes supplémentaires pour faciliter la réalisation de figures interactives complexes.

Method on DrGeoCanvas: plot:from:to: block x0 x1

block, un bloc de code à un argument décrivant une fonction

x0, nombre, abscisse inférieure de la courbe

x1, nombre, abscisse supérieure de la courbe

Affiche la courbe représentative de la fonction décrite par le bloc de code de x0 à x1

| canvas |
canvas plot: [:x| x * x] from: -3 to: 3
Method on DrGeoCanvas: <BlockClosure> float:at:from:to:name: f1 p f2 f3 s

f1, valeur initiale

p, position du bord gauche de la réglette

f2, valeur minimum

f3, valeur maximum

s, nom de la valeur

⇒ un bloc de code retournant la valeur courante de la réglette

Construis une réglette à la position indiquée avec une plage de valeur dans [f2 ; f3]

A := canvas float: 1 at: -10@4 from: 0 to: 10 name: 'A'.
F := canvas integer: 3 at: -10@3 from: 0 to: 10 name: 'F' showValue: true.
A value + F value

Il existe d’autres variantes, dont certaines pour des nombres entiers.

5.3 Galerie d’exemples

Pour illustrer l’utilisation des Figures Smalltalk Dr.Geo, nous vous proposons une petite série d’exemples. Ceux-ci vous montrent leurs importantes possibilités et nous espérons qu’ils seront également une source d’inspiration. Pour chacun de ces exemples, nous donnons le code source Smalltalk de la figure puis son résultat. Le code source doit être copié dans un workspace de l’environnement de Dr.Geo puis exécuté.

5.3.1 Animer une figure

Ces exemples s’appuient sur la gestion du temps et celle des processus programmés en Smalltalk.

Un premier exemple simple pour comprendre le principe :

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

Un deuxième exemple avec une figure plus élaborée :

| figure s r u pause |
figure := DrGeoCanvas new fullscreen.
s := figure segment: 0@ -1 to: 4@ -1.
r := figure pointOnCurve: s at: 0.8.
s := figure segment: 0@0 to: 0@1.
u := figure pointOnCurve: s at: 0.7.
u round small; 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; color: Color blue].
pause := Delay forSeconds: 0.1.
figure do: [
   0 to: 1 by: 0.05 do: [:x | 
      r mathItem setCurveAbscissa: x.
      figure update.
      pause wait]]

5.3.2 Triangle de Sierpinski

Cet exemple s’appuie largement sur un bloc de code récursif.

| triangle c |
triangle := [:s1 :s2 :s3 :n |
    c segment: s1 to: s2;
        segment: s2 to: s3;
        segment: s3 to: s1.
    n > 0 ifTrue:
        [triangle
            value: s1
            value: (c middleOf: s1 and: s2) hide
            value: (c middleOf: s1 and: s3) hide
            value: n-1.
        triangle
            value: (c middleOf: s1 and: s2) hide
            value: s2
            value: (c middleOf: s2 and: s3) hide
            value: n-1.
        triangle
            value: (c middleOf: s1 and: s3) hide
            value: (c middleOf: s2 and: s3) hide
            value: s3
            value: n-1.]].

c := DrGeoCanvas new.
triangle
    value: (c point: 0 @ 3)
    value: (c point: 4 @ -3)
    value: (c point: -4 @ -3)
    value: 3.
fig59

Figure 5.1: Triangle de Sierpinski


Footnotes

(17)

Alternativement, c’est l’entrée à choisir dans le menu contextuel de l’espace de travail.

(18)

Des instances de classes qui représentent des objets géométriques.


Next: , Previous: , Up: Top   [Contents][Index]