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.
5 Answers
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}
\usetikzlibrary{shadings}
\begin{document}
\begin{tikzpicture}
\fill[
top color=gray!50,
bottom color=gray!10,
shading=axis,
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,
shading=axis,
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. Apr 13, 2014 at 1:47
-
@GonzaloMedina Thanks and I used your code as such as I felt that it is good. thank you.– user11232Apr 13, 2014 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. Sep 29, 2016 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{\radiusx}{2}
\newcommand{\radiusy}{.5}
\newcommand{\height}{6}
\coordinate (a) at (-{\radiusx*sqrt(1-(\radiusy/\height)*(\radiusy/\height))},{\radiusy*(\radiusy/\height)});
\coordinate (b) at ({\radiusx*sqrt(1-(\radiusy/\height)*(\radiusy/\height))},{\radiusy*(\radiusy/\height)});
\draw[fill=gray!30] (a)--(0,\height)--(b)--cycle;
\fill[gray!50] circle (\radiusx{} and \radiusy);
\begin{scope}
\clip ([xshift=-2mm]a) rectangle ($(b)+(1mm,-2*\radiusy)$);
\draw circle (\radiusx{} and \radiusy);
\end{scope}
\begin{scope}
\clip ([xshift=-2mm]a) rectangle ($(b)+(1mm,2*\radiusy)$);
\draw[dashed] circle (\radiusx{} and \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}
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. Sep 29, 2016 at 16:30
I arrived here looking for a way to draw a light cone in TikZ, so here's the one I made using Dan's answer:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\def\b{0.2} % semi-minor axis
\pgfmathsetmacro{\h}{(1 + sqrt(1 + 4*\b^2)) / 2}
\pgfmathsetmacro{\a}{sqrt(\h)}
\draw (-1, -1) -- (1, 1);
\draw (-1, 1) -- (1, -1);
\draw (0, \h) ellipse [x radius = \a, y radius = \b];
\draw (0, -\h) ellipse [x radius = \a, y radius = \b];
\end{tikzpicture}
\end{document}