バレルはどうやって作るの?

バレルはどうやって作るの?

PGFplots のユーザーの皆様、この樽の図を作成する必要があります。PGFplots を使用してこれをどのように作成できますか?

ここに画像の説明を入力してください

答え1

ここでの唯一のやや非自明なタスクは、バレルの (湾曲した) 垂直境界の臨界角を計算することです。この回答は、潜在的に新しいことを試みています。私の知る限り、これまでこれらの値は「基底依存」の方法で計算されており、式は、 を使用するpgfplotstikz-3dplot、この回答のようにperspective3D ビューをインストールするライブラリを使用するかによって異なります。ここでは、これは独立した方法で計算されます。これが謎の関数がphicrit行うことです。残りはすべて標準です。

\documentclass[tikz,border=3mm]{standalone}
\definecolor{irk}{RGB}{138,204,183}
\usetikzlibrary{perspective}
\makeatletter
\pgfmathdeclarefunction{phicrit}{0}{%
\begingroup%
\pgfmathparse{atan2(\pgf@xx,\pgf@yx)}%
\pgfmathsmuggle\pgfmathresult\endgroup%
}%
\makeatother
\begin{document}
\begin{tikzpicture}[3d view={110}{15},declare function={rr(\x)=2.3*exp(-\x*\x/45);
    h=3;},>=stealth,semithick]
 \foreach \X [evaluate=\X as \Z using {-2*h+\X*h}] in {1,2,3}
 {\draw[irk,inner color=irk!20!white,outer color=irk!80!white]
  plot[smooth cycle,variable=\t,domain=0:360] 
  ({rr(\Z)*sin(\t)},{rr(\Z)*cos(\t)},\Z);
 \draw[magenta,ultra thick] (0,0,\Z) -- (0,{rr(\Z)},\Z);
 \ifcase\X
 \or
  \fill[magenta] (0,0,\Z) circle[radius=3pt];
  \path (0,0,\Z) node[left=1ex] {$-h$}  -- node[above] {$r$} (0,{rr(\Z)},\Z);
 \or
   \path (0,0,\Z) -- node[above] {$R$} (0,{rr(\Z)},\Z);
 \or
  \fill[magenta] (0,0,\Z) circle[radius=3pt];
  \path (0,0,\Z) node[left=1ex] {$h$} -- node[above] {$r$} (0,{rr(\Z)},\Z);
 \fi 
 \ifnum\X<3
  \draw[dashed,gray] (0,0,\Z) -- ++ (0,0,h);
 \else
  \draw[->] (0,0,\Z) -- ++ (0,0,1) node[pos=1.2] {$z$};
 \fi}
 \draw[irk] plot[variable=\t,smooth,domain=-h:h] 
  ({rr(\t)*sin(phicrit)},{rr(\t)*cos(phicrit)},\t); 
 \draw[irk] plot[variable=\t,smooth,domain=-h:h] 
  ({rr(\t)*sin(phicrit+180)},{rr(\t)*cos(phicrit+180)},\t); 
 \draw[dashed,gray] ({rr(0)},0,0) -- ({-rr(0)-1},0,0)
    (0,{rr(0)},0) -- (0,{-rr(0)-1},0);
 \draw[->] ({rr(0)},0,0) -- ++ (1,0,0) node[pos=1.2] {$x$};  
 \draw[->] (0,{rr(0)},0) -- ++ (0,1,0) node[pos=1.2] {$y$}; 
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

これらの樽のいくつかにはマーモットが訪れ、蜂蜜酒の世話をします。

\documentclass[tikz,border=3mm]{standalone}
\usepackage{tikzlings}
\usetikzlibrary{perspective}
\makeatletter
\pgfmathdeclarefunction{phicrit}{0}{%
\begingroup%
\pgfmathparse{atan2(\pgf@xx,\pgf@yx)}%
\pgfmathsmuggle\pgfmathresult\endgroup%
}%
\makeatother
\begin{document}
\begin{tikzpicture}[declare function={rr(\x)=2.3*exp(-\x*\x/45);
    h=3;},>=stealth,semithick]
 \fill[3d view={110}{15}] plot[variable=\t,smooth cycle,domain=0:360,samples=37] 
  ({rr(h)*sin(\t)},{rr(h)*cos(\t)},h);  
 \marmot[3D,shift={(0,1.5)},scale=1.4,whiskers,teeth]
 \foreach \X [evaluate=\X as \CF using {int(70+20*cos(\X*30+80))}] in {1,...,12}    
 {\draw[3d view={110}{15},top color=brown!\CF!black!80!white,bottom color=brown!\CF!black!80!white] 
  plot[variable=\t,smooth,domain=-h:h] 
  ({rr(\t)*sin(phicrit+\X*15-15)},{rr(\t)*cos(phicrit+\X*15-15)},\t) -- 
  plot[variable=\t,smooth,domain=0:15] 
  ({rr(h)*sin(phicrit+\X*15-15+\t)},{rr(h)*cos(phicrit+\X*15-15+\t)},h) --
  plot[variable=\t,smooth,domain=h:-h] 
  ({rr(\t)*sin(phicrit+\X*15)},{rr(\t)*cos(phicrit+\X*15)},\t) --
  plot[variable=\t,smooth,domain=15:0] 
  ({rr(-h)*sin(phicrit+\X*15-15+\t)},{rr(-h)*cos(phicrit+\X*15-15+\t)},-h)
  -- cycle; }
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

関連情報