在半球上的箭頭座標系中畫一個圓

在半球上的箭頭座標系中畫一個圓

我想畫一個上面有幾個箭頭的半球體。每個箭頭上都應該有一個圓圈,在箭頭的局部座標系中繪製。我設法繪製了球體和箭頭,但我無法正確繪製圓形透視圖。

有什麼建議麼?

\documentclass[11pt]{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%

%: isometric  South West : X , South East : Y , North : Z
\tikzset{isometricXYZ/.style={x={(-0.866cm,-0.5cm)}, y={(0.866cm,-0.5cm)}, z={(0cm,1cm)}}}

%% document-wide tikz options and styles
\begin{document}
\begin{tikzpicture} [scale=4, isometricXYZ, line join=round,
        opacity=.75, text opacity=1.0,%
        >=latex,
        inner sep=0pt,%
        outer sep=2pt,%
    ]
    \def\h{5}

    \newcommand{\quadrant}[2]{
        \foreach \f in {85,75,...,5}
            \foreach \t in {#1} 
            \draw [dotted, fill=#2]
                  ({sin(\f - \h)*cos(\t - \h)}, {sin(\f - \h)*sin(\t - \h)}, {cos(\f - \h)})
               -- ({sin(\f - \h)*cos(\t + \h)}, {sin(\f - \h)*sin(\t + \h)}, {cos(\f - \h)})
               -- ({sin(\f + \h)*cos(\t + \h)}, {sin(\f + \h)*sin(\t + \h)}, {cos(\f + \h)})
               -- ({sin(\f + \h)*cos(\t - \h)}, {sin(\f + \h)*sin(\t - \h)}, {cos(\f + \h)})
               -- cycle;
    }

    %Quadrants
    \quadrant{130,140,...,310}{gray!2}
    \quadrant{-50,-40,...,130}{gray!2}

    %View arrows
    \def\l{1.15}
    \foreach \f in {0,10,...,90}
        \foreach \t in {95}
            \draw [black, ->, thick]
                ({\l*sin(\f)*cos(\t)},{\l*sin(\f)*sin(\t)},{\l*cos(\f)})
                -- ({sin(\f)*cos(\t)},{sin(\f)*sin(\t)},{cos(\f)});

    % Circles in local coordinate system of the arrows
    \foreach \f in {0,10,...,90}
        \foreach \t in {95}
        {
            \def\PosX{{\l*sin(\f)*cos(\t)}}
            \def\PosY{{\l*sin(\f)*sin(\t)}}
            \def\PosZ{{\l*cos(\f)}}
            \def\Pos{(\PosX, \PosY, \PosZ)}

            \begin{scope}[rotate around={\f:\Pos}]
                \draw[->,red,thick] \Pos circle (0.07);
            \end{scope}
        };
\end{tikzpicture}
\end{document}

當前結果。畫的圓圈看起來不太對勁。

在此輸入影像描述

答案1

最後我寫了一個變換矩陣並手動變換了點。

\documentclass[11pt]{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
%%%<
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%%%>

\tikzset{isometricXYZ/.style={x={(-0.866cm,-0.5cm)}, y={(0.866cm,-0.5cm)}, z={(0cm,1cm)}}}

%% document-wide tikz options and styles
\begin{document}
\begin{tikzpicture} [scale=4, isometricXYZ, line join=round,
        opacity=.75, text opacity=1.0,%
        >=latex,
        inner sep=0pt,%
        outer sep=2pt,%
    ]
    \def\h{5}

    \newcommand{\quadrant}[2]{
        \foreach \f in {85,75,...,5}
            \foreach \t in {#1}
            \draw [dotted, fill=#2]
                  ({sin(\f - \h)*cos(\t - \h)}, {sin(\f - \h)*sin(\t - \h)}, {cos(\f - \h)})
               -- ({sin(\f - \h)*cos(\t + \h)}, {sin(\f - \h)*sin(\t + \h)}, {cos(\f - \h)})
               -- ({sin(\f + \h)*cos(\t + \h)}, {sin(\f + \h)*sin(\t + \h)}, {cos(\f + \h)})
               -- ({sin(\f + \h)*cos(\t - \h)}, {sin(\f + \h)*sin(\t - \h)}, {cos(\f + \h)})
               -- cycle;
    }

    \newcommand{\arrowarc}[6]{
        \draw[domain=0:320,smooth,variable=\x,->, dashed] plot 
        ({0.07 * (cos(#2)*cos(#3) * cos(\x) + (cos(#3)*sin(#1)*sin(#2) - cos(#1)*sin(#3)) * sin(\x)) + #4},
         {0.07 * (cos(#2)*sin(#3) * cos(\x) + (cos(#1)*cos(#3) + sin(#1)*sin(#2)*sin(#3)) * sin(\x)) + #5},
         {0.07 * (-sin(#2) * cos(\x) + cos(#2)*sin(#1)* sin(\x)) + #6});
    }

    %Quadrants
    \quadrant{130,140,...,310}{gray!2}
    \quadrant{-50,-40,...,130}{gray!2}

    \foreach \f in {20,30,...,90}
        \foreach \t in {-40,-20,...,120}
        {
            %Movement arrows
            \def\l{1.15}
            \draw [black, ->, thick]
                ({\l*sin(\f)*cos(\t)},{\l*sin(\f)*sin(\t)},{\l*cos(\f)})
                -- ({sin(\f)*cos(\t)},{sin(\f)*sin(\t)},{cos(\f)});

            % Circles
            \def\l{1.12}
            \arrowarc{(\f)}{0}{(\t + 90)}{\l*sin(\f)*cos(\t)}{\l*sin(\f)*sin(\t)}{\l*cos(\f)}
          };
\end{tikzpicture}
\end{document}][1]

半球

相關內容