\section{La classe pt3d}

\subsection{Représentation des points et vecteurs}

L'espace usuel est $\mathbf R^3$, les points et les vecteurs sont donc des triplets de réels, on les appellera: points 3D. La classe \emph{pt3d} (qui est automatiquement chargée) permet de gérer les points 3D, les opérations possibles, et un certain nombre de méthodes et de constantes.

\begin{itemize}
    \item  Quatre triplets portent un nom spécifique (variables globales), il s'agit de :
    \begin{itemize}
        \item \varglob{pt3d.Origin}, qui représente le triplet $(0,0,0)$.
        \item \varglob{pt3d.vecI}, qui représente le triplet $(1,0,0)$.
        \item \varglob{pt3d.vecJ}, qui représente le triplet $(0,1,0)$.
        \item \varglob{pt3d.vecK}, qui représente le triplet $(0,0,1)$.
    \end{itemize}
    \item  Pour créer un point 3D, il y a trois méthodes :
        \begin{itemize}
            \item Définition en cartésien : la fonction \cmd{pt3d.M(x, y, z)} renvoie le triplet $(x,y,z)$. On peut également obtenir ce triplet en faisant : \code{x*vecI+y*vecJ+z*vecK}.
            \item Définition en cylindrique : la fonction \cmd{pt3d.Mc(r, theta, z)} (angle exprimé en radians) renvoie le triplet $(r\cos(\theta),r\sin(\theta),z)$.
            \item Définition en sphérique : la fonction \cmd{pt3d.Ms(r, theta, phi)} renvoie le triplet $(r\cos(\theta)\sin(\varphi), r\sin(\theta)\sin(\varphi),r\cos(\varphi))$ (angles exprimés en radians).
        \end{itemize}
    Accès aux composantes d'un point 3D : si une variable $A$ désigne un point 3D, alors ses trois composantes sont $A.x$, $A.y$ et $A.z$.
    
    Pour tester si une variable $A$ désigne un point 3D, on dispose de la fonction \cmd{pt3d.isPoint3d()} qui renvoie un booléen.
    
    Conversion : pour convertir un réel ou un complexe en point 3D, on dispose de la fonction \cmd{pt3d.toPoint3d()}.
\end{itemize}

\subsection{Opérations sur les points 3D}

Ces opérations sont les opérations usuelles avec les symboles usuels :
\begin{itemize}
    \item L'addition (+), la différence (-), l'opposé (-).
    \item Le produit par un scalaire, si $k$ et un réel, \code{k*M(x,y,z)} renvoie \val{M(k*x,k*y,k*z)}.
    \item On peut diviser un point 3D par un scalaire, par exemple, si $A$ et $B$ sont deux points 3D, alors le milieu s'écrit simplement $(A+B)/2$.
    \item On peut tester l'égalité de deux points 3D avec le symbole =.
\end{itemize}

\subsection{Méthodes de la classe \emph{pt3d}}

Celles-ci sont :
\begin{itemize}
    \item \cmd{pt3d.abs(u)} : renvoie la norme euclidienne du point 3D \argu{u}.
    
    \item \cmd{pt3d.abs2(u)} : renvoie la norme euclidienne au carré du point 3D \argu{u}.
    
    \item \cmd{pt3d.N1(u)} : renvoie la norme $1$ du point 3D $u$. Si $u=M(x,y,z)$, alors \code{pt3d.N1(u)} renvoie \val{$|x|+|y|+|z|$}.
    
    \item \cmd{pt3d.dot(u, v)} : renvoie le produit scalaire entre les vecteurs (points 3D) \argu{u} et \argu{v}.
    
    \item \cmd{pt3d.det(u, v, w)} : renvoie le déterminant entre les vecteurs (points 3D) \argu{u}, \argu{v} et \argu{w}.
    
    \item \cmd{pt3d.prod(u, v)} : renvoie le produit vectoriel entre les vecteurs (points 3D) \argu{u} et \argu{v}.
    
    \item \cmd{pt3d.angle3d(u, v \fac{, epsilon})} : renvoie l'écart angulaire (en radians) entre les vecteurs (points 3D) \argu{u} et \argu{v}. supposés non nuls. L'argument (facultatif) \argu{epsilon} vaut $0$ par défaut, il indique à combien près se fait un certain test d'égalité sur un flottant.
    \item \cmd{pt3d.normalize(u)} : renvoie le vecteur (point 3D) \argu{u} normalisé (renvoie \nil si \argu{u} est nul).
    
    \item \cmd{pt3d.round(u, nbDeci)} : renvoie un point 3D dont les composantes sont celles du point 3D \argu{u} arrondies avec \argu{nbDeci} décimales.
    
    \item \cmd{pt3d.isobar3d(L)} : renvoie l'isobarycentre des points 3D de la liste (table) \argu{L} (les éléments de \argu{L} qui ne sont pas des points 3D sont ignorés).
    
    \item \cmd{pt3d.insert3d(L, A \fac{, epsilon})} : cette fonction insère le point 3D \argu{A} dans la liste \argu{L} qui doit être une \textbf{variable} (et qui sera donc modifiée). Le point \argu{A} est inséré \textbf{sans doublon} et la fonction renvoie sa position (indice) dans la liste \argu{L} après insertion. L'argument (facultatif) \argu{epsilon} vaut $0$ par défaut, il indique à combien près se font les comparaisons.
\end{itemize}

\subsection{Afficher une variable dans le terminal}

L'instruction \cmd{ld.whatis(variable \fac{, msg})} affiche dans le terminal lors de la compilation, le type de la \argu{variable} ainsi que son contenu. Les types reconnus sont, les types prédéfinis plus : \emph{complex number}, \emph{list of (complex) numbers}, \emph{list of lists of (complex) numbers}, \emph{3D point}, \emph{list of 3D points}, \emph{list of lists of 3D points}. L'argument \argu{msg} est une chaîne optionnelle (vide par défaut) qui est affichée avec le type pour repérer la variable dans le terminal.
