Saturday, March 14, 2015

Menggambar Kurva 3D dengan Pgfplots

Ini adalah tulisan kedua tentang pemanfaatan paket pgfplots, setelah tulisan pertama tentang menggambar kurva 2D. Tulisan ini berisi tentang cara menggambar pemutaran daerah tertutup yang dibatasi oleh kurva-kurva (lurus dan lengkung). Pemutaran ini dilakukan terhadap sumbu $x$ maupun sumbu $y$.

Trik utamanya adalah menetapkan fungsi parametrik yang bersesuaian dengan daerah tersebut dalam fungsi sinus dan kosinus.
Jika kita akan memutar grafik fungsi $f(t)$ mengelilingi sumbu $x$, maka kita misalkan fungsi-fungsi absis, ordinat, dan aplikat sebagai berikut.
\begin{align}
x(t,s) &= t\\
y(t,s) &= f(t)*\cos(s)\\
z(t,s) &= f(t)*\sin(s)
\end{align}
Jika kita akan memutar grafik fungsi $f(t)$ mengelilingi sumbu $y$, maka kita misalkan fungsi-fungsi absisordinat, dan aplikat sebagai berikut.
\begin{align}
x(t,s) &= t*\cos(s)\\
y(t,s) &= t*\sin(s)\\
z(t,s) &= f(t)
\end{align}
Dari sini silakan perhatikan gambar-gambar pada contoh dokumen di bawah ini. Kita punya fungsi $f$ yang dirumuskan oleh $y=f(x)=x^3-x^2-6x$. Kita akan memutar daerah $D$ yang dibatasi oleh kurva $f$, sumbu $x$, garis $x=-1$, dan garis $x=2$. 





Perhatikan gambar 1. Saya menggambarnya dengan pengkodean


dan pada preamble dimuat


Sekarang daerah $D$ tersebut akan kita putar mengelilingi sumbu $x$ sejauh $360^\circ$. Kita nyatakan fungsi parametriknya sebagai
(x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))})
Perhatikan gambar 2. Pengkodean yang digunakan adalah


Perhatikan opsi dalam \addplot3. Pada gambar 2, bentuk permukaan "benda putar" itu ditentukan oleh opsi surf. Opsi mesh menghasilkan bentuk permukaan seperti pada gambar 4. Opsi lainnya yang dapat digunakan adalah patch (untuk ini pada preamble harus dimuat \usepgfplotslibrary{patchplots}) dan contour gnuplot.
Kemudian, opsi shader menyatakan corak "pelapis" atau selimut dari permukaan benda putar itu. Pada gambar 2 dan 3 dipilih shader=flat, pada gambar 4 shader=faceted, pada gambar 5 dan 6 shader=faceted interp, dan pada gambar 7 dan 8 shader=interp
Opsi samples menyatakan kerapatan garis-garis yang dibuat oleh pgfplots. Karena grafik ini disusun dengan "mengerahkan tenaga yang cukup besar", maka nilai opsi ini biasanya bilangan kelipatan 10 yang $\le 50$.
Nilai angka pada opsi domain ($x$) dan y domain dapat diatur sesuai dengan keperluan untuk bagian grafik yang ingin kita tunjukkan.
Opsi z buffer=sort dipilih untuk memastikan pgfplots mengatur unsur-unsur yang disusunnya terbentuk dalam urutan yang benar.

Sekarang kita tinjau tentang pewarnaan, juga masih termasuk opsi dalam perintah \addplot3. Pada gambar 2, warna yang muncul diberikan oleh pgfplots secara asal (default). Sedangkan pada gambar 3 s.d. 8, warna ditetapkan oleh kita sebagai opsi colormap. Untuk ini kita cantumkan \usepgfplotslibrary{colormaps} pada preamble.
colormap/cool % pada gambar 3
colormap/jet % pada gambar 4
colormap/winter % pada gambar 5
colormap/greenyellow % pada gambar 6
colormap/blackwhite % pada gambar 7
colormap={pos}{color(0cm)=(DarkSlateBlue); color(1cm)=(DarkSlateBlue!30); color(2cm)=(DarkSlateBlue)} % pada gambar 8
Selanjutnya, bandingkan "arah" kurva pada gambar 2 dan 3. Berbeda, bukan? Ini diatur oleh opsi view untuk environment axis. Pada gambar 2, arah kurva ditetapkan oleh pgfplots secara asal (default), tetapi pada gambar 3 saya tetapkan 
  1. \begin{tikzpicture}
  2.    \begin{axis}[view={15}{7}]
  3.   .............................
  4.    \end{axis}
  5. \end{tikzpicture}
Angka-angka dalam opsi view ini pun dapat diatur sesuai dengan keperluan kita.

Lalu, bagaimana tentang penampilan sumbu koordinat? Berdasarkan penjelasan dari pembuatnya, yaitu Christian Feuersängerpaket pgfplots tidak cocok untuk menampilkan sumbu koordinat terletak di tengah, secara asal (default). Agar sumbu-sumbu koordinat itu terletak di tengah (seperti pada gambar 8), kita perlu membubuhkan opsi axis lines=middle, axis on top, dan enlargelimits pada environment axis.

Demikianlah, semoga uraian ini bermanfaat. Contoh dokumen di atas saya susun dalam TeX Live 2014 dan di bawah ini pengkodean selengkapnya dari contoh dokumen tersebut. 

Adjie Gumarang Pujakelana 2015 

\documentclass[a4paper,10pt]{article}
%http://tex.stackexchange.com/questions/34302/surface-of-revolution/34303#34303
\usepackage[hmargin=1.5cm,top=1.5cm]{geometry}
\usepackage[svgnames,dvipsnames]{xcolor}
\usepackage[labelformat=simple]{caption}
\usepackage[T1]{fontenc}
\usepackage[indonesian]{babel}
\usepackage{gentium,fourier}
\usepackage{adjustbox}
\usepackage{url}
\usepackage{amsmath,bm}
\let\ds\displaystyle
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.10}
\usepgfplotslibrary{fillbetween}
\usepgfplotslibrary{colormaps}
%\usepgfplotslibrary{patchplots}

\definecolor{stempel}{RGB}{0 34 85}  

\begin{document}

\adjustbox{valign=t}{\begin{minipage}[t]{0.4\textwidth}
\centering
\begin{tikzpicture}[transform shape,scale=1]
\node {%
\begin{tikzpicture}[]
\pgfplotsset{set layers}
\begin{axis}[
    axis lines=middle,
    xtick={-2,-1,2,3},              
    ytick=\empty,               % gambar 1
    xlabel={\large $x$},
    ylabel={\large $y$},
 xmin=-3, xmax=4, 
 ymin=-8.5,ymax=6,
 samples=500,enlargelimits=false]
\addplot[name path=A,domain=-2.15:3.15,Navy,smooth] {x^3-x^2-6*x} node[above left] {$y=x^3-x^2-6x$};
\path[name path=B] (axis cs:-1,0)--(axis cs:2,0);
\addplot[draw,fill=DarkOrange!50!Yellow,opacity=.75] fill between[of=A and B,soft clip={domain=-1:2}];
\end{axis}
\end{tikzpicture}%
};%
\end{tikzpicture}%
\captionof{figure}{}
\end{minipage}}\hfill
%
\adjustbox{valign=t}{\begin{minipage}[t]{0.45\textwidth}
\centering
\begin{tikzpicture}
 \begin{axis}[]
  \addplot3[surf,shader=flat,       % gambar 2
  samples=20,
  domain=-1:2,y domain=0:2*pi,
  z buffer=sort]
  (x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))});
 \end{axis}
\end{tikzpicture}
\captionof{figure}{}
\end{minipage}}\hfill

\bigskip
\adjustbox{valign=t}{\begin{minipage}[t]{0.45\textwidth}
\centering
\begin{tikzpicture}
    \begin{axis}[view={15}{7},
xlabel=$x$, ylabel=$y$, zlabel=$z$,
after end axis/.code={
    \draw [-stealth, thick, red] (xticklabel cs:0.2) -- (xticklabel cs:0.8);
    \draw [-stealth, thick, red] (yticklabel cs:0.2) -- (yticklabel cs:0.8);
    \draw [-stealth, thick, red] (zticklabel cs:0.2) -- (zticklabel cs:0.8);                
                    }               % gambar 3
                ]
\addplot3[surf,shader=flat,
  samples=20,colormap/cool,
  domain=-1:2,y domain=0:2*pi,
  z buffer=sort]
  (x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))});
    \end{axis}
\end{tikzpicture}
\captionof{figure}{}
\end{minipage}}\hfill
%
\adjustbox{valign=t}{\begin{minipage}[t]{0.45\textwidth}
\centering
\begin{tikzpicture}
 \begin{axis}[view={15}{5}]
  \addplot3[mesh,shader=faceted,
  samples=20,colormap/jet,
  domain=-1:2,y domain=0:2*pi,
  z buffer=sort]                        % gambar 4
  (x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))});
 \end{axis}
\end{tikzpicture}
\captionof{figure}{}
\end{minipage}}\hfill

\bigskip
\adjustbox{valign=t}{\begin{minipage}[t]{0.45\textwidth}
\centering
\begin{tikzpicture}
 \begin{axis}[view={15}{5}]
  \addplot3[surf,shader=faceted interp,
  samples=20,colormap/winter,
  domain=-1:2,y domain=0:2*pi,              % gambar 5
  z buffer=sort]
  (x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))});
 \end{axis}
\end{tikzpicture}
\captionof{figure}{}
\end{minipage}}\hfill
%
\adjustbox{valign=t}{\begin{minipage}[t]{0.45\textwidth}
\centering
\begin{tikzpicture}
 \begin{axis}[grid=both,view = {20}{10}]
  \addplot3[surf,shader=faceted interp,
  colormap/greenyellow,
  samples=50,
  domain=-1:2,y domain=0:2*pi,              % gambar 6
  z buffer=sort]
  (x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))});
 \end{axis}
\end{tikzpicture}
\captionof{figure}{}
\end{minipage}}\hfill

\newpage
\adjustbox{valign=t}{\begin{minipage}[t]{0.45\textwidth}
\centering
\begin{tikzpicture}
 \begin{axis}[view = {20}{10}]
  \addplot3[surf,shader=interp,
  colormap/blackwhite,
  samples=50,
  domain=-1:2,y domain=0:2*pi,              % gambar 7
  z buffer=sort]
  (x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))});
 \end{axis}
\end{tikzpicture}
\captionof{figure}{}
\end{minipage}}\hfill
%
\adjustbox{valign=t}{\begin{minipage}[t]{0.45\textwidth}
\centering
\begin{tikzpicture}
 \begin{axis}[view = {20}{10},
            axis lines=middle, axis on top,
            xtick={-1,0,1,2},ytick=\empty,ztick=\empty,
            enlargelimits=true]
  \addplot3[surf,shader=interp,
  colormap={pos}{color(0cm)=(DarkSlateBlue);
  color(1cm)=(DarkSlateBlue!30); 
  color(2cm)=(DarkSlateBlue)},
  samples=30,
  domain=-1:2,y domain=0:2*pi,              % gambar 8
  z buffer=sort]
  (x,{(x^3-x^2-6*x)*cos(deg(y))}, {(x^3-x^2-6*x)*sin(deg(y))});
 \end{axis}
\end{tikzpicture}
\captionof{figure}{}
\end{minipage}}\hfill

\end{document}%-----------------------------------

1 comment:

Gunanto said...

Terima kasih Pak Eman, ijin menerapkan kodenya, semoga suatu saat saya bisa memahaminya...

Related Posts Plugin for WordPress, Blogger...