# tilted planes as scopes

I am trying to rebuild the following 3D graphic with TikZ. Exact resemblance is not required, and I have actually decided to change the geometry and style a bit to increase the clarity of the (confusing) geometrical situation, but I've run into problems.

Here's my take at making it happen.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,3d,positioning}

\begin{document}
\begingroup
\pgfmathsetmacro{\PHIONE}{15}
\pgfmathsetmacro{\PHI}{45}
\pgfmathsetmacro{\THETAONE}{50}
\pgfmathsetmacro{\LLONE}{.5}
\pgfmathsetmacro{\LVONE}{.6}
\pgfmathsetmacro{\THETATWO}{50}
\pgfmathsetmacro{\LLTWO}{.5}
\pgfmathsetmacro{\LVTWO}{.6}

\begin{tikzpicture}[node distance=3.5mm,x={(0.866cm,0.5cm)}, y={(-0.866cm,0.5cm)}, z={(0cm,1cm)}, scale=2]
\coordinate [at={(0,0,0)}] (O);
\coordinate [at={(1.2,-1.2,0)}] (P1);
\coordinate [at={(-1.2,1.2,0)}] (P2);
\coordinate [at={(1,{-cos(\PHIONE)},{-sin(\PHIONE)})}] (refPHIONE);
\coordinate [at={(-1,{-cos(\PHI+\PHIONE)},{-sin(\PHI+\PHIONE)})}] (refPHI);
\coordinate [at={(1,-1,0)}] (refP1);
\coordinate [at={(1,0,0)}] (V1dir);
\coordinate [at={(\LVONE,0,0)}] (V1);
\coordinate [at={({\LVONE+\LLONE *cos(\THETAONE)},{\LLONE *sin(\THETAONE)*-cos(\PHIONE)},{\LLONE *sin(\THETAONE)*-sin(\PHIONE)})}] (l1a);
\coordinate [at={({\LVONE-\LLONE *cos(\THETAONE)},{\LLONE *sin(\THETAONE)* cos(\PHIONE)},{\LLONE *sin(\THETAONE)* sin(\PHIONE)})}] (l1b);
\coordinate [at={(-\LVTWO,0,0)}] (V2);
\coordinate [at={({-\LVTWO+\LLTWO *cos(\THETATWO)},{\LLTWO *sin(\THETATWO)*-cos(\PHI+\PHIONE)},{\LLTWO *sin(\THETATWO)*-sin(\PHI+\PHIONE)})}] (l2a);
\coordinate [at={({-\LVTWO-\LLTWO *cos(\THETATWO)},{\LLTWO *sin(\THETATWO)* cos(\PHI+\PHIONE)},{\LLTWO *sin(\THETATWO)* sin(\PHI+\PHIONE)})}] (l2b);
\draw[-,dashed] (O) -- (V1dir) -- (refP1) -- cycle;
\draw[-,blue,dashed] (refPHIONE) -- (1,{cos(\PHIONE)},{sin(\PHIONE)}) -- (0,{cos(\PHIONE)},{sin(\PHIONE)}) -- (0,{-cos(\PHIONE)},{-sin(\PHIONE)}) -- cycle;
\begin{scope}[canvas is yz plane at x=1]
\draw[->] (-1,0) arc(0:\PHIONE:-1) node[midway,right] {$\Phi_1$};
\end{scope}
\draw[-,red,dashed] (refPHI) -- (-1,{cos(\PHI+\PHIONE)},{sin(\PHI+\PHIONE)}) -- (0,{cos(\PHI+\PHIONE)},{sin(\PHI+\PHIONE)}) -- (0,{-cos(\PHI+\PHIONE)},{-sin(\PHI+\PHIONE)}) -- cycle;
\begin{scope}[canvas is yz plane at x=0]
\draw[->] ({-cos(\PHIONE)},{-sin(\PHIONE)}) arc(\PHIONE:\PHI+\PHIONE:-1) node[midway,right] {$\Phi$};
\end{scope}
\draw[->,thick,shorten >=2mm] (P1) -- (O);
\draw[->,thick,shorten >=2mm] (P2) -- (O);
\draw[->] (O) -- (1.5,0,0);
\draw[->] (O) -- (-1.5,0,0);
\draw[->,thick,blue] (O) -- (V1);
\draw[->,blue] (V1) -- (l1a);
\draw[->,blue] (V1) -- (l1b);
\draw[->,thick,red] (O) -- (V2);
\draw[->,red] (V2) -- (l2a);
\draw[->,red] (V2) -- (l2b);
\node[above of = V1] {$V_1$};
\node[below of = V2] {$V_2$};
\node[right of = P1] {$p$};
\node[left of = P2] {$p$};
\draw[->] (0.25,0) arc (0:-45:0.25) node[midway,above right=-2mm and 0mm] {$\theta^*$};
\draw[->] (V1) ++ (.25,0,0)  arc (0:-\THETAONE:.25) node[midway,above right=-2mm and 0mm] {$\theta_1$}; % this should be located in the blue plane
\draw[->] (V2) ++ (.25,0,0) arc (0:-\THETATWO:.25) node[midway,above right=-2mm and 0mm] {$\theta_2$}; % this should be located in the red plane
\end{tikzpicture}
\endgroup

\end{document}


Here is what it looks like:

The main graphical problem still left is that the arcs depicting the angles \theta_1 and \theta_2 are not within their respective planes (red and blue). I have fiddled around with the arc definitions, but didn't manage to make it work.

The other problem of more aesthetic nature in this case is that the code is a bit clumsy. I've done my very best to make it look as nice as possible, but all those angular calculations are really hard to read.

The solution I would like most would be to define scopes for the red and blue planes each, which would allow defining the points much more elegantly, and also provide an easy way out for the two problematic arcs, but I can't figure out how to define tilted planes as scopes.

Can somebody help me?

Also, any suggestion on how to increase the clarity of the depiction and make the picture more easily comprehensible is very welcome.

PS: For people interested in what this picture represents: It's used to define angular variables in proton-proton collisions at the LHC that are used to measure Higgs bosons. The spot marked X is the collision point at which the Higgs boson is produced, Z_1/V_1 (Z_2/V_2) are the primary decay products of the Higgs boson, and e^+/e^- and \mu^+/\mu^- are the secondary decay products. The real-world scale of the geometry is on the order of femtometers.

After giving the problem a bit of time and thought and digging around on stackoverflow more than I am willing to admit, I've come up with a solution.

The main ingredient for this was the answer to this question, which provided me with the means to perform an actual coordinate transformation.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,3d,positioning}

\tikzset{RPY/.code args={#1,#2,#3}{
% roll, pitch, yaw
\pgfmathsetmacro{\rollangle}{#1}%
\pgfmathsetmacro{\pitchangle}{#2}%
\pgfmathsetmacro{\yawangle}{#3}%
% to what vector is the x unit vector transformed, and which 2D vector is this?
\pgfmathsetmacro{\newxx}{cos(\yawangle)*cos(\pitchangle)}
\pgfmathsetmacro{\newxy}{sin(\yawangle)*cos(\pitchangle)}
\pgfmathsetmacro{\newxz}{-sin(\pitchangle)}
\path (\newxx,\newxy,\newxz);
\pgfgetlastxy{\nxx}{\nxy};
% to what vector is the y unit vector transformed, and which 2D vector is this?
\pgfmathsetmacro{\newyx}{cos(\yawangle)*sin(\pitchangle)*sin(\rollangle)-sin(\yawangle)*cos(\rollangle)}
\pgfmathsetmacro{\newyy}{sin(\yawangle)*sin(\pitchangle)*sin(\rollangle)+ cos(\yawangle)*cos(\rollangle)}
\pgfmathsetmacro{\newyz}{cos(\pitchangle)*sin(\rollangle)}
\path (\newyx,\newyy,\newyz);
\pgfgetlastxy{\nyx}{\nyy};
% to what vector is the z unit vector transformed, and which 2D vector is this?
\pgfmathsetmacro{\newzx}{cos(\yawangle)*sin(\pitchangle)*cos(\rollangle)+ sin(\yawangle)*sin(\rollangle)}
\pgfmathsetmacro{\newzy}{sin(\yawangle)*sin(\pitchangle)*cos(\rollangle)-cos(\yawangle)*sin(\rollangle)}
\pgfmathsetmacro{\newzz}{cos(\pitchangle)*cos(\rollangle)}
\path (\newzx,\newzy,\newzz);
\pgfgetlastxy{\nzx}{\nzy};
\pgfkeysalso{%
/tikz/x={(\nxx,\nxy)},
/tikz/y={(\nyx,\nyy)},
/tikz/z={(\nzx,\nzy)}
}
}
}

\begin{document}
\begingroup
\pgfmathsetmacro{\PHIONE}{15}
\pgfmathsetmacro{\PHI}{45}
\pgfmathsetmacro{\THETAONE}{45}
\pgfmathsetmacro{\LLONE}{.3}
\pgfmathsetmacro{\LVONE}{.4}
\pgfmathsetmacro{\THETATWO}{80}
\pgfmathsetmacro{\LLTWO}{.5}
\pgfmathsetmacro{\LVTWO}{.6}

\tikzset{angle/.style={->,shorten >=1pt,shorten <=1pt}}

\begin{tikzpicture}[node distance=.5em,x={(1.414cm,1cm)}, y={(-1.414cm,1cm)}, z={(0cm,2cm)},scale=1]
%% common definitions
\coordinate [at={(0,0,0)}] (O);
\coordinate [at={(1.2,-1.2,0)}] (P1);
\coordinate [at={(-1.2,1.2,0)}] (P2);
\draw[->,thick,shorten >=2mm] (P1) -- (O);
\draw[->,thick,shorten >=2mm] (P2) -- (O);
\draw[->] (O) -- (1.5,0,0);
\draw[->] (O) -- (-1.5,0,0);
\coordinate [at={(1,-1,0)}] (refP1);
%%% draw the blue part
\begin{scope}[RPY={\PHIONE,0,0}] %% blue plane
\coordinate [at={(1,-1,0)}] (refPHIONE);
\coordinate [at={(1,0,0)}] (V1dir);
\coordinate [at={(\LVONE,0,0)}] (V1);
\draw[->,thick,blue] (O) -- (V1);
\draw[-,blue,dashed] (refPHIONE) -- (1,1,0) -- (0,1,0) -- (0,-1,0) -- cycle;
\draw[angle] (V1) ++ (.25,0,0)  arc (0:-\THETAONE:.25) node[midway,above right=-2mm and 0mm] {$\theta_1$};
\begin{scope}[RPY={0,0,-\THETAONE},shift=(V1)] %% blue plane (rotated to decay products)
\coordinate [at={(\LLONE,0,0)}] (l1a);
\coordinate [at={(-\LLONE,0,0)}] (l1b);
\draw[->,blue] (V1) -- (l1a);
\draw[->,blue] (V1) -- (l1b);
\end{scope}
\end{scope}
%%% draw the red part
\begin{scope}[RPY={\PHI+\PHIONE,0,0}] %% red plane
\coordinate [at={(-1,-1,0)}] (refPHI);
\coordinate [at={(-1,0,0)}] (V2dir);
\coordinate [at={(-\LVTWO,0,0)}] (V2);
\draw[->,thick,red] (O) -- (V2);
\draw[-,red,dashed] (refPHI) -- (-1,1,0) -- (0,1,0) -- (0,-1,0) -- cycle;
\draw[angle] (V2) ++ (.25,0,0) arc (0:-\THETATWO:.25) node[midway,above right=-2mm and 0mm] {$\theta_2$};
\begin{scope}[RPY={0,0,-\THETATWO},shift=(V2)] %% red plane (rotated to decay products)
\coordinate [at={(\LLTWO,0,0)}] (l2a);
\coordinate [at={(-\LLTWO,0,0)}] (l2b);
\draw[->,red] (V2) -- (l2a);
\draw[->,red] (V2) -- (l2b);
\end{scope}
\end{scope}
%% relative angles
\draw[-,dashed] (O) -- (V1dir) -- (refP1) -- cycle;
\begin{scope}[canvas is yz plane at x=1]
\draw[angle] (-1,0) arc(0:\PHIONE:-1) node[midway,right] {$\Phi_1$};
\end{scope}
\begin{scope}[canvas is yz plane at x=0]
\draw[angle] ({-cos(\PHIONE)},{-sin(\PHIONE)}) arc(\PHIONE:\PHI+\PHIONE:-1) node[midway,right] {$\Phi$};
\end{scope}
\draw[angle] (0.25,0) arc (0:-45:0.25) node[midway,above right=-2mm and 0mm] {$\theta^*$};
%% labels
\node[above = of V1] {$V_1$};
\node[below = of V2] {$V_2$};
\node[right = of P1] {$p$};
\node[left  = of P2] {$p$};
\end{tikzpicture}
\endgroup

\end{document}


This is what the result looks like:

The only remaining problem is - and I can't understand where this is coming from - that the picture scaling via scale=X somehow behaves oddly and seems to affect the different dimensions differently - compare, for example, the output of scale=1 with the output of scale=2.

• Could this be related with the impossibility of scale some elements? – Renijk Dec 17 '14 at 20:17
• I really don't understand enough about the inner workings of TikZ to answer this question, but I was under the impression that somehow the dimensions are scaled differently, and I don't see how a line (created with \draw) should scale differently depending on its direction, although I am probably overlooking something here. – carsten Dec 18 '14 at 10:48