
Estou tentando reconstruir o seguinte gráfico 3D com TikZ. A semelhança exata não é necessária e, na verdade, decidi mudar um pouco a geometria e o estilo para aumentar a clareza da (confusa) situação geométrica, mas tive problemas.
Aqui está minha opinião sobre como fazer isso acontecer.
\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}
Aqui está o que parece:
O principal problema gráfico que ainda resta é que os arc
s representam os ângulos \theta_1
e \theta_2
não estão dentro dos seus respectivos planos (vermelho e azul). Eu brinquei com as arc
definições, mas não consegui fazer funcionar.
O outro problema de natureza mais estética neste caso é que o código é um pouco desajeitado. Fiz o meu melhor para que parecesse o mais bonito possível, mas todos aqueles cálculos angulares são realmente difíceis de ler.
A solução que eu mais gostaria seria definir escopos para os planos vermelho e azul cada, o que permitiria definir os pontos com muito mais elegância e também forneceria uma saída fácil para os dois problemas problemáticos arc
, mas não consigo descobrir como para definir planos inclinados como escopos.
Alguém pode me ajudar?
Além disso, qualquer sugestão sobre como aumentar a clareza da representação e tornar a imagem mais facilmente compreensível é muito bem-vinda.
PS: Para pessoas interessadas no que esta imagem representa: Ela é usada para definir variáveis angulares em colisões próton-próton no LHC que são usadas para medir bósons de Higgs. O ponto marcado X
é o ponto de colisão no qual o bóson de Higgs é produzido, Z_1
/ V_1
( Z_2
/ V_2
) são os produtos primários do decaimento do bóson de Higgs e e^+
/ e^-
e \mu^+
/ \mu^-
são os produtos secundários do decaimento. A escala da geometria do mundo real é da ordem dos femtômetros.
Responder1
Depois de dedicar um pouco de tempo e reflexão ao problema e pesquisar no stackoverflow mais do que estou disposto a admitir, encontrei uma solução.
O ingrediente principal para isso foi a resposta aessa questão, o que me forneceu os meios para realizar uma transformação de coordenadas real.
\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}
O resultado é assim:
O único problema restante é - e não consigo entender de onde isso vem - que o dimensionamento da imagem via scale=X
de alguma forma se comporta de maneira estranha e parece afetar as diferentes dimensões de maneira diferente - compare, por exemplo, a saída de scale=1
com a saída de scale=2
.