Je dessine une implantation de caméras.

La convention est de dessiner en plan les appareils de prise de vue par un carré (qui représente le corps de la caméra) auquel est accolé un triangle isocèle (qui représente son objectif et, partant, son angle de prise de vue). Ça ressemblerait vaguement à ce schéma :

alt text

Je cherche donc à représenter un carré et un triangle. Faute de connaître quelque chose qui serait plus adapté, j'ai choisi la librairie TikZ « shapes » :

\documentclass[tikz
, border = 2 mm
]{standalone}
\usetikzlibrary{shapes.geometric}

\tikzset{
shape square/.style = {
color = black!30,
draw,
fill = yellow!30,
inner xsep = 2.5 cm,
inner ysep = 2.5 cm
}
}

\tikzset{
shape triangle/.style = {
color = black!30,
draw,
fill = red!30,
inner xsep = 2 cm,
inner ysep = 2 cm
}
}

\begin{document}

\Huge

\begin{tikzpicture}

\node[name = skware, shape = rectangle, shape square] {} ;

\node[name = treeangle, shape = isosceles triangle, shape triangle, inner xsep = 1 cm, rotate = 180] at (skware.east){} ;

\end{tikzpicture}
\end{document}

Je voudrais que l'apex du triangle soit collé sur le east du carré. Comment faire ?


EDIT : je suis également preneur de toute suggestion permettant d'imiter ledit schéma sans utiliser cette librairie !

Le tout est que je puisse le positionner sur mon plan à plusieurs reprises et que les objectifs pointent dans différentes directions (chose que je pense réaliser via le paramètre rotate).

Enfin, je suis tout à fait prêt à reconnaître que, si ça se trouve, je suis victime du syndrome XYZ !

Posée 27 Jui '23, 23:20

Pathe's gravatar image

Pathe ♦♦
7.5k42203251
Taux d'acceptation : 55%

Modifiée 27 Jui '23, 23:41


C'est un bel exemple où l'utilisation des pics est intéressante.

Ici, je définis la pic camera en lui associant plusieurs paramètres:

  • size pour indiquer la taille de base (1cm par défaut)
  • rotate pour indiquer l'orientation (0 par défaut)
  • fill et draw pour indiquer les couleurs de remplissage (white par défaut) et de dessin (black par défaut).

Ces paramètres sont stockés dans des macros mais comme le code dessinant la caméra est dans un groupe (entre \bgroup et \egroup), ce stockage est temporaire et ne pollue pas la suite du document.

Lors du dessin d'une pic camera, je définis quelques coordonnées (-center et d'autres) afin de pouvoir les réutiliser ensuite (le nom de la pic définit en fait le préfixe du nom de ces coordonnées).

\documentclass{standalone}

\usepackage{tikz}

\tikzset{
  % on crée la famille 'camera' pour définir ses clés
  camera/.is family,
  % quelques paramètres,
  camera/rotate/.store in=\cameraangle,
  camera/size/.store in=\camerasize,
  camera/fill/.store in=\camerafill,
  camera/draw/.store in=\cameradraw,
  % le style définissant les valeurs par défaut
  camera/default/.style={
    rotate=0,
    size=1cm,
    fill=white,
    draw=black,
  },
  % la camera elle-même
  camera/.pic={
    \bgroup
    % on récupère les paramètres (via la famille 'camera')
    \tikzset{camera,default,#1}
    \coordinate (-center) at (0,0);
    \begin{scope}[rotate around={\cameraangle:(-center)}]
      % lens
      \path[draw=\cameradraw,fill=\camerafill,rounded corners=.5mm] (-center)
      ++(.3*\camerasize,0)
      -- ++(.6*\camerasize,-.45*\camerasize)
      -- ++(0,.9*\camerasize)
      -- cycle;
      % body
      \path[draw=\cameradraw,fill=\camerafill,rounded corners=.5mm] (-center)
      ++(-.6*\camerasize,-.5*\camerasize) coordinate (-north west)
      -- ++(1.2*\camerasize,0) coordinate (-north east)
      -- ++(0,1*\camerasize) coordinate (-south east)
      -- ++(-1.2*\camerasize,0) coordinate (-south west)
      -- cycle;
    \end{scope}
    \egroup
  },
}

\begin{document}
\begin{tikzpicture}
  \path
  (0,0) pic (c1) {camera}
  (2,2) pic (c2) {camera={rotate=45,size=5mm,fill=pink,draw=red}};

  \fill[blue]
  (c1-center) circle(2pt)
  (c2-center) circle(2pt);
\end{tikzpicture}
\end{document}

résultat

Lien permanent

Publiée 09 Jul '23, 07:42

Paul%20Gaborit's gravatar image

Paul Gaborit
2.0k16
Taux d'acceptation : 30%

Modifiée 09 Jul '23, 07:43

J'ai rédigé ceci :

\documentclass[tikz
, border = 2 mm
]{standalone}

\usetikzlibrary{shapes.geometric}
\usetikzlibrary{positioning}

\tikzset{
lens/.style = {
  draw
  , thick
  , regular polygon
  , regular polygon sides=3
  , anchor = north
}
}

\tikzset{
body/.style = {
  draw
  , thick
  , fill = white
  , regular polygon
  , regular polygon sides=4
}
}

\newcommand\camera[3]{%
    \begin{scope}
  \node[lens, rotate around = {#3:(0, 0)}, inner sep = .7 mm] (a) at (#1, #2) {~} ;
  \node[body, rotate around = {#3:(0, 0)}, inner sep = .5 mm] (a) at (#1, #2) {~~} ;
\end{scope}
}

\begin{document}
\begin{tikzpicture}

\camera{2}{2}{10}

\end{tikzpicture}
\end{document}

Les trois arguments de la commande camera me permettent de positionner ladite caméra où je le désire, avec l'angle souhaité. Ça convient à peu près.


EDIT : j'avais oublié le paramètre rotate around qui permet à la caméra de pivoter sur elle-même, au lieu de tourner par rapport au centre de la figure.

Lien permanent

Publiée 28 Jui '23, 08:08

Pathe's gravatar image

Pathe ♦♦
7.5k42203251
Taux d'acceptation : 55%

Modifiée 28 Jui '23, 12:18

Sur ce, je n'ai toujours pas pigé comment positionner un point d'un polygone par rapport à un point précis d'un autre polygone. Donc n'hésitez pas à répondre !

(29 Jui '23, 15:19) Pathe ♦♦ Pathe's gravatar image
Votre réponse
(dés)activer 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

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.