# How to draw the right ascension and declination of a vector in a rotated coordinate frame in TikZ?

During my research I came across the illustration of two reference frames. In my opinion this illustration is lacking, because the coordinate systems are not drawn. This makes it hard to understand, for example, how right ascension and declination are measured, see below.

(Seidelmann et. al.)

To clarify this, I am trying to make a complementary drawing that shows the coordinate systems, and measures alpha0 and delta0. This is what I came up with:

Note that the orientation of the two frames is a bit different to make it easier to draw.

My main problem is that I am not able to draw the declination delta0. (Which measures from the arc of alpha0 up to the body's north pole, in the ICRF frame.) I am trying to accomplish that using the great tikz3dplot package, see the code below!

\documentclass{article}

\usepackage{wasysym}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{pgfplots}
% Workaround for making use of externalization possible
% -> remove hardcoded pdflatex and replace by lualatex
\usepgfplotslibrary{external}
\tikzset{external/system call={lualatex \tikzexternalcheckshellescape%
-halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}

% Redefine rotation sequence for tikz3d-plot to z-y-x
\newcommand{\tdseteulerxyz}{
\renewcommand{\tdplotcalctransformrotmain}{%
%perform some trig for the Euler transformation
\tdplotsinandcos{\sinalpha}{\cosalpha}{\tdplotalpha}
\tdplotsinandcos{\sinbeta}{\cosbeta}{\tdplotbeta}
\tdplotsinandcos{\singamma}{\cosgamma}{\tdplotgamma}
%
\tdplotmult{\sasb}{\sinalpha}{\sinbeta}
\tdplotmult{\sasg}{\sinalpha}{\singamma}
\tdplotmult{\sasbsg}{\sasb}{\singamma}
%
\tdplotmult{\sacb}{\sinalpha}{\cosbeta}
\tdplotmult{\sacg}{\sinalpha}{\cosgamma}
\tdplotmult{\sasbcg}{\sasb}{\cosgamma}
%
\tdplotmult{\casb}{\cosalpha}{\sinbeta}
\tdplotmult{\cacb}{\cosalpha}{\cosbeta}
\tdplotmult{\cacg}{\cosalpha}{\cosgamma}
\tdplotmult{\casg}{\cosalpha}{\singamma}
%
\tdplotmult{\cbsg}{\cosbeta}{\singamma}
\tdplotmult{\cbcg}{\cosbeta}{\cosgamma}
%
\tdplotmult{\casbsg}{\casb}{\singamma}
\tdplotmult{\casbcg}{\casb}{\cosgamma}
%
%determine rotation matrix elements for Euler transformation
\pgfmathsetmacro{\raaeul}{\cacb}
\pgfmathsetmacro{\rabeul}{\casbsg - \sacg}
\pgfmathsetmacro{\raceul}{\sasg + \casbcg}
\pgfmathsetmacro{\rbaeul}{\sacb}
\pgfmathsetmacro{\rbbeul}{\sasbsg + \cacg}
\pgfmathsetmacro{\rbceul}{\sasbcg - \casg}
\pgfmathsetmacro{\rcaeul}{-\sinbeta}
\pgfmathsetmacro{\rcbeul}{\cbsg}
\pgfmathsetmacro{\rcceul}{\cbcg}
}
}

\tdseteulerxyz

\usepackage{siunitx}

\begin{document}
% Set the plot display orientation
% Syntax: \tdplotsetdisplay{\theta_d}{\phi_d}
\tdplotsetmaincoords{60}{110}

% Start tikz picture, and use the tdplot_main_coords style to implement the display
% coordinate transformation provided by 3dplot.
\begin{tikzpicture}[scale=5,tdplot_main_coords]

% Set origin of main (body) coordinate system
\coordinate (O) at (0,0,0);

% Draw main coordinate system
\draw[red, thick,->] (0,0,0) -- (1,0,0) node[anchor=north east]{};
\draw[red, thick,->] (0,0,0) -- (0,1,0) node[anchor=north west]{};
\draw[red, thick,->] (0,0,0) -- (0,0,1) node[anchor=south]{Body's north pole ($\alpha_0$, $\delta_0$)};

% Draw body's equator
\tdplotdrawarc[red,]{(O)}{1}{0}{360}{anchor=east}{}
% Manually fine-tune position of label
\node[tdplot_main_coords,anchor=south] at (-0.1,1.3,0){\color{red} Body's equator};

% Draw the prime meridian
\tdplotsetthetaplanecoords{60}
\tdplotdrawarc[densely dashed, tdplot_rotated_coords]{(O)}{1}{0}{90}{anchor=north west}{}
% Fine-tune position of label
\node[tdplot_main_coords, rotate=-65] at (0,0.5,0.3){Prime meridian};

% Rotate coordinate system to create ICRF
% Use and angles in z-y-x rotation sequence
% Syntax: \tdplotsetrotatedcoords{\alpha}{\beta}{\gamma}
\tdplotsetrotatedcoords{-60}{-25}{-15}

% Translate the rotated coordinate system (NOT NEEDED HERE)
% Syntax: \tdplotsetrotatedcoordsorigin{point}
\tdplotsetrotatedcoordsorigin{(O)}

% Use the tdplot_rotated_coords style to work in the rotated, translated coordinate frame
% Draw the coordinate axes
\draw[thick,tdplot_rotated_coords,->, blue] (0,0,0) -- (1,0,0) node[anchor=south west]{\vernal};
\draw[thick,tdplot_rotated_coords,->, blue] (0,0,0) -- (0,1,0) node[anchor=west]{};
\draw[thick,tdplot_rotated_coords,->, blue] (0,0,0) -- (0,0,1) node[anchor=west]{ICRF north pole};

% Draw the ICRF Equator
\tdplotdrawarc[tdplot_rotated_coords,color=blue]{(O)}{1}{0}{360}{anchor=south
west,color=black}{}
% Manually fine-tune label
\node[tdplot_main_coords,anchor=south] at (0.3,1.33,0){\color{blue} ICRF equator};

% Draw alpha (right ascension), delta (declination) in ICRF
% Get coordinates of body's north-pole in ICRF frame
\tdplottransformmainrot{0}{0}{1}
% This returns
% \tdplotresx
% \tdplotresy
% \tdplotresz
% Get polar coordinates of this vector
\tdplotgetpolarcoords{\tdplotresx}{\tdplotresy}{\tdplotresz}
% This returns
% \tdplotrestheta
% \tdplotresphi

% Draw the right ascension
\tdplotdrawarc[tdplot_rotated_coords, color=magenta, line
width=2pt]{(O)}{1}{0}{\tdplotresphi}{anchor=west}{$\alpha_0$}

% Draw the declination
% THIS GOES WRONG AND DOES NOT WORK
% Should go from end of alpha0 arc to the body's north pole in the ICRF frame
% \tdplotsetrotatedthetaplanecoords{\tdplotresphi}
% \tdplotdrawarc[tdplot_rotated_coords, color=red]{(O)}{1}{0}{90-\tdplotrestheta}{anchor=south
%     west,color=black}{\textcolor{blue}{x}}

% Coordinate output for debugging
\node[tdplot_main_coords,anchor=south] at (1,1,2){Main coords: \tdplotrestheta,
\tdplotresphi, \tdplotresx, \tdplotresy, \tdplotresz};

\end{tikzpicture}

\end{document}


(Bonus)
I also have a hard time making arcs such as the 90+alpha0 shown in the figure, or letting the text "prime meridian follow the curvature. Any stylistic help would be greatly appreciated as well.

Seidelmann, P. Kenneth et. al. Report of the IAU/IAG Working Group on cartographic coordinates and rotational elements: 2006. Celestial Mech Dyn Astr (2007) 98:155–180

• Can I do anything to help you guys further with this? I'd be happy to update my question, if anything should be missing for example. – Ingo May 30 '13 at 9:43

Would you possibly mean something like the following picture?

It's quite easy once you understand the basic limitation of arc: it only works on 2D planes. This means that if you simply define a 3rd coordinate system that lies perpendicular to the second and is aligned in a way that the points of x'+alpha0 and z' are coincident with the plane, you will be able to connect the two points with an arc.

Forgive my quick and dirty approach to this, I just stumbled upon your question by chance and did not put much thought into this, I'm working on a publication myself atm. :p If you do the trigonometry, you'll easily figure out the correct coordinates to use instead of the approximate ones I used.

I hope I was also able to answer your question regarding 90+alpha0.

Anyway, without further ado, here's the code:

\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{2mm}

\begin{document}

\tdplotsetmaincoords{60}{110}

\pgfmathsetmacro{\rvec}{0}
\pgfmathsetmacro{\thetavec}{30}
\pgfmathsetmacro{\phivec}{110}

\begin{tikzpicture}[scale=5,tdplot_main_coords]

\coordinate (O) at (0,0,0);

\tdplotsetcoord{P}{\rvec}{\thetavec}{\phivec}

\draw[red,thick,->] (0,0,0) -- (1,0,0) node[anchor=north east]{$x$};
\draw[red,thick,->] (0,0,0) -- (0,1,0) node[anchor=north west]{$y$};
\draw[red,thick,->] (0,0,0) -- (0,0,1) node[anchor=south]{$z$};

\tdplotsetthetaplanecoords{\phivec}

\tdplotdrawarc[tdplot_rotated_coords]{(0,0,0)}{1}{0}{\thetavec}{anchor=south west}{$\gamma_{0}$}

\draw[dashed,red] (1,0,0) arc (0:360:1);

\tdplotsetrotatedcoords{\phivec}{\thetavec}{30}

\tdplotsetrotatedcoordsorigin{(P)}

\draw[blue,thick,tdplot_rotated_coords,->] (0,0,0) -- (-1,0,0) node[anchor=south west]{$x'$};
\draw[blue,thick,tdplot_rotated_coords,->] (0,0,0) -- (0,-1,0) node[anchor=south west]{$y'$};
\draw[blue,thick,tdplot_rotated_coords,->] (0,0,0) -- (0,0,1) node[anchor=south]{$z'$};

\draw[dashed,blue,tdplot_rotated_coords] (1,0,0) arc (0:360:1);
\tdplotdrawarc[black,line width=1pt,tdplot_rotated_coords]{(0,0,0)}{1}{270}{180}{anchor=west}{$90+\alpha_{0}$}
\tdplotdrawarc[green,line width=2pt,dashed,tdplot_rotated_coords]{(0,0,0)}{1}{210}{180}{anchor=east}{$\alpha_{0}$}

\pgfmathsetmacro{\rveca}{0}
\pgfmathsetmacro{\thetaveca}{131}
\pgfmathsetmacro{\phiveca}{101}

\tdplotsetcoord{Q}{\rveca}{\thetaveca}{\phiveca}

\tdplotsetrotatedcoords{\phiveca}{\thetaveca}{35}
\tdplotsetrotatedcoordsorigin{(Q)}

\tdplotdrawarc[black,dashed,tdplot_rotated_coords]{(0,0,0)}{1}{0}{90}{anchor=east}{$\delta_{0}$}

\pgfmathsetmacro{\rvecb}{0}
\pgfmathsetmacro{\thetavecb}{-90}
\pgfmathsetmacro{\phivecb}{-30}

\tdplotsetcoord{R}{\rvecb}{\thetavecb}{\phivecb}

\tdplotsetrotatedcoords{\phivecb}{\thetavecb}{0}
\tdplotsetrotatedcoordsorigin{(R)}

\tdplotdrawarc[black,tdplot_rotated_coords]{(0,0,0)}{1}{0}{90}{anchor=west}{Prime Meridian}

\end{tikzpicture}

\end{document}


Oh yeah! One last thing: you can apply arbitrary transformation matrixes to coordinate systems, see chapter 2.18 of the tikz manual. Look into that if you want to curve your text. Depending on how good your trigonometry is, that's one way to go! Personally, I think it's kind of a lot of effort, just to make the graph pretty. But if you want to jog your brain, by all means, go for it! ;)

• Oh, and even though it is slightly different, it may be considered a duplicate of tex.stackexchange.com/questions/46850/… – Meferdati May 31 '13 at 1:23
• Meferdati, thanks! However, I actually need alpha0 and delta0 of z and not z', if I did not totally misinterpret the original drawing. – Ingo Jun 2 '13 at 9:19
• I don't understand what you mean... if you don't need my alpha0 or delta0, isn't gamma0 exactly what you need? Given, in my drawing, z' is coincident with the 100-plane but that is easily remedied and you just need to adjust your secondary coordinate systems accordingly. HTH! – Meferdati Jun 4 '13 at 16:08