# Programmation objet et géométrie/CaRScripts et nombres complexes

Dans CaRScript un nombre complexe peut être vu comme un objet à deux paramètres, sa partie réelle x et sa partie imaginaire y ; voir à ce sujet le paragraphe correspondant.
Pour une meilleure intégration avec le logiciel CaRMetal, il est possible de créer un objet ayant pour unique paramètre un point de la figure.

## Complexe (point)

La fonction complexe(p) est en fait un constructeur - à défaut d'une classe - des objets "complexe". C'est-à-dire que dès qu'un objet "complexe" est créé par la commande z = new complexe(unPoint), cet objet est doté de ses attributs et de ses méthodes.

## Affichage de l'affixe

On peut aller un peu plus loin en affichant l'affixe du nombre complexe sous la forme d'une chaîne de caractères.
En CaRScript, X(p) et Y(p) seront vus comme des chaînes de caractères, qu'il suffit d'assembler avec l'opérateur + : X(p) + "+" + Y(p) + "i"
Sous CaRMetal, l'affichage est dynamique et doit changer lorsque le point A se déplace sans pour cela faire appel au CaRScript ; pour le point A on écrira donc "%x(A)%+%y(A)%i" , les % indiquent qu'il faut remplacer x(A) et y(A) par leur valeurs. De plus, le véritable nom du point est inconnu, on écrira donc "%x(" + p + ")%+%y(" + p + ")%i", CaRScript se chargeant de remplacer p par son nom.
Remarquer la façon dont JavaScript gère l'affichage du signe de Y(p) ; si Y(p)>=0, alors on ajoute un "+" devant sa valeur, sinon "".
Dans CaRMetal le test est inutile, il suffit d'insérer le "+" à l'intérieur des %%. Le logiciel évaluera lui-même s'il faut écrire "+" ou non.

## Opérations sur les complexes

De même, les opérations sur les nombres complexes peuvent être prises en compte par CaRMetal en mixant syntaxe JavaScript et commandes CaRMetal.
Trois points sont créés dans CaRMetal, avec leurs affixes. Le déplacement de l'un des deux premiers entraîne celui du troisième.
Remarque: On constate que ci-dessus, le module, l'argument, l'image etc. sont des propriétés de l'objet nombre complexe, alors que l'affichage est une méthode de cet objet. De même, l'opposé, le conjugué et l'inverse sont des méthodes de cet objet. Par contre, ce n'est pas le cas de la somme de deux complexes, parce que cette somme fait intervenir deux instances de l'objet et pas seulement une. Ci-dessus la somme est une fonction de deux complexes, qui renvoie un objet de même nature.

## Pour aller plus loin
### Choix du point par l'utilisateur

Le CaRScript peut être rendu plus interactif en demandant à l'utilisateur de désigner un point. La commande utilisée est InteractiveInput, couplée à try pour prévoir les cas où l'utilisateur clique sur autre chose.

### Prototypage
#### Position du problème

Tout ceci fonctionne très bien, de façon dynamique et interactive. Mais la gestion de la mémoire n'est pas optimisée parce que, chaque fois qu'on crée un nouveau nombre complexe par new complexe(a,b), les méthodes de l'objet complexe sont stockées avec la nouvelle instance de celui-ci, ce qui, lorsqu'on crée un grand nombre de complexes, encombre inutilement la mémoire de JavaScript, surtout si on n'utilise pas toutes ces méthodes!

#### Solution

Pour remédier à ce (petit) problème, on peut définir les méthodes une fois pour toutes, dans la classe complexe. Ces méthodes seront alors héritées par l'objet au moment de son instanciation (ou création). Seulement voilà: JavaScript ne possède pas de classes... Alors on fait avec ce qu'on a, c'est-à-dire avec un prototype. Maintenant l'objet complexe est toujours défini mais seulement avec ses trois propriétés reelle, imaginaire et image. Les méthodes sont toutes définies dans le prototype du nombre complexe (qui est d'ailleurs un objet, et plus précisément une méthode de l'objet complexe !) comme on le voit ci-dessous:

#### Une erreur qu'il est bon de faire

Si on veut afficher (en version CarScript : CS) l'affixe de z1 ci-dessus, on est tenté d'écrire
Le résultat, quoique faux, est tellement intéressant qu'il serait dommage de ne pas faire l'erreur! D'où vient-elle d'ailleurs, cette erreur? C'est que puisque z1 est une instance de l'objet complexe (donc un complexe), z1.affixeCS est une méthode de l'objet complexe, et quand on demande à JavaScript d'afficher une méthode, il affiche une méthode!
Pour réellement appeler la fonction, il faut signaler à JavaScript que c'est une fonction, à l'aide des parenthèses:

# Exercices
## Méthodes

Écrire en CaRScript, des méthodes pour les nombres complexes:
* Conjugué
* Opposé
* Inverse

## Opérations

Écrire des fonctions admettant deux complexes en entrée et renvoyant un complexe (des opérations):
* Différence
* Produit
* Quotient