I am also not 100% sure about the question, but hope this addresses the various parts I see.
Here is an example of a straight line, a curved line, and a shortened curved line (in violet):
1. Draw Straight Line:
\draw (G) -- (R)
produces the straight olive line from (G)
to (R)
.
2. Curved Line:
\draw (R) to[out=-20,in=-70] (B)
produces the red line with curvature. Instead of using --
, we use the to
syntax, and the options out=
specifies the angle at the start point, and the in=
specifies the angle at the end point.
Using distance=3cm
with the same in=
, and out=
we get the red dotted line.
3. Shortened Line:
Withe either of the straight or curved lines, one can use shorten <=
to shorten the start point or shorten >=
to shorten the end point. A shorten of 0.25cm
is applied to both ends of the violet line.
Code:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[ultra thick]
\coordinate (G) at (2.3,6.1);
\coordinate (R) at (6.4,3.9);
\coordinate (B) at (2.1,1.7);
\node [fill=green,circle] at (G) {};
\node [fill=red, circle] at (R) {};
\node [fill=blue, circle] at (B) {};
\draw [olive, -] (G) -- (R);
\draw [red] (R) to[out=-20,in=-70] (B);
\draw [red,dotted] (R) to[out=-20,in=-70, distance=3cm ] (B);
\draw [violet, ->, shorten <= 0.25cm, shorten >= 0.25cm] (B) to[out=120,in=150] (G);
\end{tikzpicture}
\end{document}
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:
- Angle α,
- angle β,
- length of vector w,
- 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
Best Answer
That is due to the fact that you are adding the final coordinate. They should not be there. Simply change the lines to:
This problem arises in far simpler situations as well, it is not inherent to the curve. Consider for example
\draw[->] (0,0) -- (2,0) (2,0);
which will give an upward pointing arrow on the end of a horizontal line. Basically the new coordinate begins a new path segment and only the last segment of the path is given the arrowtip.