
我正在嘗試使用 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
描繪角度的 s\theta_1
不在\theta_2
各自的平面(紅色和藍色)內。我擺弄了arc
定義,但沒能使其發揮作用。
在這種情況下,另一個更美觀的問題是程式碼有點笨拙。我已盡最大努力使其看起來盡可能漂亮,但所有這些角度計算確實很難閱讀。
我最想要的解決方案是分別定義紅色和藍色平面的範圍,這將允許更優雅地定義點,並且還為兩個有問題的問題提供一個簡單的解決方法arc
,但我不知道如何傾斜平面定義為範圍。
有人可以幫我嗎?
此外,非常歡迎任何關於如何提高描述清晰度並使圖片更容易理解的建議。
PS:對於對這張圖片所代表的內容感興趣的人:它用於定義大型強子對撞機質子-質子碰撞中的角度變量,用於測量希格斯玻色子。標記的點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
。