16

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.

Simple cone

16

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}

enter image description here

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}

enter image description here

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}

enter image description here

|improve this answer|||||
  • 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
7

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.)

|improve this answer|||||
7

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}

enter image description here

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

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}

enter image description here

|improve this answer|||||
  • 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

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.