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=
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.
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.
Tout d'abord, un exercice simple et pas tellement géométrique:
Un algorithme relativement simple, trouvé par un élève de Seconde, est le suivant:
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:
Intersection.
Un autre exercice relativement simple: Résoudre le système suivant:
formula_1
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:
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.
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:
formula_2
Seulement:
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.
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:=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.
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.
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 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:
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:
=Cercles=
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:=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=
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:
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:
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.