# How to draw a simple cone with height and radius with TikZ?

I need to make a very simple cone with h and r (like the picture I've uploaded as example) and I can't find it in previous questions.

With arc

 \documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw[dashed] (0,0) arc (170:10:2cm and 0.4cm)coordinate[pos=0] (a);
\draw (0,0) arc (-170:-10:2cm and 0.4cm)coordinate (b);
\draw[densely dashed] ([yshift=4cm]$(a)!0.5!(b)$) -- node[right,font=\footnotesize] {$h$}coordinate[pos=0.95] (aa)($(a)!0.5!(b)$)
-- node[above,font=\footnotesize] {$r$}coordinate[pos=0.1] (bb) (b);
\draw (aa) -| (bb);
\draw (a) -- ([yshift=4cm]$(a)!0.5!(b)$) -- (b);
\end{tikzpicture}
\end{document}


With ellipse

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\clip (-2,0) rectangle (2,1cm);
\draw[dashed] (0,0) circle(2cm and 0.35cm);
\end{scope}
\begin{scope}
\clip (-2,0) rectangle (2,-1cm);
\draw (0,0) circle(2cm and 0.35cm);
\end{scope}
\draw[densely dashed] (0,4) -- node[right,font=\footnotesize] {$h$}coordinate[pos=0.95] (aa)(0,0)
-- node[above,font=\footnotesize] {$r$}coordinate[pos=0.1] (bb) (2,0);
\draw (aa) -| (bb);
\draw (-2,0) -- (0,4) -- (2,0);
\end{tikzpicture}
\end{document}


Gonzalo has kindly provided the shadings to the cylinder and I am reproducing his code (with thanks):

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\fill[
top color=gray!50,
bottom color=gray!10,
opacity=0.25
]
(0,0) circle (2cm and 0.5cm);
\fill[
left color=gray!50!black,
right color=gray!50!black,
middle color=gray!50,
opacity=0.25
]
(2,0) -- (0,6) -- (-2,0) arc (180:360:2cm and 0.5cm);
\draw
(-2,0) arc (180:360:2cm and 0.5cm) -- (0,6) -- cycle;
\draw[dashed]
(-2,0) arc (180:0:2cm and 0.5cm);
\draw[dashed]
(2,0) -- node[below] {$r$} (0,0) -- node[left] {h} (0,6) ;
\draw
(0,8pt) -- ++(8pt,0) -- (8pt,0);
\end{tikzpicture}

\end{document}


• Since you answered providing two options, perhaps you could add a new option with shadings as in my answer? I see no point in giving almost the same code in two different answers. – Gonzalo Medina Apr 13 '14 at 1:47
• @GonzaloMedina Thanks and I used your code as such as I felt that it is good. thank you. – user11232 Apr 13 '14 at 15:12
• There is an unpleasant mistake at the base since the sides should be tangent to the bottom ellipse and in this case they are not. Drawing a larger the problem gets bigger. – ThePunisher Sep 29 '16 at 16:31

This requires a mathematician. You need to calculate the points of tangency and then connect the vertex of the cone to those points, not to the ends of the major axis. If the ellipse has its major axis from (-a,0) to (a,0), its minor axis from (0,-b) to (b,0), and its vertex at (0,h) (with h>b), then one point of tangency is (a*sqrt(1-(b/h)^2), b*(b/h)) and the other is the same but with its x-coordinate negated.

Here is MetaPost code to draw the cone correctly:

beginfig(1)
a:=2in; b:=.5in; h:= 3in; % for example
draw fullcircle xscaled 2a yscaled 2b; % a x b ellipse
pair Z[];
Z2 := (0,h); % vertex
Z1 := (a*sqrt(1 - (b/h)*(b/h)),b*(b/h)); % right tangency
Z3 := (-xpart Z1, ypart Z1); % left tangency
draw Z1--Z2--Z3;
endfig;
end


I don't use TikZ, so I will let others provide a translation if necessary. (And provide for the dashed portions.)

Dan's solution translated to TikZ:

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning, calc}

\begin{document}

\begin{tikzpicture}

\newcommand{\height}{6}

\draw[fill=gray!30] (a)--(0,\height)--(b)--cycle;

\begin{scope}
\clip ([xshift=-2mm]a) rectangle ($(b)+(1mm,-2*\radiusy)$);
\end{scope}

\begin{scope}
\clip ([xshift=-2mm]a) rectangle ($(b)+(1mm,2*\radiusy)$);
\end{scope}

\draw[dashed] (0,\height)|-(\radiusx,0) node[right, pos=.25]{$h$} node[above,pos=.75]{$r$};

\draw (0,.15)-|(.15,0);
\end{tikzpicture}
\end{document}


• I tried \newcommand{\height}{1}, the circle of base very bad. – minhthien_2016 Feb 5 '19 at 8:51

Just for fun with PSTricks.

\documentclass[pstricks,border=12pt,12pt]{standalone}
\usepackage{pst-node}
\begin{document}
\begin{pspicture}[dimen=m](8,10)
\psellipticarc[linestyle=dashed](4,1)(4,.65){0}{180}
\psellipticarcn(4,1)(4,.65){0}{180}
\psline[linecap=0](0,1)(4,10)(8,1)
\pcline[linestyle=dashed](4,10)(4,1)\naput{$h$}
\pcline[linestyle=dashed](4,1)(8,1)\naput{$r$}
\rput(4,1){\psline(0,9pt)(9pt,9pt)(9pt,0)}
\end{pspicture}
\end{document}


• There is an unpleasant mistake at the basis since the sides should be tangent to the bottom ellipse and in this case they are not. Drawing a larger the problem gets bigger. – ThePunisher Sep 29 '16 at 16:30