« Utilisateur:Alain Busser/Création d'un objet DrGeoII » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Ligne 105 : Ligne 105 :


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.
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.

''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)''


=Tout ceci est-il bien utile?=
=Tout ceci est-il bien utile?=

Version du 29 janvier 2012 à 11:36

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

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

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).

Fichier:Inverseobjet1.png

La nouvelle classe hérite des propriétés de la classe DrGPointItem (c-a-d ses attributs et méthodes), il 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

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).

Fichier:Inverseobjet2.png

Méthodes de test

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.

Fichier:Inverseobjet3.png

Méthodes d'insertion dans la figure

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...).

Fichier:Inverseobjet4.png

Méthodes de mise à jour

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

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

Rayon vecteur

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

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]

Fichier:Inverseobjet5.png

Test

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

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.

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)

Tout ceci est-il bien utile?

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

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

Fichier:Inversescript1.png

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

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

Construction

  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:

Fichier:Inversemacro.png

Macro

À 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!