2nd approach, non-cheating version
The "cheating" in the 2nd approach comes from predefining ALL 4 lines upper back ... lower foreground. When using the fixed point (fx)
correctly, one of them needs to be calculated from the rest.
In belows code line lower back
is calculated for the first object drawn, here membran. Once lower back is known as path lb
it's simply used for the others, like in the 2nd approach above.
This way there is NO more cheating wrt (fx)
.
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[
hlp/.style={teal,opacity=.5}, % reduce opacity to make less visible
ae/.style={anchor = east},
an/.style={anchor = north},
mb/.style={line width=2pt},
]
% ~~~ construction lines ~~~~~~~
\draw[hlp,name path=hor] (-8, 0 ) node[ae]{horizon} -- (8,0);
\draw[hlp,name path=ub] (-8,-2 ) node[ae]{upper back} -- (8,-2);
\draw[hlp,name path=uf] (-8,-3.5) node[ae]{upper forgr}-- (8,-3.5);
% ~~~ don't predefine lower back line ~~~~~~~~~~~~~~
% \draw[hlp,name path=lb] (-8,-6.5) node[ae]{lower back} -- (8,-6.5);
\draw[hlp,name path=lf] (-8,-8.5) node[ae]{lower forgr}-- (8,-8.5);
% ~~~ fixpoint ~~~~~~~
\coordinate (fx) at (3,0);
% ~~~ membran ~~~~~~~~~~~
\draw[hlp,name path=ln1] (fx) -- +(230:7); % start direction
\path[name intersections={of=ln1 and ub, by=P1}];
\path[name intersections={of=ln1 and uf, by=P2}];
\draw[hlp,name path=ln1a](P2) -- +(0,-5); % vert. down
\path[name intersections={of=ln1a and lf, by=P3}];
\draw[hlp,dashed,name path=ln1c](P3) -- (fx); % to show NO cheating
\draw[hlp,name path=ln1b](P1) -- +(0,-5); % vert. down
% ~~~ calculate, where lower back line should be ~~~~~~~~
\path[name intersections={of=ln1b and ln1c, by=P4}]; % <= !
\draw[opacity=0] (P4) -- +(-10,0) coordinate (P5);
\draw[hlp,name path=lb,] (P5) node[ae]{lower back} --+(17,0);
\draw[mb,fill=none] (P1) -- (P2) -- (P3) node[an]{membrane} -- (P4) -- cycle;
% ~~~ frame ~~~~~~~~~~~
\draw[hlp,name path=ln1] (fx) -- +(300:7); % start direction
\path[name intersections={of=ln1 and ub, by=F1}];
\path[name intersections={of=ln1 and uf, by=F2}];
\draw[hlp,name path=ln1a](F2) -- +(0,-5); % vert. down
\path[name intersections={of=ln1a and lf, by=F3}];
\draw[hlp,dashed] (F3) -- (fx); % to show NO cheating
\draw[hlp,name path=ln1b](F1) -- +(0,-5); % vert. down
\path[name intersections={of=ln1b and lb, by=F4}];
\draw[mb] (F1) -- (F2) -- (F3) node[an]{frame} -- (F4) -- cycle;
% ~~~ biplane ~~~~~~~~~~~
\draw[hlp,name path=ln1] (fx) -- +(215:10); % start direction
\path[name intersections={of=ln1 and ub, by=B1}];
\path[name intersections={of=ln1 and uf, by=B2}];
\draw[hlp,name path=ln1a](B2) -- +(0,-5); % vert. down
\path[name intersections={of=ln1a and lf, by=B3}];
\draw[hlp,dashed] (B3) -- (fx); % to show NO cheating
\draw[hlp,name path=ln1b](B1) -- +(0,-5); % vert. down
\path[name intersections={of=ln1b and lb, by=B4}];
\draw[mb] (B1) -- (B2) -- (B3) node[an]{biplane} -- (B4) -- cycle;
\end{tikzpicture}
\end{document}