Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[TikZ] Milieu d'un côté d'un rectangle

446 views
Skip to first unread message

Denis Bitouzé

unread,
Nov 13, 2011, 8:41:14 AM11/13/11
to
Bonjour,

je sais, au moyen de la libraire calc de TikZ, récupérer le milieu d'un
segment dans un \coordinate :

\coordinate (A) at (1,0);
\coordinate (B) at (1,2);
\coordinate (M) at ($ (A)!.5!(B) $);

mais, pour un rectangle défini au moyen de « rectangle » (c'est-à-dire
en indiquant deux sommets opposés) :

\coordinate (sommet bas gauche) at (1,0);
\coordinate (delta rectangle) at (1,2);
\draw (sommet bas gauche) rectangle +(delta rectangle);

quel est le meilleur moyen de récupérer dans un \coordinate les milieux
des côtés par exemple verticaux ?

Merci d'avance.
--
Denis

Christophe Jorssen

unread,
Nov 13, 2011, 10:18:04 AM11/13/11
to
Je ne sais pas si c'est le meilleur moyen, mais c'en est un :-)

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathreplacing}
\begin{document}

L'idée vient de cette décoration :

\begin{tikzpicture}[>=stealth, every node/.style={midway, sloped, font=
\tiny},
decoration={show path construction,
moveto code={
\fill [red] (\tikzinputsegmentfirst) circle (2pt)
node [fill=none, below] {moveto};},
lineto code={
\draw [blue,->] (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast)
node [above] {lineto};
},
curveto code={
\draw [green!75!black,->] (\tikzinputsegmentfirst) .. controls
(\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
..(\tikzinputsegmentlast) node [above] {curveto};
},
closepath code={
\draw [orange,->] (\tikzinputsegmentfirst) --
(\tikzinputsegmentlast)
node [above] {closepath};}
}]
\path[decorate] (1,0) rectangle ++(1,2);
\end{tikzpicture}

On la transforme en...

\tikzset{%
make middle of lineto a coordinate/.style = {%
postaction = {%
/utils/exec = {\xdef\CoordCountMacro{0}},
decorate,
decoration = {%
show path construction,
lineto code = {%
\show\CoordCountMacro
\xdef\CoordCountMacro{\number\numexpr\CoordCountMacro+1\relax}%
\path (\tikzinputsegmentfirst) -- node[coordinate]
(Middle-\CoordCountMacro) {} (\tikzinputsegmentlast);},
closepath code={%
\xdef\CoordCountMacro{\number\numexpr\CoordCountMacro+1\relax}%
\path (\tikzinputsegmentfirst) -- node[coordinate]
(Middle-\CoordCountMacro) {} (\tikzinputsegmentlast);}}}}}

\begin{tikzpicture}
\draw[make middle of lineto a coordinate] (1,0) rectangle ++(1,2);
\foreach \i in {1,...,4} {%
\node[circle,fill,red,inner sep=2pt,label=above:$A_\i$] at (Middle-\i)
{};}
\end{tikzpicture}

et voilà...

\end{document}

--
Christophe

rpapa

unread,
Nov 13, 2011, 10:55:33 AM11/13/11
to
je ne sais pas si c'est le meilleur, ça marche mais ça nécessite
re-decrire le rectangle

\begin{tikzpicture}

\coordinate (sommet bas gauche) at (1,0);
\coordinate (delta rectangle) at (2,5);
\draw (sommet bas gauche) rectangle +(delta rectangle);

\path (sommet bas gauche) -| +(delta rectangle) coordinate[pos=0.25](D)
coordinate[pos=0.75](E);
\draw[red] (D) -- (E);
\path (sommet bas gauche) |-+(delta rectangle) coordinate[pos=0.25](F)
coordinate[pos=0.75](G);
\draw[red] (D) -- (E) -- (G)--(F)-- cycle;

\end{tikzpicture}

Jean-Jacques Rétorré

unread,
Nov 13, 2011, 11:32:31 AM11/13/11
to
Denis Bitouzé <dbito...@spam.wanadoo.fr> disait le 11/13/11 que :
Personnellement, je ferai quelque chose comme ça:

%%%%%%%%
\coordinate (sommet bas gauche) at (1,0);
\coordinate (delta rectangle) at (1,2);

\path (sommet bas gauche)|- node[circle,draw,inner sep=0pt,outer sep=0pt](sommet haut gauche){} +(delta rectangle) ;

\coordinate (M) at ($ (sommet bas gauche)!.5!(sommet haut gauche) $);

%%%%%%%

Je ne suis pas sûr que la précision soit totale, mais visuellement, ça a
l'air de marcher. Il faudrait quand même qu'un spécialiste de pgf
confirme.

--
JJR.

Paul Gaborit

unread,
Nov 13, 2011, 6:05:36 PM11/13/11
to

À (at) Sun, 13 Nov 2011 14:41:14 +0100,
Denis Bitouzé <dbito...@spam.wanadoo.fr> écrivait (wrote):
Voici une manière de faire (sans jamais utiliser la 'library' calc de tikz):

\begin{tikzpicture}
\coordinate (A) at (1,0);
\coordinate (B) at (1,2);
% Une autre manière de calculer un milieu
\path (A) -- (B) coordinate[pos=.5] (M);

\coordinate (sommet bas gauche) at (1,0);
\coordinate (delta rectangle) at (1,2);
% On dessine le rectangle...
\draw (sommet bas gauche) rectangle +(delta rectangle)
% ...et on en profite pour trouver son centre
% et son sommet en haut à droite
coordinate[pos=.5] (centre)
coordinate[pos=1] (sommet haut droit);

% une fois qu'on a le centre et deux sommets opposés,
% c'est plus facile...
\coordinate (milieu bord gauche) at (centre -| sommet bas gauche);
\coordinate (milieu bord bas) at (centre |- sommet bas gauche);
\coordinate (milieu bord droit) at (centre -| sommet haut droit);
\coordinate (milieu bord haut) at (centre |- sommet haut droit);

% Pour voir le résultat :
\tikzset{pt/.style={circle,fill=#1,inner sep=0mm,minimum size=4pt}}
\node[pt=red] at (A){};
\node[pt=red] at (B){};
\node[pt=blue] at (M){};
\node[pt=black] at (centre){};
\node[pt=orange] at (milieu bord gauche){};
\node[pt=orange] at (milieu bord bas){};
\node[pt=orange] at (milieu bord droit){};
\node[pt=orange] at (milieu bord haut){};
\end{tikzpicture}

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>

Denis Bitouzé

unread,
Nov 14, 2011, 2:31:20 AM11/14/11
to
Le dimanche 13/11/11 à 15h18,
Christophe Jorssen <christoph...@libre.fr.invalid> a écrit :

> [...]
> et voilà...

Wahou ! Je ne savais pas que je faisais des choses aussi compliquées
dans ma tête quand je calculais les coordonnées des milieux des côtés
d'un rectangle ;)

En tous cas, ça fonctionne parfaitement, merci !
--
Denis

Denis Bitouzé

unread,
Nov 14, 2011, 3:14:15 AM11/14/11
to
Le dimanche 13/11/11 à 16h55,
rpapa <rpapa...@apinc.org> a écrit :

> ça nécessite re-decrire le rectangle

Dommage...

> \path ... -| ... coordinate[pos=...](...);

Voilà ce qui me manquait, merci !
--
Denis

Denis Bitouzé

unread,
Nov 14, 2011, 3:16:49 AM11/14/11
to
Le lundi 14/11/11 à 00h05,
Paul Gaborit <Paul.G...@invalid.invalid> a écrit :

> Voici une manière de faire (sans jamais utiliser la 'library' calc de
> tikz):

J'apprécie (parce que sinon, il faut jouer avec les
\shorthandoff/on{!}).

> \begin{tikzpicture}
> \coordinate (A) at (1,0);
> \coordinate (B) at (1,2);
> % Une autre manière de calculer un milieu
> \path (A) -- (B) coordinate[pos=.5] (M);

Joli.

> \coordinate (sommet bas gauche) at (1,0);
> \coordinate (delta rectangle) at (1,2);
> % On dessine le rectangle...
> \draw (sommet bas gauche) rectangle +(delta rectangle)
> % ...et on en profite pour trouver son centre
> % et son sommet en haut à droite
> coordinate[pos=.5] (centre)
> coordinate[pos=1] (sommet haut droit);

Élégant.

> \coordinate (milieu bord gauche) at (centre -| sommet bas gauche);
> [...]

Astucieux.

Merci beaucoup !
--
Denis

Denis Bitouzé

unread,
Nov 14, 2011, 3:19:14 AM11/14/11
to
Le dimanche 13/11/11 à 17h32,
Jean-Jacques Rétorré <jj.r&torr&@gmail.com> a écrit :

> [...]
> ça a l'air de marcher.

Effectivement.

> Il faudrait quand même qu'un spécialiste de pgf confirme.

Je pense que ce sera confirmé mais l'astuce proposée par rpapa et par
Paul semble plus souple.

Merci en tous cas !
--
Denis

Alain Matthes

unread,
Dec 6, 2011, 3:29:02 AM12/6/11
to
On 2011-11-13 23:05:36 +0000, Paul Gaborit said:

>
> Voici une manière de faire (sans jamais utiliser la 'library' calc de tikz):
>
> \begin{tikzpicture}
> \coordinate (A) at (1,0);
> \coordinate (B) at (1,2);
> % Une autre manière de calculer un milieu
> \path (A) -- (B) coordinate[pos=.5] (M);
>
> \coordinate (sommet bas gauche) at (1,0);
> \coordinate (delta rectangle) at (1,2);
> % On dessine le rectangle...
> \draw (sommet bas gauche) rectangle +(delta rectangle)
> % ...et on en profite pour trouver son centre
> % et son sommet en haut à droite
> coordinate[pos=.5] (centre)
> coordinate[pos=1] (sommet haut droit);
>
> % une fois qu'on a le centre et deux sommets opposés,
> % c'est plus facile...

C'est en effet la méthode qui me semble la plus succinte. On peut même
condenser un peu

Par exemple on peut remplacer \path (A) -- (B) coordinate[pos=.5] (M);
par

\path (A) -- coordinate(M) (B) ; % par défaut ici pos=0.5 alors que
dans le cas précédent c'est pos=1.

Cela dit on peut appliquer "coordinate" après "rectangle pour le même résultat

\draw (A) rectangle coordinate (O) +(2,1);

Finalement le code devient :

\begin{tikzpicture}
\coordinate (A) at (1,0);
\draw (A) rectangle coordinate (O) +(2,1);
% définition du point recherché
\path (A) -- (A |- O) coordinate (M);

% reprise du style de Paul
\tikzset{pt/.style={circle,fill=#1,inner sep=0mm,minimum size=4pt}}
\node[pt=red] at (M){};
\end{tikzpicture}


Alain

Alain Matthes

unread,
Dec 6, 2011, 3:52:18 AM12/6/11
to
On 2011-12-06 08:29:02 +0000, Alain Matthes said:

> Finalement le code devient :
>
> \begin{tikzpicture}
> \coordinate (A) at (1,0);
> \draw (A) rectangle coordinate (O) +(2,1);
> % d�finition du point recherch�
> \path (A) -- (A |- O) coordinate (M);
>
> % reprise du style de Paul
> \tikzset{pt/.style={circle,fill=#1,inner sep=0mm,minimum size=4pt}}
> \node[pt=red] at (M){};
> \end{tikzpicture}

Il y a plus simple encore

On remplace
\path (A) -- (A |- O) coordinate (M);

par

\coordinate (M) at (A |- O);

Et plus simple encore si on a pas besoin de conserver le point

\tikzset{pt/.style={circle,fill=#1,inner sep=0mm,minimum size=4pt}}

\begin{tikzpicture}
\coordinate (A) at (1,0);
\draw (A) rectangle coordinate (O) +(2,1);
\node[pt=red] at (A |- O){}; % si on garde le point
\node[pt=red] (M) at (A |- O){};
\end{tikzpicture}

Alain


Denis Bitouzé

unread,
Dec 8, 2011, 10:47:39 AM12/8/11
to
Le mardi 06/12/11 à 09h52,
Alain Matthes <alain....@mac.com> a écrit :

> On 2011-12-06 08:29:02 +0000, Alain Matthes said:
>
> > Finalement le code devient :
> >
> > \begin{tikzpicture}
> > \coordinate (A) at (1,0);
> > \draw (A) rectangle coordinate (O) +(2,1);
> > % définition du point recherché
> > \path (A) -- (A |- O) coordinate (M);
> >
> > % reprise du style de Paul
> > \tikzset{pt/.style={circle,fill=#1,inner sep=0mm,minimum size=4pt}}
> > \node[pt=red] at (M){};
> > \end{tikzpicture}
>
> Il y a plus simple encore
>
> On remplace
> \path (A) -- (A |- O) coordinate (M);
>
> par
>
> \coordinate (M) at (A |- O);
>
> Et plus simple encore si on a pas besoin de conserver le point
>
> \tikzset{pt/.style={circle,fill=#1,inner sep=0mm,minimum size=4pt}}
>
> \begin{tikzpicture}
> \coordinate (A) at (1,0);
> \draw (A) rectangle coordinate (O) +(2,1);
> \node[pt=red] at (A |- O){}; % si on garde le point
> \node[pt=red] (M) at (A |- O){};
> \end{tikzpicture}

Merci pour ces précisions. Si on veut garder le point, c'est bien :

\node[pt=red] (M) at (A |- O){};

n'est-ce pas ?
--
Denis

Alain Matthes

unread,
Dec 11, 2011, 3:57:02 PM12/11/11
to
On 2011-12-08 15:47:39 +0000, Denis Bitouzé said:
>
> Merci pour ces précisions. Si on veut garder le point, c'est bien :
>
> \node[pt=red] (M) at (A |- O){};
>
> n'est-ce pas ?

oui

Alain

0 new messages