
私は TikZ を使用して次の 3D グラフィックを再構築しようとしています。正確な類似性は必要ではなく、実際には (紛らわしい) 幾何学的状況の明確さを高めるためにジオメトリとスタイルを少し変更することにしましたが、問題が発生しました。
これが、それを実現するための私の考えです。
\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}
それは次のようになります:
まだ残っている主なグラフィックの問題は、arc
角度を表す\theta_1
と が\theta_2
それぞれの平面 (赤と青) 内にないことです。定義をいろいろいじってみましたarc
が、うまくいきませんでした。
この場合の、より美観的な性質のもう 1 つの問題は、コードが少し扱いにくいことです。できるだけ見栄えを良くするために最善を尽くしましたが、角度の計算はすべて非常に読みにくいです。
私が最も望む解決策は、赤と青の平面それぞれにスコープを定義することです。これにより、ポイントをよりエレガントに定義できるようになり、問題のある 2 つのarc
問題を簡単に解決できるようになりますが、傾斜した平面をスコープとして定義する方法がわかりません。
誰か助けてくれませんか?
また、描写の明瞭度を高め、絵をより理解しやすくするためのご提案も大歓迎です。
追記: この図が何を表しているかに興味のある人のために: これは、ヒッグス粒子を測定するために使用される 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