4

I am trying to draw a half sphere with several arrows on it. Each of those arrows should have a circle positioned on it, drawn in a local coordinate system of the arrow. I managed to draw the sphere and the arrows, but I cannot get the circle perspective right.

Any suggestions?

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

Current result. The drawn circles dont look right atm.

enter image description here

6

I the end I wrote a transformation matrix and manually transformed the points.

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

halfsphere

|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.