% ******************************************************************************** % Creates a therion protractor of set size and scale % ******************************************************************************** \documentclass[12pt,border=0pt]{standalone} % packages \usepackage{tikz} \usepackage[outline]{contour} \begin{document} \begin{tikzpicture}[scale=1] \contourlength{1.2pt} % ******************************************************************************** % Set the coordinates and dimensions to draw from % ******************************************************************************** % Origin \coordinate (O) at (0,0); % Size and scale of the protractor \pgfmathsetmacro{\scaleto}{500} % 1:scaleto \pgfmathsetmacro{\radius}{20} % size in meters \pgfmathsetmacro{\majordivision}{2} % size in meters \pgfmathsetmacro{\minordivision}{1} % size in meters % Size of the text numbers \newcommand{\textsize}{\tiny} % Intrinisc dimensions and conversion factors \pgfmathsetmacro{\convert}{100} % conversion from meters to centimeters \pgfmathsetmacro{\mintick}{0.1} % size in centimeters \pgfmathsetmacro{\majtick}{0.2} % size in centimeters \pgfmathsetmacro{\minradii}{0.5} % fractional radius where dotted radial lines start \pgfmathsetmacro{\minradiiend}{1-\minradii} % remainder % Size and scale of the drawing \pgfmathsetmacro{\rad}{\radius*\convert/\scaleto} \pgfmathsetmacro{\majdiv}{\majordivision*\convert/\scaleto} \pgfmathsetmacro{\mindiv}{\minordivision*\convert/\scaleto} % Slightly reduced radii for the scale bar \pgfmathsetmacro{\radscale}{\rad-\mindiv} % ******************************************************************************** % Draw the foreshortening lines % ******************************************************************************** % Vertical lines \foreach \var in {0,\mindiv,...,\radscale} { \draw[gray] (O) ++ (\var,0) -- ++ (0,\rad); \draw[gray] (O) ++ (-\var,0) -- ++ (0,\rad); } % White out the excess length \draw[thick,white,fill=white] (O) ++ (\rad,0) arc(0:180:\rad) -- ++ (0,\rad) -- ++ (2*\rad,0) -- cycle; % ******************************************************************************** % Draw the circumcircles % ******************************************************************************** \foreach \var in {0,\mindiv,...,\rad} { \draw[gray] (O) ++ (\var,0) arc (0:180:\var); } % ******************************************************************************** % Draw the radii % ******************************************************************************** \foreach \theta in {10,40,...,160} { \draw[green] (O) ++ (\theta:\mindiv) -- ++ (\theta:\radscale); } \foreach \theta in {20,50,...,170} { \draw[purple] (O) ++ (\theta:\mindiv) -- ++ (\theta:\radscale); } \foreach \theta in {30,60,...,150} { \draw[black] (O) ++ (\theta:\mindiv) -- ++ (\theta:\radscale); } \foreach \theta in {5,15,...,175} { \draw[black,dotted] (O) ++ (\theta:\minradii*\rad) -- ++ (\theta:\minradiiend*\rad); } % ******************************************************************************** % Draw the angular scale % ******************************************************************************** \foreach \theta in {1,2,...,179} { \draw[black,thick] (O) ++ (\theta:\rad) -- ++ (\theta:-\mintick); } \foreach \theta in {5,10,...,175} { \draw[black,thick] (O) ++ (\theta:\rad) -- ++ (\theta:-\majtick); } % ******************************************************************************** % Draw the linear scale % ******************************************************************************** \foreach \var in {0,\mindiv,...,\radscale} { \draw[black,thick] (O) ++ (\var,0) -- ++ (0,\mintick); \draw[black,thick] (O) ++ (-\var,0) -- ++ (0,\mintick); } % ******************************************************************************** % Draw the outline % ******************************************************************************** \draw[black,thick] (O) ++ (\rad,0) arc (0:180:\rad) -- cycle; \draw[black,thick] (O) -- ++ (0,\majtick); % ******************************************************************************** % Draw the angle numbers % ******************************************************************************** \foreach \theta in {10,20,...,80} { \pgfmathsetmacro{\thetaopposite}{\theta+180} \draw[black] (O) ++ (\theta:\rad) -- ++ (\theta:-\majtick) node[anchor=south,near start,sloped,rotate=90,text=black] { \textsize \begin{tabular}{c} \contour{white}{\pgfmathprintnumber{\theta}}\\ \contour{white}{\pgfmathprintnumber{\thetaopposite}} \end{tabular} }; } \foreach \theta in {90,100,...,170} { \pgfmathsetmacro{\thetaopposite}{\theta+180} \draw[black] (O) ++ (\theta:\rad) -- ++ (\theta:-\majtick) node[anchor=south,near start,sloped,rotate=-90,text=black] { \textsize \begin{tabular}{c} \contour{white}{\pgfmathprintnumber{\theta}}\\ \contour{white}{\pgfmathprintnumber{\thetaopposite}} \end{tabular} }; }; % ******************************************************************************** % Draw the linear numbers % ******************************************************************************** \pgfmathsetmacro{\labmax}{\radius-\majordivision} \pgfmathsetmacro{\labsecond}{\majordivision+\majordivision} \foreach \var in {\majordivision,\labsecond,...,\labmax} { \pgfmathsetmacro{\varpos}{\var*\convert/\scaleto} \draw[black,thick] (O) ++ (\varpos,0) -- ++ (0,\mintick) node [above=-2pt] {\contour{white}{\textsize\pgfmathprintnumber{\var}}}; \draw[black,thick] (O) ++ (-\varpos,0) -- ++ (0,\mintick) node [above=-2pt] {\contour{white}{\textsize\pgfmathprintnumber{\var}}}; } % ******************************************************************************** % Draw the scale number % ******************************************************************************** \draw[black] (O) ++ (0,\rad/3) -- ++ (0,\rad/3) node [midway,anchor=center,sloped,text=black] {\contour{white}{\textsize $1$:\pgfmathprintnumber{\scaleto}}}; \end{tikzpicture} \end{document}