наклонные плоскости как прицелы

наклонные плоскости как прицелы

Я пытаюсь перестроить следующую 3D-графику с помощью TikZ. Точное сходство не требуется, и я на самом деле решил немного изменить геометрию и стиль, чтобы повысить ясность (запутанной) геометрической ситуации, но я столкнулся с проблемами.Диаграмма спина (оригинал)

Вот мой взгляд на то, как это можно осуществить.

\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}

Вот как это выглядит:

Диаграмма спина (новая)

Основная графическая проблема, которая осталась, заключается в том, что arcs, изображающие углы \theta_1, \theta_2не находятся в своих соответствующих плоскостях (красной и синей). Я повозился с определениями arc, но так и не смог заставить это работать.

Другая проблема более эстетического характера в этом случае заключается в том, что код немного неуклюж. Я сделал все возможное, чтобы он выглядел как можно лучше, но все эти угловые вычисления действительно трудно читать.

Решение, которое мне больше всего нравится, — это определить области действия для красной и синей плоскостей, что позволило бы определять точки гораздо более элегантно, а также предоставило бы простой выход из двух проблемных arcs, но я не могу понять, как определить наклонные плоскости в качестве областей действия.

Кто-нибудь может мне помочь?

Кроме того, любые предложения о том, как повысить ясность изображения и сделать его более понятным, будут весьма приветствоваться.

PS: Для тех, кому интересно, что представляет эта картинка: она используется для определения угловых переменных в столкновениях протонов с протонами на LHC, которые используются для измерения бозонов Хиггса. Отмеченное пятно X— это точка столкновения, в которой рождается бозон Хиггса, Z_1/ V_1( Z_2/ V_2) — первичные продукты распада бозона Хиггса, а e^+/ e^-и \mu^+/ \mu^-— вторичные продукты распада. Реальный масштаб геометрии составляет порядка фемтометров.

решение1

Потратив на эту проблему немного времени и поразмыслив, а также покопавшись на StackOverflow больше, чем я готов признать, я нашел решение.

Главным ингредиентом для этого был ответ на вопросэтот вопрос, что дало мне возможность выполнить фактическое преобразование координат.

\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}

Вот как выглядит результат:

углы спиральности

Единственная оставшаяся проблема — и я не могу понять, откуда она взялась — заключается в том, что масштабирование изображения с помощью scale=Xведет себя как-то странно и, похоже, по-разному влияет на разные измерения — сравните, например, вывод scale=1с выводом scale=2.

Связанный контент