\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}