在半球面上的箭头坐标系中画一个圆

在半球面上的箭头坐标系中画一个圆

我正在尝试绘制一个带有多个箭头的半球。每个箭头上都应该有一个圆圈,该圆圈在箭头的局部坐标系中绘制。我设法绘制了球体和箭头,但我无法正确获得圆圈的透视图。

有什么建议么?

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

半球

相关内容