[TIKZ] flèches bout à bout pour construire un point

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[TIKZ] flèches bout à bout pour construire un point

Messagepar GMaths » Lundi 22 Avril 2013, 10:21

Bonjour,

Dans le code suivant
Code: Tout sélectionner
% !TEX TS-program = latexmk
% !TEX encoding = UTF-8
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage[a4paper,%
            hmargin={1cm,1cm},%
            vmargin={1cm,1cm},%
            nohead,nofoot]{geometry}

\setlength{\parindent}{0pt}

\usepackage{tikz}
\usetikzlibrary{arrows}
\tikzset{repere_3D_usuel/.style={x={(-0.353cm,-0.353cm)},z={(0cm,1cm)},y={(1cm,0cm)}}}

\usepackage[french]{babel}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\shorthandoff{:}
\begin{tikzpicture}[repere_3D_usuel,scale=5]
  \coordinate[label=left:$D$] (D) at (0,0,0);
  \coordinate[label=below left:$A$] (A) at (1,0,0);
  \coordinate[label=below right:$B$] (B) at (1,1,0);
  \coordinate[label=right:$C$] (C) at (0,1,0);
  \coordinate[label=left:$H$] (H) at (0,0,1);
  \coordinate[label=left:$E$] (E) at (1,0,1);
  \coordinate[label=right:$F$] (F) at (1,1,1);
  \coordinate[label=right:$G$] (G) at (0,1,1);
  \draw (A)--(B)--(F)--(E)--cycle (B)--(C)--(G)--(F) (G)--(H)--(E);
  \draw[dashed] (A)--(D)--(H) (D)--(C);
  \tikzset{vecteur/.style={->,>=stealth',shorten >=0pt,line width=1pt, blue}}           
  \draw[vecteur](B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node[above](M){$M$};
  \draw[vecteur,red](A)-- ++(0,1,0)-- ++(-.5,0,.5) node[above]{N};
  \draw[dotted](A)--(M);
\end{tikzpicture}
\shorthandon{:}

\end{document}


la ligne suivante ne convient pas :
Code: Tout sélectionner
  \draw[vecteur](B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node[above](M){$M$};


Avec celle-ci, la construction de la ligne en pointillés devient bonne mais je n'ai plus l'étiquette "M" :
Code: Tout sélectionner
  \draw[vecteur](B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node(M){};


Je précise que je sais rectifier... en concédant d'écrire une ou deux ligne de plus.

Mais je me demande quel serait code le plus court possible pour avoir :
  • (M) défni correctement de manière à avoir la ligne en pointillés tracée correctement pour montrer A, N, M alignés
  • l'étiquette M... en ayant nommé le node M, pour pouvoir m'en resservir dans le tracé de la ligne en pointillés ;
  • une flèche au bout de chaque segment des lignes brisées bleue et rouge.

Image


Est-il illusoire de ma part de chercher à faire tout ce que je dis en modifiant uniquement la ligne incriminée ?

D'avance, merci.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: [TIKZ] flèches bout à bout pour construire un point

Messagepar pg » Lundi 22 Avril 2013, 11:09

Pour les deux premiers points, il suffit de faire deux nodes :

Code: Tout sélectionner
\draw[vecteur](B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node[inner sep=0pt](M){} node[above]{$M$};

Pour le troisième point, on peut adapter TikZ: How to draw an arrow in the middle of the line? :

Code: Tout sélectionner
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage[a4paper,%
            hmargin={1cm,1cm},%
            vmargin={1cm,1cm},%
            nohead,nofoot]{geometry}

\setlength{\parindent}{0pt}

\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{decorations}
\usetikzlibrary{decorations.pathreplacing,decorations.markings}
\tikzset{repere_3D_usuel/.style={x={(-0.353cm,-0.353cm)},z={(0cm,1cm)},y={(1cm,0cm)}}}

\tikzset{
  % style to apply some styles to each segment of a path
  on each segment/.style={
    decorate,
    decoration={
      show path construction,
      moveto code={},
      lineto code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
      curveto code={
        \path [#1] (\tikzinputsegmentfirst)
        .. controls
        (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
        ..
        (\tikzinputsegmentlast);
      },
      closepath code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
    },
  },
  % style to add an arrow in the middle of a path
  end arrow/.style={postaction={decorate,decoration={
        markings,
        mark=at position 1.0 with {\arrow[#1]{stealth'}}
      }}},
}

\usepackage[french]{babel}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\shorthandoff{:}
\begin{tikzpicture}[repere_3D_usuel,scale=5]
  \coordinate[label=left:$D$] (D) at (0,0,0);
  \coordinate[label=below left:$A$] (A) at (1,0,0);
  \coordinate[label=below right:$B$] (B) at (1,1,0);
  \coordinate[label=right:$C$] (C) at (0,1,0);
  \coordinate[label=left:$H$] (H) at (0,0,1);
  \coordinate[label=left:$E$] (E) at (1,0,1);
  \coordinate[label=right:$F$] (F) at (1,1,1);
  \coordinate[label=right:$G$] (G) at (0,1,1);
  \draw (A)--(B)--(F)--(E)--cycle (B)--(C)--(G)--(F) (G)--(H)--(E);
  \draw[dashed] (A)--(D)--(H) (D)--(C);
  \tikzset{vecteur/.style={->,>=stealth',shorten >=0pt,line width=1pt, blue}}           
  \draw[vecteur,postaction={on each segment={end arrow}}] (B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node[inner sep=0pt](M){} node[above]{$M$};
  \draw[vecteur,red,postaction={on each segment={end arrow}}](A)-- ++(0,1,0)-- ++(-.5,0,.5) node[above]{N};
  \draw[dotted](A)--(M);
\end{tikzpicture}
\shorthandon{:}

\end{document}
Fichiers joints
fleches_bout_a_bout.png
pg
Modérateur
 
Messages: 2597
Inscription: Jeudi 14 Juin 2007, 23:31

Re: [TIKZ] flèches bout à bout pour construire un point

Messagepar GMaths » Lundi 22 Avril 2013, 11:23

pg a écrit:Pour les deux premiers points, il suffit de faire deux nodes :

Code: Tout sélectionner
\draw[vecteur](B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node[inner sep=0pt](M){} node[above]{$M$};


J'y avais pensé... et j'avais testé sans succès.

Dommage que j'ai fermé l'éditeur... car j'aurais annulé les dernières modifications pour pouvoir comparer ce qui est proposé avec ce que j'avais testé.
Je suis en train de me dire que j'avais dû probablement mettre des "++" inutiles entre les nodes.

pg a écrit:Pour le troisième point, on peut adapter TikZ: How to draw an arrow in the middle of the line? :

Code: Tout sélectionner
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage[a4paper,%
            hmargin={1cm,1cm},%
            vmargin={1cm,1cm},%
            nohead,nofoot]{geometry}

\setlength{\parindent}{0pt}

\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{decorations}
\usetikzlibrary{decorations.pathreplacing,decorations.markings}
\tikzset{repere_3D_usuel/.style={x={(-0.353cm,-0.353cm)},z={(0cm,1cm)},y={(1cm,0cm)}}}

\tikzset{
  % style to apply some styles to each segment of a path
  on each segment/.style={
    decorate,
    decoration={
      show path construction,
      moveto code={},
      lineto code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
      curveto code={
        \path [#1] (\tikzinputsegmentfirst)
        .. controls
        (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
        ..
        (\tikzinputsegmentlast);
      },
      closepath code={
        \path [#1]
        (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
      },
    },
  },
  % style to add an arrow in the middle of a path
  end arrow/.style={postaction={decorate,decoration={
        markings,
        mark=at position 1.0 with {\arrow[#1]{stealth'}}
      }}},
}

\usepackage[french]{babel}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\shorthandoff{:}
\begin{tikzpicture}[repere_3D_usuel,scale=5]
  \coordinate[label=left:$D$] (D) at (0,0,0);
  \coordinate[label=below left:$A$] (A) at (1,0,0);
  \coordinate[label=below right:$B$] (B) at (1,1,0);
  \coordinate[label=right:$C$] (C) at (0,1,0);
  \coordinate[label=left:$H$] (H) at (0,0,1);
  \coordinate[label=left:$E$] (E) at (1,0,1);
  \coordinate[label=right:$F$] (F) at (1,1,1);
  \coordinate[label=right:$G$] (G) at (0,1,1);
  \draw (A)--(B)--(F)--(E)--cycle (B)--(C)--(G)--(F) (G)--(H)--(E);
  \draw[dashed] (A)--(D)--(H) (D)--(C);
  \tikzset{vecteur/.style={->,>=stealth',shorten >=0pt,line width=1pt, blue}}           
  \draw[vecteur,postaction={on each segment={end arrow}}] (B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node[inner sep=0pt](M){} node[above]{$M$};
  \draw[vecteur,red,postaction={on each segment={end arrow}}](A)-- ++(0,1,0)-- ++(-.5,0,.5) node[above]{N};
  \draw[dotted](A)--(M);
\end{tikzpicture}
\shorthandon{:}

\end{document}


Joli !

J'ai donc eu raison de poser la question... avec le sentiment (après avoir beaucoup cherché) qu'il n'y avait pas d'option magique qui réglerait mon problème, sans avoir à réinventer la roue.

Je vais dépecer le code de "on each segment" : merci beaucoup !
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [TIKZ] flèches bout à bout pour construire un point

Messagepar GMaths » Lundi 22 Avril 2013, 12:03

pg a écrit:Pour les deux premiers points, il suffit de faire deux nodes :

Code: Tout sélectionner
\draw[vecteur](B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) node[inner sep=0pt](M){} node[above]{$M$};


J'ai songé à une autre façon de faire depuis :
Code: Tout sélectionner
\draw[vecteur](B)-- ++(0,1,0)-- ++(-1,0,0)-- ++(0,0,1) coordinate[label=above:$M$](M);
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités