[Tex/LaTex] How to draw tikz arrows on a calculated triangle

calculationsintersectionstikz-pgf

I am going to need a lot of vector triangles and would like to do them with TikZ. My TikZ experience is close to not existing. Therefore I would like to ask you, if there is a possibility to draw calculated vector triangles (sums) with TikZ.

What I need:

  • three different coloured vectors pointing together in an triangle
  • possibility to define each triangle by "angle-length-angle"
  • maybe the possibility to hide one or two of these arrows.
  • a centred label aligned to the middle of each vector (for mathematical expressions)
  • the anchor point (0,0) should be the conjunction of c and w
  • the vector sum should be w + u or u + w

I want to get speed triangles (for volume flow in a machine). In the end I will position them on included images. Therefore I need the triangles, single vectors, arc vectors (direction of rotation) and vectors into the paper plane (cross in circle [into the paper] and point in circle [out of the paper]) which shall all look similar and recognizable.

Are such calculations possible within TIKZ? Should I take an other package? How can I get plain and technical speed triangle drawings which match the real volume flow?


A sample:

enter image description here

\alpha, \beta and |u| should be chosen by the user. The rest is calculated. Angle definitions between chosen vectors would also be great. E. g.: show angle between positive u and w as \beta

Best Answer

Please see revision 4 for a previous take on Op’s conditions and given variables.

The paper plane vectors are relative easy to produce. As you want to label them, I’d use a node with a custom path picture. Common properties are saved in the paper plane vector. The optional argument to paper plane vector in and paper plane vector out can be used to change the label.

As both triangles are rather hard to generalize, I created two distinctive but similar styles

  • vector triangle u+w and
  • vector triangle w+u.

The both accept four arguments, delimited by :. (I agree, both names and arguments could be chosen better.) Those arguments are:

  1. Angle α,
  2. angle β,
  3. length of vector w,
  4. an index for the edge nodes (it will be forwarded to the edge styles).

Further styles exist for

  • the angle marking @vector triangle angle (parameter 4 and 5 are auxiliary ones for when both angles lie at the same point) and three additional styles
    • for the dashed line,
    • for the arc line and
    • for the arc node;
  • every vector and every vector node, as well as
  • a style for every vector and every vector node (for u, w and c).

The style dashed line will be changed for when it will be under the u vector anyway or when it will be the same as the dashed line from the other angle.

In the u+w style the parallel marking will be appended to dashed line and will also be used for the u vector. The decorations.markings library is used for this.

The last few styles (see the comments in the code) are actually not mandatory as they are accessed with /.try handler. Without them, you will see a very raw version of the drawing.

Code

\documentclass[tikz,convert=false]{standalone}
\colorlet{RED}{red!75!black}
\colorlet{BLACK}{black}
\colorlet{BLUE}{blue!75!black}
\usetikzlibrary{decorations.markings}
\makeatletter
\tikzset{edge node/.code={% stolen from the CVS version
    \expandafter\def\expandafter\tikz@tonodes\expandafter{\tikz@tonodes #1}}}
\makeatother
%% The paper plane vector things
\tikzset{
  paper plane vector/.style={
    shape=circle,
    inner sep=+0pt,
    minimum size=+1em,
    label={#1}
  },
  paper plane vector out/.style={
    paper plane vector={[RED]above left:{$#1$}},
    draw=RED,
    path picture={
      \fill[RED] (path picture bounding box.center) circle [radius=+1.41\pgflinewidth];
    }
  },
  paper plane vector in/.style={
    paper plane vector={[BLACK]above left:{$#1$}},
    draw=BLACK,
    path picture={
      \draw[BLACK] (path picture bounding box.south west) -- (path picture bounding box.north east)
                   (path picture bounding box.south east) -- (path picture bounding box.north west);
    }
  },
  paper plane vector in/.default=u,
  paper plane vector out/.default=w}

%% The parallel marking
\tikzset{
  parallel marking/.style={
    postaction={
      decoration={
        name=markings,
        mark=at position .33 with {\draw[solid,thin,-] (+-6\pgflinewidth,+-4\pgflinewidth) -- ++ (+8\pgflinewidth,+8\pgflinewidth)
                                                       (+-2\pgflinewidth,+-4\pgflinewidth) -- ++ (+8\pgflinewidth,+8\pgflinewidth); }
      },
      decorate}}}

%% The triangles, consisting only of an 'insert path'
\tikzset{
  vector triangle u+w/.style args={#1:#2:#3:#4}{% #1 = alpha,
                                                % #2 = beta,
                                                % #3 = length of w,
                                                % #4 = an argument that gets forwarded to the
                                                %      edges, here an index
    insert path={
       coordinate (vt@o)
       +({90+#2}:{#3}) coordinate (vt@c)
       {[dashed line/.append style=parallel marking, @vector triangle angle={vt@o}{#2}{\beta}{0}{0}]}
       {[dashed line/.style={draw=none},@vector triangle angle={vt@o}{#1}{\alpha}{.1}{#2}]}
       (intersection of vt@o--[shift={(90+#1:20)}] vt@o and vt@c--[shift={(down:20)}] vt@c) edge[u vector/.try={#4},parallel marking] (vt@c)
                                                                                            edge[c vector/.try={#4}] (vt@o)
                                                                                     (vt@c) edge[w vector/.try={#4}] (vt@o)
    }
  },
  vector triangle w+u/.style args={#1:#2:#3:#4}{% #1 = alpha,
                                                % #2 = beta,
                                                % #3 = length of w,
                                                % #4 = an argument that gets forwarded to the
                                                %      edges, here an index
    insert path={
       coordinate (vt@o)
       + ({90+#2-180}:{#3}) coordinate (vt@c)
       (intersection of vt@o--[shift={({#1-90}:20)}] vt@o and vt@c--[shift={(up:20)}] vt@c) coordinate (vt@aux)
       [@vector triangle angle={vt@aux}{#1}{\alpha}{0}{0}]
       {[dashed line/.style={draw=none},@vector triangle angle={vt@c}{#2}{\beta}{0}{0}]}
       (vt@o) edge[w vector/.try={#4}] (vt@c)
              edge[c vector/.try={#4}] (vt@aux)
       (vt@c) edge[u vector/.try={#4}] (vt@aux)
    }
  },
  %% The angle drawing, the arguments #4 and #5 are only for angles that overlap (see the u+w style why), usually the ary '0'
  @vector triangle angle/.style n args={5}{
    insert path={
      (#1) edge[dashed line/.try] ++ (up:1)
      ++(up:.75+#4) edge[arc line/.try, to path={arc [radius=.75+#4, start angle=90, delta angle={#2}]}] ()
      node [rotate={#5+(#2-#5)/2}, arc node/.try] at ([shift=({90+#5+(#2-#5)/2}:.5)] #1) {$#3$}}}}

%% A few presets for the vectors and nodes.
%% If these are not given, the drawing will still work (the '.try' handler takes care of that)
%% but you will have a raw version (try it!)
\tikzset{
  every vector/.style 2 args={shorten >=\pgflinewidth,->,edge node={node[#1 node/.try] {$\vec{#1}_{#2}$}}},
    w vector/.style={every vector={w}{#1},RED},
    u vector/.style={every vector={u}{#1},BLACK},
    c vector/.style={every vector={c}{#1},BLUE},
  every vector node/.style={below,sloped,text={#1}},
    w node/.style={every vector node=RED},
    u node/.style={every vector node=BLACK},
    c node/.style={every vector node=BLUE,above},
  dashed line/.style={thin, densely dotted, line cap=butt},
  arc line/.style={thin, solid, ->, line cap=butt, shorten >=.5\pgflinewidth, shorten <=.5\pgflinewidth},
  arc node/.style={font=\scriptsize},
}
\begin{document}
\begin{tikzpicture}[>=latex,line cap=round]
  \node[paper plane vector in] {};
  \node[paper plane vector out] at (-1,0) {};

  \path (-1,-2) [vector triangle w+u=105:45:4.5:1];

  \path (7,-3)  [vector triangle u+w=105:45:4.5:2];
\end{tikzpicture}
\end{document}

Output

enter image description here


enter image description here