Programmation objet et géométrie/Objets géométriques de DrGeoII

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

Puisque Smalltalk est un langage objet et que Dr. Geo II est écrit en Smalltalk, tous les outils géométriques de DrGeoII sont des objets, y compris les transformations, y compris d'ailleurs DrGeoII lui-même. Ce qui distingue DrGeoII des autres logiciels de géométrie dynamique, c'est la façon dont les objets héritent les uns des autres (la hiérarchie).

Lignes droites[modifier | modifier le wikicode]

Ainsi, sous DrGeoII, l'objet droite par 2 points hérite de l'objet droite (c'est-à-dire comme on va le voir ci-dessous, que certaines de ses propriétés lui viennent du fait que c'est une droite), lequel hérite de l'objet direction (à l'instar des demi-droites, vecteurs et segments), lequel hérite de l'objet courbe...

Droites[modifier | modifier le wikicode]

Comment se fait-il que DrGeoII n'ait pas seulement un objet droite? Y at-il d'autres objets qui héritent de l'objet droite, que l'objet droite par 2 points?. Bien entendu: La parallèle à une droite par un point et la perpendiculaire à une droite par un point sont aussi des droites! Ces deux objets héritent donc également de l'objet droite, sans pour autant être des droites par deux points (sous DrGeoII, l'objet direction est défini par un point et un vecteur, autrement dit, par une équation paramétrique).

Équation réduite[modifier | modifier le wikicode]

Tout d'abord, un exercice simple et pas tellement géométrique:

Écrire l'équation réduite de la droite passant par les points A(-2;1) et B(3;3).

Un algorithme relativement simple, trouvé par un élève de Seconde, est le suivant:

  1. Calculer, à partir des coordonnées de A et B, le coefficient directeur de la droite (AB);
  2. Calculer l'ordonnée à l'origine p avec la formule p=y-mx.
  3. Regrouper les informations obtenues aux points précédents pour avoir l'équation réduite et afficher celle-ci.

Les variables m et p sont destinées à stocker les coefficients de l'équation réduite, d'abord numériquement, puis sous forme de chaînes de caractères. Avec ces chaînes de caractères, on va fabriquer par concaténation l'équation e et elle sera affichée à l'endroit où l'utilisateur aura cliqué.

Mais pour éviter de multiplier le nombre de variables, m sera au début le vecteur directeur de la droite, obtenu par droite direction; et p commencera sa vie comme le point d'abscisse 0.5 sur la droite (dans un repère lié à la droite). Le script suivant, dès qu'on a cliqué sur une droite, attend l'endroit de la figure où il va afficher son équation réduite. L'intérêt essentiel est que si on bouge les points qui définissent la droite, on a une mise à jour automatique de l'équation réduite:

eqred: droite
	"équation réduite de la droite"

	|m p e|
	m:=droite direction.
	m:=m y/(m x).
	p:=droite pointAt: 0.5.
	p:=(p y-m*(p x)).
	m:=m asString.
	p:=p asString.
	e:='y=',m,'x+(',p,')'.
	^ e.

Son exécution produit la figure suivante, où la cerise sur le gâteau est que les nombres sont donnés sous forme de fraction, donc en valeur exacte:

DroiteDrGeo1.png

Intersection[modifier | modifier le wikicode]

Un autre exercice relativement simple: Résoudre le système suivant:

Comme DrGeoII est un logiciel de géométrie dynamique, on va résoudre le système graphiquement. Mais par des scripts. Le plus long c'est encore l'écriture des équations cartésiennes, avec un script analogue à celui ci-dessus pour les équations réduites. On utilise les variables a, b et c pour les coefficients de l'équation ax+by=c et e pour l'équation elle-même. Mais c est utilisée pour stocker temporairement le vecteur directeur à partir duquel on récupère a et b:

equation: droite
	"équation cartésienne"

	| a b c e|
	c:=droite direction.
	a:=c y negated.
	b:=c x.
	c:=droite pointAt: 0.5.
	c:=a*(c x)+(b* (c y)).
	a:=a asString.
	b:=b asString.
	c:=c asString.
	e:=a,'x + (',b,') y = ',c.
	^ e.

L'exécution de ce script produit, après le choix d'une droite, l'écriture de son équation cartésienne. On va donc l'exécuter sur chacune des droites pour avoir successivement les deux équations.

Pour construire l'intersection, pas besoin de script puisqu'il suffit d'utiliser l'outil adéquat de DrGeoII; le script suivant va juste afficher ses coordonnées sous forme d'une chaîne de caractères (une fois qu'on l'a sélectionné):

affichage: p
	| nom|
	nom:='(',(p point x asString),';',(p point y asString),')'.
	^ nom.

Le résultat final ressemble à ceci:

DroiteDrGeo2.png

et si on bouge les points qui définissent les droites, les coordonnées du point d'intersection sont affichées sous forme de fractions.

Segments[modifier | modifier le wikicode]

Une conséquence de leur lien de parenté (ils héritent tous de l'objet direction) est que le segment [AB], la demi-droite [AB) et la droite (AB) ont exactement la même représentation paramétrique:

Seulement:

  • pour le segment;
  • pour la demi-droite;
  • pour la droite.

Une propriété importante de l'objet segment est sa longueur, qui permet (parce qu'elle est numérique et qu'on peut l'afficher ou effectuer des calculs dessus) de faire des conjectures sur la nature d'un triangle.

Projeté orthogonal[modifier | modifier le wikicode]

Parmi tous les points d'une droite (AB), il y en a un qui est le plus proche d'un point M donné. DrGeoII est capable de le construire:

|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: [:prts | prts first closestPointTo: prts second point]
        parents: {d. m}.
p color: Color cyan.

Quelques explications sur cette figure (où le projeté orthogonal est dynamique, au sens où on peut déplacer les éléments de la figure et voir le point le plus proche évoluer):

La fonction fonction utilisée tout en bas de l'article est un bloc de Smalltalk, c'est-à-dire une sorte d'algorithme créé à la volée et qui ne se met en route que lorsqu'on en a besoin. Sa définition est formée de deux parties, séparées par un trait vertical: La première partie est la liste des variables du bloc, ici la seule variable x; et la seconde partie décrit ce qui se passe lorsqu'on réveille le bloc en le chatouillant (et il est très chatouilleux!). En fait la boucle sur x dans la création du polygone est aussi un bloc, où il n'y a encore que la variable x mais où il se passe plusieurs choses (création d'un point, dissimulation de celui-ci, et ajout du point à la liste des sommets).

Et bien depuis mars 2011, les coordonnées d'un point peuvent aussi être définies par un bloc! Ici le bloc a une seule variable prts et produit le point du premier élément de prts qui soit le plus proche du second élément de prts (un point en l'occurence). Ce bloc est appliqué aux parents de prts qui sont définis somme d (la droite) et m (le point courant).

Transformations[modifier | modifier le wikicode]

On voit là un exemple de polymorphisme: Bien que différents entre eux, les objets point, droite, cercle et polygone ont tous une méthode symétrique, produisant respectivement un point, une droite, un cercle ou un polygone. En d'autres termes, chacune des courbes surcharge l'opérateur de symétrie centrale. Même l'addition est surchargée, ce qui permet non seulement d'additionner autrement (des fractions) mais aussi d'additionner autre chose que des nombres, comme on va le voir ci-dessous pour les vecteurs.

Vecteurs[modifier | modifier le wikicode]

Contrairement aux exemples ci-dessus, on ne va pas construire toute la figure en SmallTalk mais plutôt insérer un script SmallTalk dans une figure qui n'est pas vierge. Voici l'énoncé de l'exercice:

On considère les points O(0;0), A(4;0) et B(2;2) dans un repère orthonormé. Calculer les coordonnées du vecteur et représenter ce dernier.

On commence donc par créer deux affichages numériques (en jaune ci-dessous) et les laisser initialisés à 0. Puis (toujours en jaune) le point de coordonnées 0.0 et 0.0 (avec l'outil point par coordonnées, en cliquant successivement sur les deux valeurs numériques). Ensuite on crée deux vecteurs d'origine le point O. Ci-dessous leurs extrémités (créées à la volée) ont été coloriées respectivement en bleu (le point A) et en vert (le point B), et les vecteurs aussi, et en plus pour éviter des problèmes de visibilité, les représentants ont été déplacés plus bas, à la souris, ce que permet DrGeoII. Les éléments en mauve sont décrits plus bas. On constate que le bouton coller à la grille (avec un aimant) a été enfoncé, ce qui garantit aux points A et B d'avoir des coordonnées entières:

VecteurDrGeo1.png

Pour additionner les deux vecteurs, on va créer un script SmallTalk dans la figure, dont le contenu est le suivant:

somvect: v1 and: v2
	^v1 direction + (v2 direction).

Ce script additionne deux vecteurs v1 et v2 et retourne les coordonnées de leur somme. Il fonctionne parce que v1 et v2, en tant que vecteurs, héritent de l'objet direction une méthode +, correspondant à la somme des vecteurs (ou des points d'ailleurs). Une fois le script enregistré avec Control+S, on peut le retrouver dans la liste des scripts, puisqu'on connaît son nom somvect. Si on le sélectionne, on clique successivement sur les deux vecteurs puis à un endroit vide de la figure. Ce qui fait apparaître l'expression en mauve ci-dessus, 6.0@2.0 qui signifie que les coordonnées de la somme sont (6;2). Pour représenter le vecteur, on crée son extrémité, en choisissant l'outil point par coordonnées et en cliquant sur les coordonnées en mauve. Ce point est également en mauve sur la figure, et bouge avec les points A et B. Enfin le vecteur mauve a été créé à partir de ses extrémités jaune et mauve, puis son représentant a rejoint les deux autres. La figure montre alors comment on additionne deux vecteurs avec la règle du parallélogramme. Si on préfère illustrer la somme de deux vecteurs par la relation de Chasles, on déplace juste le représentant du vecteur vert:

VecteurDrGeo2.png

Cercles[modifier | modifier le wikicode]

Encore un excellent exemple de surcharge de méthode: Le cercle possède aussi (comme la droite, ci-dessus) une méthode closestPointTo qui permet, parmi les points du cercle de centre A passant par B, d'avoir le plus proche d'un point M donné:

|figure d m p|
figure:=DrGeoCanvas new.
d:=figure circleCenter: (-2)@1 to: 0@1.
d color: Color blue.
m:=figure point: 1@(-1).
p:=figure
        point: [:prts | prts first closestPointTo: prts second point]
        parents: {d. m}.
p color: Color cyan.

L'effet est intéressant si M est à l'intérieur du cercle.

Représentations graphiques de fonctions[modifier | modifier le wikicode]

La même méthode closestPointTo est partagée par toutes les courbes de DrGeoII, y compris les lieux et les polygones. Ce qui permet de trouver assez facilement la solution du sujet 65 de l'épreuve expérimentale du bac S 2009:

Dans un repère orthonormal d'origine O, on considère la courbe C représentative de la fonction logarithme népérien.

On s'intéresse à la distance OM lorsque M parcourt C. Le but de l'exercice est de préciser si cette distance peut être rendue minimale et de caractériser le ou les point(s) M, s'il existe, situé(s) sur C et rendant cette distance minimale.

Pour cela on va juste faire la même chose que ci-dessus, mais en créant un polygone C comme dans l'article Programmation objet et géométrie/Programmation avec DrGeoII:

|figure fonction p C sommets O|
 
fonction:=[ :x | x log ].
 
sommets:=OrderedCollection new.
figure:=DrGeoCanvas new.
O:=figure point: 0@0.
 
0.05 to: 5 by: 0.05 do: [ :x |  sommets add: x@(fonction value: x). ].
C:=figure polygon: sommets.
C color: Color blue.
 
p:=figure
        point: [:prts | prts first closestPointTo: prts second point]
        parents: {C. O}.
p color: Color cyan.