Je souhaite pouvoir dessiner une équerre dans diverses positions (8 exactement : vers la droite/vers la gauche, debout/couchée, vers le haut/le bas) : elle est modélisée par le triangle ABC rectangle en A.

Je souhaite automatiser le positionnement de l'équerre grâce à une macro du même nom à l'aide d'options bien choisies.

Je dois donc calculer des coordonnées adaptées à chaque situation : l'abscisse de B et l'ordonnée de C. Pour cela j'utilise des variables :

  1. x (pour l'orientation Gauche/Droite),
  2. y (pour l'orientation Haut/Bas) et
  3. z (pour l'orientation Debout/Couchée)

dont je modifie les valeurs en fonction des options choisies.

Le problème est donc le suivant : comment réaliser des calculs sous TikZ et passer les résultats dans les coordonnées des points à tracer avec la commande \draw de TikZ ?

Les solutions que j'ai trouvées actuellement proposent d'encadrer les résultats entre accolades mais cela ne fonctionne pas.

Les coordonnées cartésiennes à obtenir sont donc :

  • A(0,0)
  • B({(5.1 * (\z) + (1 - (\z)) * 3) * (\x)},0)
  • C(0,{(5.1 * (1 - (\z)) + 3 * (\z)) * (\y)})

D'où le code ci-dessous, qui ne compile pas.

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
\usepackage[latin1,utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage{fourier}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{patterns,math}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{xkeyval}
\newcount\x
\newcount\y
\newcount\z
\makeatletter
%----------> \Equerre <----------
\definecolor{bleuI}{cmyk}{.2,.1,.1,.1}%black!50!blue!20!
\definecolor{bleuB}{cmyk}{0.2,0.4,0.4,0.05}%black!30!blue!70!
\define@cmdkey [DES] {Equerre} {inclinaison}{}
\define@cmdkey [DES] {Equerre} {CouleurInterieure}{}
\define@cmdkey [DES] {Equerre} {CouleurBord}{}
\define@cmdkey [DES] {Equerre} {bord}{}
\define@boolkey [DES] {Equerre} {xorientation}[true]{} % Gauche/Droite
\define@boolkey [DES] {Equerre} {yorientation}[true]{} % Haut/Bas
\define@boolkey [DES] {Equerre} {zorientation}[true]{} %Débout/Couchée
\define@cmdkey [DES] {Equerre} {xscale}{}
\define@cmdkey [DES] {Equerre} {yscale}{}
\presetkeys [DES] {Equerre}
{
inclinaison = 0,
CouleurInterieure = black!50!blue!20!,
CouleurBord = black!30!blue!70!,
bord=thick,
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Posée 21 Déc '19, 15:57

pdesmons's gravatar image

pdesmons
294919
Taux d'acceptation : 40%

Modifiée 21 Déc '19, 20:01

Pathe's gravatar image

Pathe ♦♦
7.6k49209252


A priori, c'est le comportement attendu, mais peu intuitif, de xkeyval :

  • la valeur par défaut (définie dans \@define@boolkey) est utilisée lorsqu'aucune valeur n'est donnée à une clef (mais que la clef est présente) ;
  • la valeur prédéfinie (par \presetkeys) est utilisée lorsque la clef n'est pas présente du tout.

(voir https://groups.google.com/forum/#!msg/fr.comp.text.tex/k7eqcXUKuRM/s4r1Or42KJoJ)

Deux solutions, donc :

  • mettre xorientation, yorentation, zorientation, sans leur associer de valeur, dans le premier argument de \Equerre ;
  • ou mettre la valeur par défaut dans presetkeys.
Lien permanent

Publiée 21 Déc '19, 23:57

nmarkey's gravatar image

nmarkey
1.4k29
Taux d'acceptation : 45%

Quant à la question initiale (comment faire des calculs de coordonnées avec tikz ?), la solution était bonne, mais il fallait juste inclure la bibliothèque calc :

Ouvrir dans l'éditeur Overleaf
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\equerre[3]{%
\coordinate(A) at (0,0);
\coordinate(B) at ({(5.1 * #3 + (1 - #3) * 3) * #1},0);
\coordinate(C) at (0,{(5.1 * (1 - (#3)) + 3 * (#3)) * (#2)});
\draw (A) -- (B) -- (C) -- cycle;}
\begin{document}
\begin{tikzpicture}
\equerre{1}{1}{-1}
\end{tikzpicture}
\end{document}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Lien permanent

Publiée 22 Déc '19, 00:37

nmarkey's gravatar image

nmarkey
1.4k29
Taux d'acceptation : 45%

J'ai une nouvelle proposition de code source ; cette fois-ci il compile grâce aux deux commandes \pgfmathparse et \pgfmathresult, mais je n'obtiens quand même pas le résultat escompté, à savoir faire pivoter mon équerre correctement selon les valeurs des booléens xorientation, yorientation et zorientation, passés en option de ma macro « équerre » dans laquelle sont modifiées les newcount \x, \y et \z.

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
\usepackage[latin1,utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage{fourier}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{patterns,math}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{xkeyval}
\newcount\x
\newcount\y
\newcount\z
\makeatletter
%----------> \Equerre <----------
\definecolor{bleuI}{cmyk}{.2,.1,.1,.1}%black!50!blue!20!
\definecolor{bleuB}{cmyk}{0.2,0.4,0.4,0.05}%black!30!blue!70!
\define@cmdkey [DES] {Equerre} {inclinaison}{}
\define@cmdkey [DES] {Equerre} {CouleurInterieure}{}
\define@cmdkey [DES] {Equerre} {CouleurBord}{}
\define@cmdkey [DES] {Equerre} {bord}{}
\define@boolkey [DES] {Equerre} {xorientation}[true]{} % Gauche/Droite
\define@boolkey [DES] {Equerre} {yorientation}[true]{} % Haut/Bas
\define@boolkey [DES] {Equerre} {zorientation}[true]{} %Débout/Couchée
\define@cmdkey [DES] {Equerre} {xscale}{}
\define@cmdkey [DES] {Equerre} {yscale}{}
\presetkeys [DES] {Equerre}
{
inclinaison = 0,
CouleurInterieure = black!50!blue!20!,
CouleurBord = black!30!blue!70!,
bord=thick,
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Lien permanent

Publiée 21 Déc '19, 18:16

pdesmons's gravatar image

pdesmons
294919
Taux d'acceptation : 40%

Modifiée 21 Déc '19, 20:03

Pathe's gravatar image

Pathe ♦♦
7.6k49209252

Les deux propositions de nmarkey me conviennent et solutionnent mon code : l'orientation souhaitée est parfaitement réalisée. Mais j'ai évidemment un autre problème : il devrait y avoir un vide ("trou blanc") dans la partie "centrale" des équerres. Or ce vide n'apparaît que lorsque les équerres sont dessinées debout... (voir les différences d'affichage dans les sous-sections "Equerres couchées" et "Equerres debout" dans le fichier PDF produit) ?

documentclass[12pt,a4paper]{article} usepackage[latin1,utf8]{inputenc} usepackage[french]{babel} usepackage[T1]{fontenc} usepackage{amsmath} usepackage{amsfonts} usepackage{amssymb} usepackage{lmodern} usepackage{fourier} usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} usepackage{tikz} usetikzlibrary{patterns,math,calc} usepackage{tkz-euclide} usetkzobj{all} usepackage{xkeyval}

newcountx newcounty newcountz

%newcountxB %newcountyC %newcountxD %newcountyD %newcountxE %newcountyE %newcountxF %newcountyF %newcountxG %newcountyG %newcountxH %newcountyH %newcountxI %newcountyI %newcountxJ %newcountxK %newcountyk %newcountyL

makeatletter %----------> Equerre <---------- definecolor{bleuI}{cmyk}{.2,.1,.1,.1}%black!50!blue!20! definecolor{bleuB}{cmyk}{0.2,0.4,0.4,0.05}%black!30!blue!70! define@cmdkey [DES] {Equerre} {inclinaison}{}
define@cmdkey [DES] {Equerre} {CouleurInterieure}{} define@cmdkey [DES] {Equerre} {CouleurBord}{} define@cmdkey [DES] {Equerre} {bord}{} define@boolkey [DES] {Equerre} {xorientation}[true]{} % Gauche/Droite define@boolkey [DES] {Equerre} {yorientation}[true]{} % Haut/Bas define@boolkey [DES] {Equerre} {zorientation}[true]{} % Débout/Couchée define@cmdkey [DES] {Equerre} {xscale}{} define@cmdkey [DES] {Equerre} {yscale}{} presetkeys [DES] {Equerre} { inclinaison = 0, CouleurInterieure = black!50!blue!20!, CouleurBord = black!30!blue!70!, bord=thick, xorientation = true, yorientation = false, zorientation = false, xscale=1, yscale=1 }{} % newcommand{Equerre}[2][]{% setkeys[DES]{Equerre}{#1} begin{scope}[shift={(#2)}, rotate=cmdDES@Equerre@inclinaison, xscale=cmdDES@Equerre@xscale, yscale=cmdDES@Equerre@yscale] ifDES@Equerre@xorientation x = 1 % équerre dessinée vers la droite de l'axe des ordonnées else x = -1 % équerre dessinée vers la gauche de l'axe des ordonnées fi ifDES@Equerre@yorientation y = 1 % équerre dessinée au-dessus de l'axe des abscisses else y = -1 % équerre dessinée en-dessous de l'axe des abscisses fi ifDES@Equerre@zorientation z = 0 % équerre dessinée "debout" else z = 1 % équerre dessinée "couchée" fi pgfmathparse{(5.1 * (z) + 3 * (1 - (z))) * (x)} let xB pgfmathresult pgfmathparse{(5.1 * (1 - (z)) + 3 * (z)) * (y)} let yC pgfmathresult pgfmathparse{0.6 * (x)} let xD pgfmathresult pgfmathparse{0.6 * (y)} let yD pgfmathresult pgfmathparse{(1.75 * (z) + 0.5 * (1 - (z))) * (x)} let xE pgfmathresult pgfmathparse{(1.75 * (1 - (z)) + 0.5 * (z)) * (y)} let yE pgfmathresult pgfmathparse{(3 * (z) + 0.6 * (1 - (z))) * (x)} let xF pgfmathresult pgfmathparse{(3 * (1 - (z)) + 0.6 * (z)) * (y)} let yF pgfmathresult pgfmathparse{(1.75 * (z) + 1.45 * (1 - (z))) * (x)} let xG pgfmathresult pgfmathparse{(1.75 * (1 - (z)) + 1.45 * (z)) * (y)} let yG pgfmathresult pgfmathparse{(1.975 * (1 - (z)) + 0.6 * (z)) * (x)} let xH pgfmathresult pgfmathparse{(1.975 * (z) + 0.6 * (1 - (z))) * (y)} let yH pgfmathresult pgfmathparse{(0.5 * (z) + 1.3 * (1 - (z))) * (x)} let xI pgfmathresult pgfmathparse{(0.5 * (1 - (z)) + 1.3 * (z)) * (y)} let yI pgfmathresult draw[cmdDES@Equerre@bord,color=cmdDES@Equerre@CouleurBord,fill=cmdDES@Equerre@CouleurInterieure,opacity=0.5] (xD,yD)--(xE,yE)--(xF,yF)--(xG,yG)--(xH,yH)--(xI,yI)--cycle (0,0)--(xB,0)--(0,yC)--cycle; %draw[cmdDES@Equerre@bord,color=cmdDES@Equerre@CouleurBord,fill=cmdDES@Equerre@CouleurInterieure] %(0,0) -- ({5.1x},0) -- (0,{-3y}) -- cycle; % Bord intérieur %pgfmathparse{0.6 * (x)} let xD pgfmathresult %pgfmathparse{0.6 * (y)} let yD pgfmathresult %pgfmathparse{(1.75 * (z) + 0.5 * (1 - (z))) * (x)} let xE pgfmathresult %pgfmathparse{(1.75 * (1 - (z)) + 0.5 * (z)) * (y)} let yE pgfmathresult %pgfmathparse{(3 * (z) + 0.6 * (1 - (z))) * (x)} let xF pgfmathresult %pgfmathparse{(3 * (1 - (z)) + 0.6 * (z)) * (y)} let yF pgfmathresult %pgfmathparse{(1.75 * (z) + 1.45 * (1 - (z))) * (x)} let xG pgfmathresult %pgfmathparse{(1.75 * (1 - (z)) + 1.45 * (z)) * (y)} let yG pgfmathresult %pgfmathparse{(1.975 * (z) + 0.6 * (1 - (z))) * (x)} let xH pgfmathresult %pgfmathparse{(1.975 * (1 - (z)) + 0.6 * (z)) * (y)} let yH pgfmathresult %pgfmathparse{(0.5 * (z) + 1.3 * (1 - (z))) * (x)} let xI pgfmathresult %pgfmathparse{(0.5 * (1 - (z)) + 1.3 * (z)) * (y)} let yI pgfmathresult %draw[cmdDES@Equerre@bord,color=cmdDES@Equerre@CouleurBord,fill=white,smooth,rounded corners=3pt,opacity=0] (xD,yD)--(xE,yE)--(xF,yF)--(xG,yG)--(xH,yH)--(xI,yI)--cycle; %draw[cmdDES@Equerre@bord,color=cmdDES@Equerre@CouleurBord,fill=white,smooth,rounded corners=3pt,opacity=1] %(0.6,{-0.6y}) -- (1.8,{-0.5y}) -- (3,{-0.6y}) -- (1.75,{-1.45y}) -- (0.6,{-1.975y}) -- (0.5,{-1.3y}) -- cycle; % codage de l'angle droit pgfmathparse{0.3 * (x)} let xJ pgfmathresult pgfmathparse{0.3 * (x)} let xK pgfmathresult pgfmathparse{0.3 * (y)} let yK pgfmathresult pgfmathparse{0.3 * (y)} let yL pgfmathresult draw[color=red] (xJ,0)--(xK,yK)--(0,yL); %({(-0.4/cmdDES@Equerre@xscale)min(cmdDES@Equerre@xscale,cmdDES@Equerre@yscale)x},0) -- %({(-0.4/cmdDES@Equerre@xscale)min(cmdDES@Equerre@xscale,cmdDES@Equerre@yscale)x}, %{(-0.4/cmdDES@Equerre@yscale)min(cmdDES@Equerre@xscale,cmdDES@Equerre@yscale)y}) -- %(0,{(-0.4/cmdDES@Equerre@yscale)min(cmdDES@Equerre@xscale,cmdDES@Equerre@yscale)y}); end{scope} } makeatother

begin{document}

section*{Equerre}

subsection{Equerres couchées}

Par défaut (x;y;z)=(1;-1;1) c'est-à-dire xorientation = true, yorientation =false, zorientation = false.

(x;y;z)=(1;-1;1) équerre couchée vers la droite et vers le bas

begin{tikzpicture} Equerre[CouleurInterieure=yellow]{1,-1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

(x;y;z)=(1;1;1) équerre couchée vers la droite et vers le haut

begin{tikzpicture} Equerre[CouleurInterieure=green,yorientation=true]{1,1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

(x;y;z)=(-1;-1;1) équerre couchée vers la gauche et le bas

begin{tikzpicture} Equerre[CouleurInterieure=blue,xorientation=false]{-1,-1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

(x;y;z)=(-1;1;1) équerre couchée vers la gauche et vers le haut

begin{tikzpicture} Equerre[CouleurInterieure=pink,xorientation=false,yorientation=true]{-1,1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

subsection{Equerres debout}

Par défaut (x;y;z)=(1;-1;1) c'est-à-dire xorientation = true, yorientation =false, zorientation = false.

(x;y;z)=(1;1;0) équerre debout vers la droite et vers le haut

begin{tikzpicture} Equerre[CouleurInterieure=orange,yorientation=true,zorientation=true]{1,1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

(x;y;z)=(1;-1;0) équerre debout vers la droite et vers le bas ???

begin{tikzpicture} draw[red] (-2,-2)--(6,-2); Equerre[CouleurInterieure=cyan,zorientation=true]{1,-1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

(x;y;z)=(-1;-1;0) équerre debout vers la gauche et le bas ???

begin{tikzpicture} Equerre[CouleurInterieure=gray,xorientation=false,zorientation=true]{-1,-1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

(x;y;z)=(-1;1;0) équerre debout vers la gauche et vers le haut ???

begin{tikzpicture} Equerre[CouleurInterieure=purple,xorientation=false,yorientation=true,zorientation=true]{-1,1} draw (0,0) node[red]{$times$}; draw (0,0) node[red,below]{O}; end{tikzpicture}

subsection{Autres exemples}

begin{tikzpicture} Equerre[inclinaison=90,CouleurInterieure=yellow,xscale=1,yscale=1]{-1,-1} Equerre[bord=dashed,inclinaison=-60,CouleurBord=red,xscale=1.5,yscale=.75]{4,1} Equerre[bord=dashed,inclinaison=30,CouleurBord=black,CouleurInterieure=cyan,xscale=0.5,yscale=0.5]{5,-5} end{tikzpicture}

begin{tikzpicture} Equerre[CouleurInterieure=yellow]{0,0} Equerre[CouleurInterieure=orange]{9,0} Equerre[CouleurInterieure=green,yorientation=false]{0,-6} Equerre[CouleurInterieure=blue,xorientation=false,yorientation=false]{9,-6} end{tikzpicture}

end{document}

Avec la bibliothèque calc

%draw (x,y) node[green,below]{$times$}; %draw (x,y) node[green,below]{O}; %coordinate(A) at (0,0); %coordinate(B) at ({(5.1 * z + (1 - z) * 3) * x},0); %coordinate(C) at (0,{3*y}); % Bord extérieur %draw[cmdDES@Equerre@bord,color=cmdDES@Equerre@CouleurBord,fill=cmdDES@Equerre@CouleurInterieure] %(A) -- (B) -- (C) -- cycle; %draw[cmdDES@Equerre@bord, %color=cmdDES@Equerre@CouleurBord, %fill=cmdDES@Equerre@CouleurInterieure, %evaluate={ %xB = (5.1 * (z) + (1 - (z)) * 3) * (x); %yC = (5.1 * (1 - (z)) + 3 * (z)) * (y); %} %] (0,0) -- (xB ,0) -- (0,yC) -- cycle;

Lien permanent

Publiée 22 Déc '19, 11:09

pdesmons's gravatar image

pdesmons
294919
Taux d'acceptation : 40%

1

Je vous recommande de lire et appliquer les conseils de mise en forme de code LaTeX dans la FAQ : https://texnique.fr/osqa/faq/#custom-id-code

(23 Déc '19, 19:54) nmarkey nmarkey's gravatar image
Votre réponse
[Masquer l'aperçu]

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Mots-clés de la question :

×109
×2
×2

Question posée : 21 Déc '19, 15:57

Question vue : 6,519 fois

Dernière mise à jour : 23 Déc '19, 19:54