Retour

index.tex

Télécharger le fichier Fichier PDF
\documentclass{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[dvips,a4paper,margin=1.5cm]{geometry}
\usepackage[dvips]{graphicx}
\title{Documentation sur les fichiers geometriesyr12.mp et christ5.tex}
\author{Christophe Poulain}
\date{Version 1.0}
\usepackage{multicol,fancybox,color}
\input christ5.tex
\begin{document}
\maketitle
\parindent0pt
\hrulefill
\tableofcontents
\hrulefill
\parindent12pt
\newpage
\section{Documentation sur christ5.tex}
\subsection{Quelques environnements.}
Sont définis les environnements numérotés:
\begin{description}
\item[Proposition] par \verb+\begin{prop}...\end{prop}+ pour obtenir
\begin{prop}
...
\end{prop}
\item[Propriété] par \verb+\begin{prop}...\end{prop}+
\item[Théorème] par \verb+\begin{theo}...\end{theo}+
\item[Définition] par \verb+\begin{defi}...\end{defi}+
\item[Lemme] par \verb+\begin{lemme}...\end{lemme}+
\item[Corollaire] par \verb+\begin{coro}...\end{coro}+
\item[Règle] par \verb+\begin{reg}...\end{reg}+
\item[Conjecture] par \verb+\begin{conj}...\end{conj}+
\item[Remarque] par \verb+\begin{remar}...\end{remar}+
\item[Exemple] par \verb+\begin{exem}...\end{exem}+
\end{description}
\subsection{Quelques raccourcis \og{}classiques\fg{}.}
Des commandes pour obtenir des mots particuliers soulignés : \verb+\rema+ pour \underline{Remarque}, \verb+\exe+ pour \underline{Exemple}, \verb+\pre+ pour \underline{Preuve}, \verb+\cas+ pour \underline{Cas particulier}, \verb+\cass+ pour \underline{Cas particuliers}, \verb+\Not+ pour \underline{Notation}, \verb+\Si+ pour \underline{Si}, \verb+\si+ pour \underline{si}, \verb+\alors+ pour \underline{alors} et \verb+\cons+ pour \underline{Conséquence}.
\subsection{Quelques commandes de présentation.}
\begin{description}
\item[encadre\{{\em texte à encadrer}\}] L'encadrement se fait sur toute la largeur de la page (s'adapte au mode un colonne/deux colonnes).
\item[titrage\{{\em titre}\}\{{\em remarque}\}] Permet d'obtenir
\par
\vspace{3mm}
\parskip0pt\parindent0pt
\titrage{Développements}{3\ieme}
\parindent12pt
\parskip12pt
\item[partie\{{\em longueur du trait}\}\{{\em texte}\}] Permet d'obtenir\footnote{Nécessite les packages {\sc fancybox} et {\sc color}.}
\partie{200}{Activités numériques.}
\item[exo] pour obtenir une numérotation automatique des exercices. Se remet automatiquement à 1 à chaque changement de section.
\item[myenumerate] Cet environnement permet d'obtenir une liste numérotée du type suivant
\begin{myenumerate}
\item
\item
\end{myenumerate}
sur un niveau seulement.
\item[compo\{{\em n° de l'image}\}\{{\em nom de l'image\}}\{{\em échelle de l'image}\}\{{\em texte à positionner}\}] Permet de placer du texte du côté droit d'une image metapost du type \og{}geometrie.1\fg{}. Pour les numéros d'images supérieurs ou égaux à 10, on utilisera la variante \verb+Compo+. {\bf Nécessite le package graphicx}.
\end{description}
\compo{1}{docfichierschrist}{1}{Soit un triangle $ABC$. La perpendiculaire à la droite $(AB)$ passant par $H$ coupe la droite $(AB)$ en $H$.
\begin{enumerate}
\item Exprime l'aire du triangle $AHC$.
\item Exprime l'aire du triangle $ABC$.
\end{enumerate}}
\begin{verbatim}
\compo{1}{docfichierschrist}{1}{Soit un triangle $ABC$. La
perpendiculaire à la droite $(AB)$ passant par $H$ coupe la droite
$(AB)$ en $H$.
\begin{enumerate}
\item Exprime l'aire du triangle $AHC$.
\item Exprime l'aire du triangle $ABC$.
\end{enumerate}}
 
\end{verbatim}
\subsection{Quelques commandes mathématiques.}
\begin{description}
\item[cqfd] Permet d'obtenir \cqfd
\item[qed] Même chose que \verb+\cqfd+.
\item[vecteur\{{\em nom du vecteur}\}] permet d'obtenir $\vecteur{AB}$.
\item[Eqalign] Cette commande, utilisée en mode mathématique, permet d'aligner de nombreuses équations, expressions,\ldots Avec le codage suivant,
 
\begin{verbatim}
$$\Eqalign{
A&=\frac{1}{3}+\frac{5}{4}\div\frac{2}{7}\kern1cm&B&=(x+2)^2-(x-3)^2\cr
\cr
C&=\sqrt{124}-\sqrt{56}\cr
&&E&=10^{12}\times10^{-8}\cr
}$$
 
\end{verbatim}
 
on obtient
$$\Eqalign{
A&=\frac{1}{3}+\frac{5}{4}\div\frac{2}{7}\kern1cm&B&=(x+2)^2-(x-3)^2\cr
\cr
C&=\sqrt{124}-\sqrt{56}\cr
&&E&=10^{12}\times10^{-8}\cr
}$$
\end{description}
\newpage
\section{Documentation sur geometriesyr12.mp}
Ce fichier fait appel aux fichiers :
\begin{itemize}
\item{\sc constantes.mp} qui, comme son nom l'indique, contient les différents paramètres nécessaires aux tracés (couleurs, unités de longueur,\ldots).\\Les constantes disponibles sont $\pi$, $e$, $c$ la conversion d'un radian en degrés.\\Les couleurs disponibles sont rouge, bleu, vert, kaki, blanc, noir, orange, violet, rose, ciel, orangevif, jaune et gris. Elles s'utilisent avec ces noms francisés.
\item{\sc papiers1.mp} qui permet de produire\footnote{Voir la page \pageref{papiers} pour connaître les commandes disponibles.} différents types de papiers (millimétré, $5\times5$, isométrique,\ldots)
\end{itemize}
\subsection{Environnement général de la figure.}
La macro \verb+figure(xa,xb,ya,yb)+ va limiter tout le schéma à l'intérieur d'un cadre dont le sommet inférieur gauche a pour coordonnées $(x_a,y_a)$ et le sommet supérieur droit $(x_b,y_b)$. A noter que cette macro a une indentation automatique : plusieurs figures avec pour extension .1, .2, \ldots peuvent être créees les unes à la suite des autres.
\subsection{Affichage.}
Pour l'affichage des points, on dispose d'un paramètre \verb+marque_p+ qui peut  prendre les valeurs suivantes :
\begin{description}
\item[plein] : dans ce cas, on pointe avec un disque noir,
\item[creux] : dans ce cas, on pointe avec un cercle,
\item[croix] : dans ce cas, on pointe avec une croix.
\end{description}
Une fois ce choix fait, on peut repérer un point de deux façons :
\begin{description}
\item[pointe(A,B,C,\ldots)] permet de repérer les points avec le type de marquage choisi sans les nommer,
\item[nomme.pos(A)] permet de repérer le point $A$ avec le type de marquage choisi en le nommant à la position {\em pos}\footnote{Ce sont les positions classiques de MetaPost : llft,lft,ulft,top,urt,rt,lrt,bot}
\end{description}
On trouvera également les macros francisées \verb+trace+ et \verb+remplis+ pour remplacer respectivement \verb+draw+ et \verb+fill+.
\par\begin{multicols}{2}
\includegraphics[scale=1.25]{docfichierschrist.2}
\begin{verbatim}
figure(0,0,7u,6u);
pair A,B,C,D;
path cc,cd;
A=u*(1,1);
B=u*(6,1);
cc=cercledia(A,B);
cd=arccercle(B,A,iso(A,B));
C=pointarc(cc,30);
D=pointarc(cc,120);
remplis (C--arccercle(C,D,iso(A,B))--cycle)
 withcolor jaune;
trace A--B;
trace cd;
trace A--C--D;
trace codeperp(A,C,B,5);
marque_p:="plein";
nomme.llft(A);
pointe(D);
marque_p:="creux";
nomme.lrt(B);
marque_p:="croix";
nomme.urt(C);
fin;
\end{verbatim}
\end{multicols}
\subsection{Différents types de codage.}
Voici la liste des codages disponibles, ils sont tous à utiliser avec la commande \verb+trace+ :
\begin{description}
\item[Angle droit] : \verb+codeperp(A,B,C,5)+ produit un angle droit en $B$ avec pour \og{}épaisseur\fg{} 5.
\item[longueurs égales] : \verb+codesegments(A,B,C,D,n)+ code les segments $[AB]$ et $[CD]$ avec le codage d'ordre $n$ : 1, 2, 3 pour autant de traits, 4 pour la croix et 5 pour le cercle.
\item[Codage d'un angle] : \verb+codeangle.pos(A,B,C,2,5mm,btex nom etex)+ produit un codage de l'angle $\widehat{ABC}$ donné dans le sens direct par 2 arcs de cercles dont le premier est situé à $5\,mm$ du sommet $B$ et dont le nom est placé dans la position pos par rapport au \og{}milieu\fg{} des arcs de cercles.
\item[Marquage d'un angle] : \verb+marqueangle(A,B,C,2)+ produit un codage de l'angle $\widehat{ABC}$ donné dans le sens direct par 1 arc de cercle et 2 tirets sur cet arc.
\end{description}
$$\includegraphics{docfichierschrist.3}$$
\begin{multicols}{2}
\begin{verbatim}
figure(0,0,5u,5u);
pair A,B,C;
A=u*(1,1);
B=u*(4,1);
C=rotation(B,A,90);
trace triangle(A,B,C);
trace codeperp(B,A,C,5);
trace codesegments(B,A,A,C,2);
trace codeangle.ulft(C,B,A,1,5mm,btex 45° etex);
trace marqueangle(A,C,B,2);
nomme.llft(A);
nomme.lrt(B);
nomme.ulft(C);
fin;
\end{verbatim}
\end{multicols}
\subsection{Points.}
Quelques macros pour définir des points particuliers simplement :
\begin{description}
\item[iso(A,B,C,\ldots)] construit l'isobarycentre des points $A$, $B$, $C$, \ldots
\item[projection(M,A,B)] construit le projeté orthogonal de $M$ sur la droite $(AB)$.
\item[CentreCercleC(A,B,C)] construit le centre du cercle circonscrit au triangle $ABC$.
\item[Orthocentre(A,B,C)] construit l'orthocentre du triangle $ABC$.
\item[CentreCercleI(A,B,C)] construit le centre du cercle inscrit au triangle $ABC$.
\end{description}
\begin{multicols}{2}
$$\includegraphics[scale=0.75]{docfichierschrist.4}$$
\begin{verbatim}
figure(0,0,12u,12u);
pair A,B,C,O,H,G,I;
A=u*(1,1);
B=u*(11,1);
C=u*(5,8);
trace triangle(A,B,C);
O=CentreCercleC(A,B,C);
H=Orthocentre(A,B,C);
G=iso(A,B,C);
I=CentreCercleI(A,B,C);
marque_p:="plein";
nomme.top(G);
nomme.llft(H);
nomme.top(O);
nomme.top(I);
trace cercles(A,B,C);
trace C--projection(C,A,B) dashed evenly;
trace B--projection(B,A,C) dashed evenly;
trace codeperp(B,projection(B,A,C),C,5);
trace codeperp(C,projection(C,A,B),B,5);
trace cercles(I,projection(I,A,B));
marque_p:="non";
nomme.llft(A);
nomme.lrt(B);
nomme.top(C);
fin;
\end{verbatim}
\end{multicols}
\subsection{Cercles.}
\begin{description}
\item[cercledia(A,B)] construit le cercle de diamètre $[AB]$.
\item[cercles({\em expression})] peut construire trois types de cercles :
\begin{itemize}
\item[cercles(A,2cm)] construis le cercle de centre $A$ et de rayon $2\,cm$;
\item[cercles(F,G)] construis le cercle de centre $F$ et passant par $G$.
\item[cercles(A,G,D)] construis le cercle circonscrit au triangle $AGD$.
\end{itemize}
\item[pointarc(cc,45)] détermine le point du cercle \verb+cc+ qui a pour angle par rapport à l'horizontale 45°.
\item[arccercle(A,B,0)] construit l'arc de cercle de centre $O$ et allant de $A$ à $B$ dans le sens direct; $A$ et $B$ étant sur un même cercle.
\end{description}
\begin{multicols}{2}
$$\includegraphics[scale=0.75]{docfichierschrist.5}$$
\begin{verbatim}
figure(-3u,-u,8u,10u);
pair A,B,C,D,E,O;
O=u*(3.5,3.5);
A=u*(1,1);
path cc,cd;
cc=cercles(O,A);
trace cc withcolor orange;
B=pointarc(cc,45);
trace cercledia(A,B) withcolor rouge;
trace cercles(B,1cm) withcolor jaune;
cd=cercles(A,B);
C=pointarc(cd,75);
D=pointarc(cd,120);
E=CentreCercleC(D,O,C);
trace arccercle(C,D,E) withcolor violet;
trace D--E--C dashed evenly;
marque_p:="plein";
nomme.lrt(E);
nomme.top(A);
nomme.top(B);
nomme.top(C);
nomme.top(D);
nomme.top(O);
fin;
\end{verbatim}
\end{multicols}
\subsection{Droites.}
\begin{description}
\item[droite(A,B)] construit la droite $(AB)$;
\item[demidroite(A,B)] construit la demi-droite $[AB)$;
\item[mediatrice(A,B)] construit la médiatrice du segment $[AB]$;
\item[perpendiculaire(A,B,I)] construit la perpendiculaire à la droite $(AB)$ passant par $I$;
\item[parallele(A,B,I)] construit la parallèle à la droite $(AB)$ passant par $I$.
\item[triangleqcq(A,B,C)] construit un triangle $ABC$ (avec définition des points $A$, $B$, $C$ et appel ultérieur possible de ces points) qui est \og{}vraiment\fg{} quelconque au sens qu'il ne possède aucune propriété particulière.
\end{description}
\begin{multicols}{2}
$$\includegraphics[scale=0.75]{docfichierschrist.6}$$
\begin{verbatim}
figure(0,0,8u,8u);
pair A,B,C,D;
A=u*(1,1);
B=u*(7,4);
C=u*(4,6);
trace droite(A,B);
trace parallele(A,B,C);
trace mediatrice(A,B);
D=u*(2,5);
trace perpendiculaire(A,B,D);
nomme.top(A);
nomme.top(B);
nomme.top(C);
nomme.top(D);
fin;
\end{verbatim}
\end{multicols}
\subsection{Transformations.}
Dans ce qui suit, {\em objet} représente un objet connu de MetaPost (un point, un chemin, une figure,\ldots)
\begin{description}
\item[rotation({\em objet},O,60)] construit l'image de l'objet par la rotation de centre $O$ et d'angle 60° dans le sens direct.
\item[Symetrie({\em expression})] permet de construire 2 types d'image par symétrie:
\begin{description}
\item[symetrie({\em objet},B)] image de l'objet par la symétrie centrale de centre $B$.
\item[symetrie({\em objet},B,C)] image de l'objet par la symétrie axiale d'axe $(BC)$.
\end{description}
\end{description}
$$\includegraphics{docfichierschrist.7}$$
\begin{multicols}{2}
\begin{verbatim}
figure(0,0,20u,10u);
pair A,B,C,D,O;
A=u*(1,1);
B=u*(6,5);
O=u*(5,5);
C=u*(7,4);
path ima;
ima=u*(1,4)--u*(2,6)..u*(3,7)..u*(2.5,5)..cycle;
remplis ima withcolor violet;
trace rotation(ima,O,-60);
trace symetrie(ima,C);
trace symetrie(ima,A,B);
trace arccercle(rotation(W1,O,-60),W1,O)
 dashed evenly;
trace W1--O--rotation(W1,O,-60) dashed evenly;
trace W1--symetrie(W1,C) dashed evenly;
trace W1--symetrie(W1,A,B) dashed evenly;
trace droite(A,B);
marque_p:="croix";
nomme.top(A);
nomme.top(B);
nomme.bot(O);
nomme.top(C);
fin;
 
\end{verbatim}
\end{multicols}
\subsection{Sucres}
\begin{description}
\item[hachurage(chemin, angle, ecart, type de hachures)] permet d'hachurer {\em un chemin} {\bf fermé} avec des hachures faisant un {\em angle} par rapport à l'horizontale, hachures espacées d'un {\em ecart} et avec un certain style de traçage : 0 correspond à un trait continu, 1 un trait pointillé, 2 un trait d'axe.
\item[cotation(A,B,2mm,3mm,btex nom etex)] trace une flèche de cotation pour le segment $[AB]$ située à 2mm au dessus du segment $[AB]$ et une côte {\em nom} située à 3mm au dessus de la flèche de cotation. On peut bien sûr placé la flèche et la côte de manière \og{}négative\fg{}.
\item[appelation(A,B,2mm,btex nom etex)] permet de nommer la longueur du segment $[AB]$ avec {\em nom} situé à $2\,mm$ au dessus du segment $[AB]$.
\item[cotationmil(A,B,2mm,20,btex nom etex)] même chose que cotation sauf que la côte est placée au milieu de la flèche; pour cela, on a laissé un ecart de 2Opt autour du milieu de la flèche.
\end{description}
$$\includegraphics{docfichierschrist.8}$$
\begin{verbatim}
figure(0,0,15u,15u);
pair A,B,C,M,N,R;
A=u*(7,7);
B=u*(13,7);
path cc,cd,ce;
cc=cercles(A,B);
cd=cercles(B,A);
M=cc intersectionpoint cd;
N=symetrie(M,A,B);
R=pointarc(cd,180);
trace B--R;
ce=arccercle(M,N,A)--reverse(arccercle(M,N,B))--cycle;
trace hachurage(ce,60,0.3,1);
trace cc;
trace cd;
marque_p:="plein";
pointe(R,M,N,B);
trace cotation(M,B,0,2mm,btex rayon etex);
trace cotationmil(N,B,0,30,btex rayon etex);
trace appelation(R,B,2mm,btex rayon etex);
fin;
 
\end{verbatim}
\newpage
\section{Documentation sur papiers1.mp}\label{papiers}
[à suivre]
\newpage
\appendix
\section{Fichier christ5.tex}
\begin{verbatim}
%=========================================
%Macros personnelles
%christophe.poulain@melusine.eu.org
%création : 25 Septembre 1999
%dernière modification : 07 Avril 2003
%=========================================
\newtheorem{ppte}{Propriété}
\newtheorem{theo}{Théorème}
\newtheorem{defi}{Définition}
\newtheorem{lemme}{Lemme}
\newtheorem{coro}{Corollaire}
\newtheorem{prop}{Proposition}
\newtheorem{reg}{Règle}
\newtheorem{conj}{Conjecture}
\newtheorem{remar}{Remarque}
\newtheorem{exem}{Exemple}
 
\newcommand{\rema}{\underline{Remarque} }
\newcommand{\exe}{\underline{Exemple} }
\newcommand{\pre}{\underline{Preuve}}
\newcommand{\cas}{\underline{Cas particulier}}
\newcommand{\cass}{\underline{Cas particuliers}}
\newcommand{\Not}{\underline{Notation} }
\newcommand{\Si}{\underline{Si} }
\newcommand{\si}{\underline{si} }
\newcommand{\alors}{\underline{alors} }
\newcommand{\cons}{\underline{Conséquence}}
 
\def\qed{\hfill\raise -2pt\hbox{\vrule\vbox to 10pt{\hrule width4pt\vfill\hrule}\vrule}}
\def\cqfd{\hfill\unskip\kern 6pt\penalty 500\qed\par}
 
\catcode`\@=11
\def\Eqalign#1{\null\,\vcenter{\openup\jot\m@th\ialign{
\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
&&\quad\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$
\hfil\crcr #1\crcr}}\,}
\catcode`\@=12
 
\newcommand{\vecteur}[1]
{\overrightarrow{#1}}
 
\font\tenbb=msbm10
\font\sevenbb=msbm7
\font\fivebb=msbm5
\newfam\bbfam
\textfont\bbfam=\tenbb
\scriptfont\bbfam=\sevenbb
\scriptscriptfont\bbfam=\fivebb
\def\bb{\fam\bbfam\tenbb}
\let\oldbb=\bb
\def\bb #1{{\oldbb #1}}
 
\def\tvi{\vrule height 12pt depth 5pt width 0pt}
\def\tvj{\vrule height 12pt depth 5pt width 1pt}
\def\hfq{\hfill\,\,}
\def\cc#1{\hfq #1\hfq}
\def\tv{\tvi\vrule}
\def\tw{\tvj\vrule}
\def\traithorizontal{\noalign{\hrule}}
\def\traithorizontale{\noalign{\hrule height 1pt}}
 
\newcommand{\encadre}[1]
{\begin{center}
\fbox{\begin{minipage}{\linewidth}
{#1}
\end{minipage}}
\end{center}
}
 
\def\pgcd{\mathop{\rm pgcd}\nolimits}
\def\ppcm{\mathop{\rm ppcm}\nolimits}
 
\def\cut{{}\hfill\cr \hfill{}}
 
\newcommand{\biindice}[3]%
{
\renewcommand{\arraystretch}{0.5}
\begin{array}[t]{c}
#1\\
{\scriptstyle #2}\\
{\scriptstyle #3}
\end{array}
\renewcommand{\arraystretch}{1}
}
 
\newlength{\ltxt}
\newcommand{\compo}[4]{
\setlength{\ltxt}{\linewidth}
\setbox#1=\hbox{\includegraphics[scale=#3]{#2.#1}}
\addtolength{\ltxt}{-\wd#1}
\addtolength{\ltxt}{-10pt}
\begin{minipage}{\wd#1}
\includegraphics[scale=#3]{#2.#1}
\end{minipage}
\hfill
\begin{minipage}{\ltxt}
#4
\end{minipage}
}
 
\newlength{\lntxt}
\newcommand{\Compo}[4]{
\setlength{\lntxt}{\linewidth}
\setbox#1=\hbox{\includegraphics[scale=#3]{#2}}
\addtolength{\lntxt}{-\wd#1}
\addtolength{\lntxt}{-10pt}
\begin{minipage}{\wd#1}
\includegraphics[scale=#3]{#2}
\end{minipage}
\hfill
\begin{minipage}{\lntxt}
#4
\end{minipage}
}
 
\newlength{\lnttxt}
\newcommand{\dispo}[3]{
\setlength{\lnttxt}{\linewidth}
\setbox#1=\hbox{#2}
\addtolength{\lnttxt}{-\wd#1}
\addtolength{\lnttxt}{-20pt}
\begin{minipage}{\wd#1}
#2
\end{minipage}
\hfill
\begin{minipage}{\lnttxt}
#3
\end{minipage}
}
 
\newcounter{num}[section]
\newcommand{\exo}{\addtocounter{num}{1}
\par
\par\underline{\bf Exercice~\thenum} }
 
\newcommand{\titrage}[2]{
{\Large #1}\hfill#2
\par\rule[+6pt]{\linewidth}{0.5mm}
\par
}
 
\newcommand{\titragedossier}[1]{
{\small #1}\hfill{\small www.melusine.eu.org/syracuse/poulecl/}
\par\rule[+6pt]{\linewidth}{0.5mm}
\par
}
 
\newcommand{\partie}[2]{
\begin{center}
\begin{minipage}{#1pt}
\begin{center}
\boxput*(0,0){\colorbox{white}{#2}}
{\rule{\linewidth}{0.5mm}}
\end{center}
\end{minipage}
\end{center}
\par
}
 
\newenvironment{myenumerate}{
\renewcommand{\theenumi}{\arabic{enumi}}
\def\labelenumi{{\bf \theenumi /}}
\begin{enumerate}}{\end{enumerate}}
\end{verbatim}
\section{Fichier geometriesyr11.mp}
\begin{verbatim}
%%===============================================
%% GEOMETRIESYR.MP
%% christophe.poulain@melusine.eu.org
%% Création : 19 Février 2003
%% Dernière modification : 22 Novembre 2003
%%===============================================
%------------------------------------------------
% Appel fichier
%------------------------------------------------
input constantes;
input papiers1;
%------------------------------------------------
% La figure (début et fin) JMS/CP
%------------------------------------------------
path feuillet;
numeric _tfig,_nfig;
pair coinbg,coinbd,coinhd,coinhg;
_nfig:=0;
def feuille(expr xa,ya,xb,yb) =
  feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle;
  coinbg := (xa,ya);
  coinbd := (xb,ya);
  coinhd := (xb,yb);
  coinhg := (xa,yb);
  z.so=coinbg;
  z.ne=coinhd;
 extra_endfig := "clip currentpicture to feuillet;" & extra_endfig;
enddef;
def figure(expr xa,ya,xb,yb) =
  _nfig:=_nfig+1;
    beginfig(_nfig);
    feuille(xa,ya,xb,yb);
    _tfig:= if (xb-xa)>(yb-ya): xb-xa else: yb-ya fi;
enddef;
def fin =
    endfig;
enddef;
%%-----------------------------------------------
%% Les marques (JMS)
%%-----------------------------------------------
string marque_p;
marque_p := "non";
marque_r := 20;
%------------------------------------------------
% Les tables
%------------------------------------------------
numeric _tn;
_tn:=0;
pair _t[];
%%-----------------------------------------------
%% Procédures d'affichage
%%-----------------------------------------------
def MarquePoint(expr p)=
  %JMS
  if marque_p = "plein":
    fill fullcircle scaled (marque_r/5) shifted p;
  elseif marque_p = "creux":
    fill fullcircle scaled (marque_r/5) shifted p withcolor white;
    draw fullcircle scaled (marque_r/5) shifted p;
  %fin JMS
  elseif marque_p = "croix":
    draw (p shifted (-u/20,u/20))--(p shifted (u/20,-u/20));
    draw (p shifted (-u/20,-u/20))--(p shifted (u/20,u/20));
  fi
enddef;
%JMS
vardef pointe(text t) =
  for p_ = t: if pair p_: MarquePoint(p_); fi endfor;
enddef;
vardef nomme@#(suffix p)=
  MarquePoint(p);
  label.@#(str p,p);
enddef;
def trace expr o =
    if path o: draw o else: draw o fi
enddef;
def remplis expr o =
    if path o: fill o else: fill o fi
enddef;
vardef triangle(expr aa,bb,cc)=aa--bb--cc--cycle
enddef;
%fin JMS
vardef bary(expr a,b,c,d)=
  save $;
  pair $;
  numeric t[];
  t1=uniformdeviate(1);
  t2=uniformdeviate(1);
  t3=uniformdeviate(1);
  t4=uniformdeviate(1);
  $=(1/(t1+t2+t3+t4))*(t1*a+t2*b+t3*c+t4*d);
  $
enddef;
vardef triangleqcq(text t)=
  save $;
  path $;
  pair pointchoisi[];
  pointchoisi1:=bary(coinbg,1/4[coinbg,coinbd],iso(coinbg,iso(coinhg,coinhd)),iso(coinhg,coinbg));
  pointchoisi2:=bary(coinbd,3/4[coinbg,coinbd],iso(coinbd,iso(coinhg,coinhd)),iso(coinhd,coinbd));
  test:=uniformdeviate(1);
  choix:=43+uniformdeviate(4);
  ecart:=abs(45-choix);
  relation:=60-(ecart/2)+uniformdeviate(ecart);
  if test<0.5 :
    pointchoisi3:=droite(pointchoisi1,rotation(pointchoisi2,pointchoisi1,choix)) intersectionpoint droite(pointchoisi2,rotation(pointchoisi1,pointchoisi2,-relation));
  else :
    pointchoisi3:=droite(pointchoisi2,rotation(pointchoisi1,pointchoisi2,-choix)) intersectionpoint droite(pointchoisi1,rotation(pointchoisi2,pointchoisi1,relation));
  fi
  j:=1;
  for p_=t:
    p_=pointchoisi[j];
    j:=j+1;
  endfor;
  $=pointchoisi1--pointchoisi2--pointchoisi3--cycle;
  $
enddef;
%------------------------------------------------
% Procédures de codage
%------------------------------------------------
%Codage de l'angle droit de sommet B
vardef codeperp(expr aa,bb,cc,m)=%normalement m=5
  (bb+m*unitvector(aa-bb))--(bb+m*unitvector(aa-bb)+m*unitvector(cc-bb))--(bb+m*unitvector(cc-bb))
enddef;
%Codage d'un milieu
vardef codemil(expr AA,BB, n) =%extrêmités-angle de codage
  save $,a,b,c,d;
  path $;
  pair a,b,c,d;
  a=1/2[AA,BB];
  b=(a+2*unitvector(BB-AA))-(a-2*unitvector(BB-AA));
  c=b rotated n shifted a;
  d=2[c,a];
  $=c--d;
  $
enddef;
%Codage de deux segments égaux
vardef codesegments(expr AA,BB,CC,DD,n)=%extrémités des segments(4)-type de codage
  save $,v,w;
  picture $;
  $=image(
    if n=5 :
      draw fullcircle scaled 0.1cm shifted (1/2[AA,BB]);
      draw fullcircle scaled 0.1cm shifted (1/2[CC,DD]);
    elseif n=4 :
      pair v,w;
      v=1/2[AA,BB];
      w=1/2[CC,DD];
      draw codemil(AA,BB,60);
      draw codemil(AA,BB,120);
      draw codemil(CC,DD,60);
      draw codemil(CC,DD,120);
    elseif n=3 :
      draw codemil(AA,BB,60);
      draw codemil(AA,BB,60) shifted (2*unitvector(AA-BB));
      draw codemil(AA,BB,60) shifted (2*unitvector(BB-AA));
      draw codemil(CC,DD,60);
      draw codemil(CC,DD,60) shifted (2*unitvector(CC-DD));
      draw codemil(CC,DD,60) shifted (2*unitvector(DD-CC));
    elseif n=2 :
      draw codemil(AA,BB,60) shifted unitvector(AA-BB);
      draw codemil(AA,BB,60) shifted unitvector(BB-AA);
      draw codemil(CC,DD,60) shifted unitvector(CC-DD);
      draw codemil(CC,DD,60) shifted unitvector(DD-CC);
    elseif n=1 :
      draw codemil(AA,BB,60);
      draw codemil(CC,DD,60);
    fi;
    );
    $
enddef;
%Codage de l'angle abc non orienté (mais donné dans le sens direct) n fois avec des mesures différentes
vardef codeangle@#(expr aa,bb,cc,nb,ecart,nom)=
  save s,p,$;
  path p;
  picture $;
  $=image(
    pickup pencircle scaled 0.25bp;
    for j=0 upto (nb-1) :
      draw arccercle(((ecart+j*mm)*unitvector(aa-bb) shifted bb),((ecart+j*mm)*unitvector(cc-bb) shifted bb),bb);
    endfor;
    label.@#(nom,iso((ecart+nb*mm)*unitvector(aa-bb) shifted bb,(ecart+nb*mm)*unitvector(cc-bb) shifted bb));
    );
  $
enddef;
 
vardef marqueangle(expr aa,bb,cc,mark)=%codage d'un angle de sommet bb dans le sens direct par la marque mark.
  save $;
  picture $;
  path rr;
  pair w;
  pair tangent;
  numeric t;
  rr=arccercle(bb+30*unitvector(aa-bb),bb+30*unitvector(cc-bb),bb);
  w=rr intersectionpoint droite(bb,CentreCercleI(aa,bb,cc));
  t=length rr/2;
  tangent=unitvector(direction t of rr);
  $=image(
    trace rr;
    if mark=1:
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,90);
    elseif mark=2:
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,90) shifted tangent;
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,90) shifted(-tangent);
    elseif mark=3:
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,90);
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,90) shifted(1.5*tangent);
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,90) shifted(-1.5*tangent);
    elseif mark=4:
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,45);
      trace rotation((w shifted(5*tangent))--(w shifted(-5*tangent)),w,-45);
    fi;
    );
  $
enddef;
%------------------------------------------------
% Points
%------------------------------------------------
%JMS
vardef iso(text t) =
    save s,n; numeric n; pair s; s := (0,0) ; n := 0;
    for p_ = t: s := s + p_; n := n + 1 ; endfor;
    if n>0: (1/n)*s fi
enddef;
% -- projection de m sur (a,b)
vardef projection(expr m,a,b) =
    save h; pair h;
    h - m = whatever * (b-a) rotated 90;
    h = whatever [a,b];
    h
enddef;
% -- centre du cercle circonscrit
vardef CentreCercleC(expr a, b ,c) =
    save o; pair o;
    o - .5[a,b] = whatever * (b-a) rotated 90;
    o - .5[b,c] = whatever * (c-b) rotated 90;
    o
enddef;
% -- orthocentre
vardef Orthocentre(expr a, b, c) =
  save h; pair h;
  h - a = whatever * (c-b) rotated 90;
  h - b = whatever * (a-c) rotated 90;
  h
enddef;
%fin JMS
vardef CentreCercleI(expr aa,bb,cc)=
  save $,a,c;
  pair $;
  numeric a,c;
  a=(angle(aa-cc)-angle(bb-cc))/2;
  c=(angle(cc-bb)-angle(aa-bb))/2;
  ($-cc) rotated a shifted cc=whatever[aa,cc];
  ($-bb) rotated c shifted bb=whatever[bb,cc];
  $
enddef;
%------------------------------------------------
% Cercles
%------------------------------------------------
%Cercle connaissant le centre A et le rayon q
vardef cercle(expr aa, q)=fullcircle scaled (2*q) shifted aa
enddef;
%Cercle de centre A et passant par B
vardef cerclepoint(expr aa,bb)=fullcircle scaled (2*abs(aa-bb)) shifted aa
enddef;
%Cercle connaissant le diamètre [AB]
vardef cercledia(expr aa,bb)=
  fullcircle scaled (2*abs(1/2[aa,bb]-bb)) shifted (1/2[aa,bb])
enddef;
%Cercles complets
vardef cercles(text t)=
  save $;
  path $;
  save n;
  n:=0;
  for p_=t:
    if pair p_:
      n:=n+1;
      _t[n]:=p_;
    fi
    if numeric p_:
      rayon:=p_;
    fi;
  endfor;
  if n=1 : $=fullcircle scaled (2*rayon) shifted _t[1];
  elseif n=2 : $=fullcircle scaled (2*abs(_t[1]-_t[2])) shifted _t[1];
  elseif n=3 : $=cercles(CentreCercleC(_t[1],_t[2],_t[3]),_t[1]);
  fi
  $
  enddef;
%Point particulier sur le cercle
vardef pointarc(expr cercla,angle)=
  point(arctime((angle/360)*arclength cercla) of cercla) of cercla
enddef;
%Arc de cercle AB de centre 0(dans le sens direct) : les points A et B doivent être sur le cercle.
vardef arccercle(expr aa,bb,oo)=
  path tempo;
  path arc;
  tempo=cercle(oo,abs(aa-oo));
  if (angle(aa-oo)=0) or (angle(aa-oo)>0) :
    if (angle(bb-oo)=0) or (angle(bb-oo)>0):
      if (angle(aa-oo)<=angle(bb-oo)):
        arc=subpath(angle(aa-oo)*(length tempo)/360,angle(bb-oo)*(length tempo)/360) of tempo;
      else:
        arc=subpath(angle(aa-oo)*(length tempo)/360,(length tempo)+angle(bb-oo)*(length tempo)/360) of tempo;
      fi;
    else :
      if (angle(aa-oo)=angle(bb-oo)) or (angle(aa-oo)>angle(bb-oo)):
        arc=subpath(angle(aa-oo)*(length tempo)/360,(length tempo)+angle(bb-oo)*(length tempo)/360) of tempo;
      fi;
    fi;
  else:
    if (angle(bb-oo)<0):
      if (angle(aa-oo)<=angle(bb-oo)):
        arc=subpath((length tempo)+angle(aa-oo)*(length tempo)/360,(length tempo)+angle(bb-oo)*(length tempo)/360) of tempo;
      else:
        arc=subpath((length tempo)+angle(aa-oo)*(length tempo)/360,2*(length tempo)+angle(bb-oo)*(length tempo)/360) of tempo;
      fi;
    else :
      if (angle(aa-oo)=angle(bb-oo)) or (angle(aa-oo)<angle(bb-oo)):
        arc=subpath((length tempo)+angle(aa-oo)*(length tempo)/360,(length tempo)+angle(bb-oo)*(length tempo)/360) of tempo;
      fi;
    fi;
  fi
  arc
enddef;
%------------------------------------------------
% Droites
%------------------------------------------------
vardef droite(expr AA,BB)=(_tfig/abs(AA-BB))[BB,AA]--(_tfig/abs(AA-BB))[AA,BB]
enddef;
vardef demidroite(expr AA,BB)=AA--(_tfig/abs(AA-BB))[AA,BB]
enddef;
vardef mediatrice(expr AA,BB)=droite(iso(AA,BB),rotation(BB,iso(AA,BB),90))
enddef;
vardef perpendiculaire(expr AA,BB,II)=droite(iso(AA,BB),rotation(BB,iso(AA,BB),90)) shifted (II-iso(AA,BB))
enddef;
vardef parallele(expr AA,BB,II)=droite(AA,BB) shifted (II-(projection(II,AA,BB)))
enddef;
%------------------------------------------------
% Transformations
%------------------------------------------------
vardef rotation(expr p,c,a)=
  p rotatedaround(c,a)
enddef;
vardef symetrie(expr x)(text t)=
  save n;
  n:=0;
  for p_=t:
    n:=n+1;
    _t[n]:=p_;
  endfor;
  if n=1:
    rotation(x,_t[1],180)
  elseif n=2:
    x reflectedabout(_t[1],_t[2]) 
  fi
enddef;
%------------------------------------------------
%Sucres
%------------------------------------------------
vardef hachurage(expr chemin, angle, ecart, trace)=
  save $;
  picture $;
  path support;
  support=((u*(-37,0))--(u*(37,0))) rotated angle;
  if trace=1:
    drawoptions(dashed evenly);
  elseif trace=2:
    drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp));
  fi;
  $ = image(
    for j=-200 upto 200:
      if ((support shifted (ecart*j*(u,0))) intersectiontimes chemin)<>(-1,-1):
        draw support shifted (ecart*j*(u,0));
      fi
    endfor;
    );
  clip $ to chemin;
  drawoptions();
  $
enddef;
%flèche pour coter un segment [AB] (Jacques Marot)
vardef cotation(expr aa,bb,ecart,decalage,cote)=
  pair m[] ;
  save $;
  picture $;
  m3=unitvector(bb-aa) rotated 90;
  m1=aa+ecart*m3;
  m2=bb+ecart*m3;
  $=image(
    pickup pencircle scaled 0.2bp;
    drawdblarrow m1--m2 ;
    draw aa--m1 dashed evenly;
    draw bb--m2 dashed evenly;
    label(cote rotated angle(m2-m1),(m1+m2)/2+decalage*m3);
    );
  $
enddef;
 
vardef appelation(expr aa,bb,decalage,cote)=
  save $;
  picture $;
  pair m[];
  m3=unitvector(bb-aa) rotated 90;
  $=image(
    label(cote rotated angle(bb-aa),(bb+aa)/2+decalage*m3);
    );
  $
enddef;
 
vardef cotationmil(expr aa,bb,ecart,decalage,cote)= %Christophe
  pair m[] ;
  save $;
  picture $;
  m3=unitvector(bb-aa) rotated 90;
  m1=aa+ecart*m3;
  m2=bb+ecart*m3;
  $=image(
    pickup pencircle scaled 0.2bp;
    drawarrow (1/2[m1,m2]+decalage*unitvector(m1-m2))--m1;
    drawarrow (1/2[m1,m2]-decalage*unitvector(m1-m2))--m2;
    draw aa--m1 dashed evenly;
    draw bb--m2 dashed evenly;
    label(cote rotated angle(m2-m1),(m1+m2)/2);
    );
  $
enddef;
 
endinput
\end{verbatim}
\end{document}