Utilisateur:Alain Busser/Création d'un objet DrGeoII

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

Dans cet article, on va voir comment on peut créer l'inverse d'un point (un objet) avec DrGeoII.

Création de l'objet[modifier | modifier le wikicode]

On va créer une classe pour DrGeo (un point), appelée DrGPointInverseItem. La nouvelle classe n'est pas créée ex nihilo, mais hérite des propriétés d'une classe parente.

Création d'un nouvel objet[modifier | modifier le wikicode]

Les objets géométriques de DrGeoII sont rangés dans la catégorie de classes DrGeoII-Core-Item. Pour en créer une nouvelle, il suffit de sélectionner l'une d'elles dans le browser, et de remplacer son nom dans la première ligne de sa description, par le nouveau nom (par exemple DrGPointInverseItem).


La nouvelle classe hérite des propriétés de la classe DrGPointItem (c'est-à-dire ses attributs et ses méthodes), il en est donc de même pour le nouvel objet: L'inverse d'un point par rapport à un cercle est bien un point. La copie d'écran ci-dessus a été faite après le Control+S qui sauvegarde l'objet, ce qui fait apparaître son nom parmi les objets de DrGeoII: À ce stade, l'objet existe déjà; seulement il ne sert à rien puisqu'il n'a aucune méthode propre. Pour voir les messages compris par les instances de cette classe, cliquer sur le bouton Hierarchy.

Création de ses méthodes[modifier | modifier le wikicode]

Pour qu'il ait des méthodes, il faut les créer, un peu comme dans l'article précédent. Sauf qu'on va catégoriser ces méthodes. Pour cela on clique droit sur la fenêtre des messages (actuellement vide) et on choisit une nouvelle catégorie (en réalité, parmi les catégories existantes, elle n'est donc pas si nouvelle que ça).


Méthodes de test[modifier | modifier le wikicode]

Si, comme nouvelle catégorie, on choisit *DrGeoII-Core-testing, on voit apparaître cette catégorie, dans laquelle on écrit la méthode suivante (copiée-collée depuis un autre objet):

isConstrainedPointItem
    ^true

Ceci signifie que le point construit comme inverse d'un autre point, sera considéré par DrGeoII comme contraint, ce qui évitera des comportements étranges si on essaye de le bouger avec la souris.


Méthodes d'insertion dans la figure[modifier | modifier le wikicode]

Il s'agit de voir là comment l'inverse d'un point sera stocké dans la figure (en xml). On retourne dans la fenêtre des messages, on clique droit à nouveau, on choisit comme catégorie xml writing, et on écrit la méthode nodeType où on écrit

nodeType
    ^#Inverse

Cette méthode permet d'enregistrer les inverses de points dans la figure, mais ils ne s'afficheront pas avec la version standard de DrGeoII, puisque celle-ci ne possède pas l'objet inverse (en effet, DrGeoII n'est pas encore télépathe même si son finder peut parfois en donner l'impression...).


Méthodes de mise à jour[modifier | modifier le wikicode]

C'est ici que l'objet va devenir un vrai objet de géométrie dynamique. C'est ici également qu'on va définir les coordonnées de l'inverse; et aussi incidemment c'est ici qu'on va définir les deux parents de l'inverse d'un point par rapport à un cercle:

  1. Le point à inverser
  2. Le cercle d'inversion

Choix de la catégorie[modifier | modifier le wikicode]

Comme mise à jour se dit update en Anglais, on choisit updating. Et là on crée la méthode update.

Rayon vecteur[modifier | modifier le wikicode]

Pour éviter d'allonger trop les lignes de smalltalk à écrire (les listes de méthodes qui se suivent) on va utiliser une variable locale ayant elle-même un nom court, qui sera p puisque c'est un point (en réalité, un vecteur). Initialement on va le rendre égal au vecteur allant du centre du cercle vers le point à inverser:

  1. le centre du cercle est obtenu en appelant le second parent (le cercle) et en lui demandant son centre (center);
  2. le point à inverser est juste le premier parent, mais on lui envoie le message point:
    p:=(parents first point) - (parents second center).

Changement de norme du vecteur[modifier | modifier le wikicode]

On transforme alors ce vecteur pour qu'au lieu d'aller vers le point à inverser, il aille vers l'inverse (multiplication par le carré du rayon du cercle et division par le carré de la norme initiale de p).

  1. Pour obtenir le carré du rayon du cercle, on appelle celui-ci (parents second), on lui envoie le message radius pour avoir son rayon, puis on l'élève au carré en lui envoyant le message squared;
  2. Pour obtenir le carré de la norme de p, on peut faire le produit scalaire de p avec lui-même.
    p:=p*(parents second radius squared)/(p dotProduct: p).


Le vecteur va alors du centre du cercle vers l'inverse; il suffit ensuite d'appliquer une translation selon ce vecteur, au centre du cercle d'inversion. Finalement:

update
    |p|
    self doParentsExist ifTrue: [
       p:=(parents first point) - (parents second center).
       p:=p*(parents second radius squared)/(p dotProduct: p).
       self point: (parents second center) + p]


Test[modifier | modifier le wikicode]

Tout cela n'est pas encore très DrGeo-compatible puisque seul le point possède un inverse. La création d'objets pour inverser

  • une droite (l'inverse est un cercle)
  • un segment (l'inverse est un arc de cercle)
  • un cercle (l'inverse est un cercle)
  • un polygone (plus difficile)

sont laissés en exercice...

Création d'un outil[modifier | modifier le wikicode]

Il va falloir créer un nouvel objet mais cette fois-ci dans la classe DrGeoII-Core-Builder, dont les méthodes permettront de créer l'inverse d'un point. Cet objet s'appellera DrGInverseBuilder, par souci de cohérence avec les noms déjà présents dans DrGeoII. On le fera hériter de l'objet DrGTransformationBuilder puisque l'inversion circulaire est une transformation.

Oui et le builder, au hasard DrGInverseBuilder, s'interfacera pour créer des inverses de toute sorte d'objet. Ensuite ajouter une entrée Inverse dans un menu de la fenêtre de drgeo (Ligne par exemple)

Classement[modifier | modifier le wikicode]

Dans la catégorie constant, on crée cette méthode:

mathItemClass
    ^DrGPointInverseItem

qui fait le lien avec l'objet précédent.

Mise à jour[modifier | modifier le wikicode]

Dans la catégorie update, on crée une méthode reset pour la réinitialisation:

reset
    super reset.
    cercle:=mathItem:=nil

Accessibilité[modifier | modifier le wikicode]

Dans la catégorie accessing, on crée une méthode d'accessibilité aux arguments, en l'ocurrence au cercle d'inversion:

arguments: aMathItem
    ^{aMathItem.cercle}

Méthodes de test[modifier | modifier le wikicode]

Quand peut-on construire un inverse?[modifier | modifier le wikicode]

Il faut que le cercle d'inversion existe (ou soit sélectionné) et que l'objet à inverser existe aussi:

readyToBuild
    ^cercle notNil and: [MathItem notNil]

Qu'attend la construction?[modifier | modifier le wikicode]

Il faut un cercle d'inversion et quelque chose à inverser; il faut également que le cercle d'inversion soit vraiment un cercle!:

isWanted: aMathItemCollection
    ^aMathItemCollection notEmpty
        and: [aMathItemCollection first isCircleItem
            and: [aMathItemCollection second isPointItem]]

Assignations[modifier | modifier le wikicode]

Dans la catégorie private:

addItem: aMathItemCollection at: aPoint
    super addItem: aMathItemCollection at: aPoint
    (aMathItemCollection first isCircle and: [cercle isNil])
        ifTrue: [cercle:=aMathItemCollection first]
        ifFalse: [mathItem:=aMathItemCollection first]

Tout ceci est-il bien utile?[modifier | modifier le wikicode]

Certes, il n'est pas nécessaire de faire tout ça pour munir DrGeoII d'un outil inverse d'un point puisqu'on peut déjà le faire sans avoir à mettre les mains dans le cambouis.

Avec un script[modifier | modifier le wikicode]

On peut calculer les coordonnées de l'inverse avec le même algorithme que ci-dessus, mais avec un script DrGeoII:


Après cela, on peut appliquer ce script à un point et un cercle, pour obtenir des coordonnées, lesquelles peuvent ensuite servir à définir un point. Puis convertir le tout en macro pour avoir un "outil" pour l'inverse d'un point.


Avec une macro[modifier | modifier le wikicode]

L'inverse de B par rapport au cercle C est constructible à la règle et à l'équerre:

Construction[modifier | modifier le wikicode]

  1. On construit la droite joignant B au centre de C (en vert);
  2. On construit la perpendiculaire à cette droite par B (en bleu);
  3. On choisit un des points d'intersection de cette droite avec le cercle (en magenta);
  4. On joint ce point au centre du cercle (en vert);
  5. On mène par le point magenta la perpendiculaire à la droite verte (en bleu).
  6. Celle-ci coupe la droite (OB) en un point B', inverse de B par rapport au cercle:


Macro[modifier | modifier le wikicode]

À partir de cette construction, on peut définir une macro

  • Comme objets initiaux, on choisit le point B et le cercle;
  • comme objet final, on choisit le point B'
  • on nomme cette macro inversegeom ou quelque chose d'analogue.

Et on a un inverse dans DrGeoII (applicable à des courbes avec l'outil lieu) sans une seule ligne de Smalltalk!