\section{Courbes définies implicitement}

Une courbe implicite est l'ensemble des points $(x~;~y)$ qui vérifient une équation $F(x,y)=0$ : cercle, ellipse, hyperbole, lemniscate, folium de Descartes, etc. Il n'est pas nécessaire de résoudre l'équation : Lua calcule $F$ aux nœuds d'une grille qui recouvre la fenêtre et repère les cases où $F$ change de signe (méthode des \emph{marching squares}). Chaque point de passage est ensuite calculé avec précision par dichotomie, et les morceaux sont reliés en chemins continus.

\begin{NewMacroBox}{tkzFnImplicit}{\oarg{options}\marg{$F(x,y)$}}
\emph{$F(x,y)$ est une expression Lua des variables \texttt{x} et \texttt{y}. On peut aussi écrire une équation : \texttt{\{x\string^2 + y\string^2 = 4\}} est équivalent à \texttt{\{(x\string^2 + y\string^2)-(4)\}}. La courbe est tracée dans la fenêtre définie par \tkzcname{tkzFnInit}.}

\begin{tabular}{lll}
\toprule
options             & défaut & définition                         \\
\midrule
\TOline{level}{0}{valeur(s) $c$ : courbes $F(x,y)=c$}
\TOline{samples}{100}{nombre de cases sur le plus grand côté}
\TOline{domain}{xmin:xmax}{intervalle des valeurs de $x$}
\TOline{ydomain}{ymin:ymax}{intervalle des valeurs de $y$}
\TOline{refine}{true}{dichotomie sur chaque arête de la grille}
\TOline{clip}{true}{la courbe est découpée à la fenêtre}
\bottomrule
\end{tabular}

\emph{Les autres options sont celles de \TIKZ. \texttt{level} accepte une liste comme \tkzcname{foreach} : \texttt{level=\{-2,-1,...,2\}}.}
\end{NewMacroBox}

\subsection{Coniques}

$\dfrac{x^2}{9}+\dfrac{y^2}{4}=1$ \quad et \quad $x^2-y^2=1$

\begin{tkzexample}[latex=8cm]
\begin{tikzpicture}[scale=.8]
  \tkzFnInit[xmin=-4,xmax=4,ymin=-3,ymax=3]
  \tkzFnGrid
  \tkzFnAxes
  \tkzFnImplicit[thick,red]{x^2/9 + y^2/4 = 1}
  \tkzFnImplicit[thick,blue]{x^2 - y^2 = 1}
\end{tikzpicture}
\end{tkzexample}

\subsection{Lemniscate de Bernoulli et folium de Descartes}

$(x^2+y^2)^2=4(x^2-y^2)$ \quad et \quad $x^3+y^3=3xy$

Les points doubles, en $O$, sont correctement traités.

\begin{tkzexample}[latex=8cm]
\begin{tikzpicture}[scale=.8]
  \tkzFnInit[xmin=-4,xmax=4,ymin=-3,ymax=3]
  \tkzFnGrid
  \tkzFnAxes
  \tkzFnImplicit[thick,blue]
    {(x^2+y^2)^2 = 4*(x^2-y^2)}
  \tkzFnImplicit[thick,red]{x^3 + y^3 = 3*x*y}
\end{tikzpicture}
\end{tkzexample}

\subsection{Une courbe elliptique}

$y^2=x^3-2x+2$ : la courbe a une seule composante ; avec $y^2=x^3-2x$, elle en a deux.

\begin{tkzexample}[latex=8cm]
\begin{tikzpicture}[scale=.8]
  \tkzFnInit[xmin=-3,xmax=3,ymin=-4,ymax=4]
  \tkzFnGrid
  \tkzFnAxes
  \tkzFnImplicit[thick,red]{y^2 = x^3 - 2*x + 2}
  \tkzFnImplicit[thick,blue]{y^2 = x^3 - 2*x}
\end{tikzpicture}
\end{tkzexample}

\newpage
\subsection{Courbes de niveau}

L'option \tkzname{level} trace les courbes $F(x,y)=c$ pour plusieurs valeurs de $c$. Ici les courbes de niveau de $F(x,y)=x^2-y^2$ : la courbe de niveau $0$ est formée des deux droites $y=x$ et $y=-x$.

\begin{tkzexample}[latex=8cm]
\begin{tikzpicture}[scale=.8]
  \tkzFnInit[xmin=-3,xmax=3,ymin=-3,ymax=3]
  \tkzFnGrid
  \tkzFnAxes
  \tkzFnImplicit[level={-4,-2,...,4},blue]
    {x^2 - y^2}
  \tkzFnImplicit[thick,red]{x^2 - y^2}
\end{tikzpicture}
\end{tkzexample}

Avec une boucle \tkzcname{foreach}, chaque niveau peut avoir sa couleur.

\begin{tkzexample}[latex=8cm]
\begin{tikzpicture}[scale=.8]
  \tkzFnInit[xmin=-3,xmax=3,ymin=-3,ymax=3]
  \tkzFnAxes
  \foreach \c/\col in {0.5/blue,1/teal,
                       2/orange,3/red}
    {\tkzFnImplicit[level=\c,thick,\col]
       {x^2 + x*y + y^2}}
\end{tikzpicture}
\end{tkzexample}

\subsection{Fonction discontinue}

Pour $y=\tan(x)$, $F(x,y)=y-\tan(x)$ change de signe de part et d'autre des asymptotes sans s'annuler : ces faux passages sont détectés et éliminés.

\begin{tkzexample}[latex=8cm]
\begin{tikzpicture}[scale=.8]
  \tkzFnInit[xmin=-4,xmax=4,ymin=-3,ymax=3]
  \tkzFnGrid
  \tkzFnAxes
  \tkzFnImplicit[thick,red]{y = tan(x)}
\end{tikzpicture}
\end{tkzexample}

\newpage
\subsection{Fenêtre, unités et lissage}

La grille est faite de cases carrées dans la page, même si \tkzname{xstep} et \tkzname{ystep} sont différents. Les options \tkzname{domain} et \tkzname{ydomain} limitent le tracé à une partie de la fenêtre. Avec \tkzname{smooth}, les courbes fermées sont tracées avec \texttt{smooth cycle}.

\begin{tkzexample}[vbox]
\begin{tikzpicture}[scale=.8]
  \tkzFnInit[xmin=-6,xmax=6,xstep=2,ymin=-2,ymax=2,ystep=.5]
  \tkzFnGrid
  \tkzFnAxes
  \tkzFnImplicit[thick,red,smooth,samples=60]{x^2/16 + y^2 = 1}
  \tkzFnImplicit[thick,blue,domain=0:6,ydomain=0:2]{x^2/16 + y^2 = 1.5^2}
\end{tikzpicture}
\end{tkzexample}

\subsection{Limites de la méthode}

\begin{itemize}
\item Une courbe le long de laquelle $F$ ne change pas de signe n'est pas détectée : $(x-y)^2=0$ ne donne rien, il faut écrire $x-y=0$.
\item Un détail plus petit qu'une case de la grille peut être manqué : augmenter \tkzname{samples} (par exemple \texttt{samples=200}).
\item Près d'un point singulier, le tracé est exact à la taille d'une case près.
\end{itemize}

\endinput
