summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/bezierplot/bezierplot-doc.tex
blob: a1239b6e57466f684d9b1988a6f94b1b92a370f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
% !TEX program = pdfLaTeX --shell-escape
\documentclass[a4paper]{article}
\usepackage{tikz,multicol,bezierplot,amsmath,cancel}
\usepackage[margin=3.5cm,top=1.75cm]{geometry}
\usepackage{fetamont}
\title{bezierplot}\author{Linus Romer}
\DeclareDocumentCommand{\graphcomparison}{ m m }{
	\begin{center}
	\begin{tikzpicture}[scale=.4]
		\draw (0,-5) node[below]{\tiny\texttt{\detokenize{#1}\quad | \detokenize{#2}}};
		\draw[step=1,thin] (-5,-5) grid (5,5);
		\draw[thick,->] (-5,0) -- (5.5,0) node[below]{$x$};
		\draw[thick,->] (0,-5) -- (0,5.5) node[left]{$y$}; 
		\foreach \x in {-4,-3,-2,-1,1,2,3,4} {\draw (\x,1pt) -- (\x,-1pt) node[below]{\tiny \x};}  
      		\foreach \y in {-4,-3,-2,-1,1,2,3,4} {\draw (1pt,\y) -- (-1pt,\y) node[left]{\tiny \y};}   
      		\draw[color=red,domain=-5:5,range=-5:5,samples=1000] plot function{#2};
		\draw \bezierplot{#1};
	\end{tikzpicture}
	\end{center}
}
\begin{document}
\maketitle\noindent
\section{Introduction}
\texttt{bezierplot} is a Lua program as well as a (Lua)\LaTeX{} package. This document describes both.

Given a smooth function, \texttt{bezierplot} returns a smooth bezier path written in Ti\emph{k}Z notation (which also matches \MP{}) that approximates the graph of the function. For polynomial functions of degree $\leq 3$ and inverses of them, the approximation is exact (up to numeric precision). \texttt{bezierplot} finds special graph points such as extreme points and inflection points and reduces the number of used points.

The following example will show a comparison of \textsc{gnuplot} with \verb|bezierplot| for the function $y=\sqrt{x}$ for $0\leq x \leq 5$:
\begin{center}
	\begin{tikzpicture}[scale=1.4]
		\draw (0,0) .. controls (0,0.7454) and (1.6667,1.4907) .. (5,2.2361);
		\draw (0,0) circle(.02) -- (0,0.745) circle( .02);
		\draw (1.6667,1.4907) circle(.02) -- (5,2.2361) circle( .02);
		\draw (2.5,.5) node[above]{\verb|bezierplot|};
		\begin{scope}[shift={(5.2,0)}]
		\draw[domain=0:5,samples=51] plot function{x**0.5};
      		\foreach \x in {0,0.1,...,5.05} {\draw  (\x,{\x^0.5}) circle (0.02);}  
      		\draw (2.5,.5) node[above]{\textsc{gnuplot}};
      		\end{scope}
	\end{tikzpicture}
\end{center}
\textsc{gnuplot} used 51 samples (no smoothing) and is still quite inexact at the beginning, whereas \verb|bezierplot| uses 4 points only and is exact (up to numeric precision)!
\section{Installation}
As \texttt{bezierplot} is written in Lua, the installation depends whether you are using Lua\LaTeX{} or another \LaTeX{} engine.
\subsection{Installation For Lua\LaTeX{}}
If you have installed \texttt{bezierplot} by a package manager, the installation is already complete. The manual installation of \texttt{bezierplot} is done in 2 steps:
\begin{itemize}
	\item copy the files \texttt{bezierplot.lua} and \texttt{bezierplot.sty} somewhere in your \texttt{texmf} tree (e.g. to \verb|~/texmf/tex/lualatex/bezierplot/bezierplot.sty| and\\
	\verb|~/texmf/scripts/bezierplot/bezierplot.lua|)
	\item update the ls-R databases by running \texttt{mktexlsr}
\end{itemize}
\subsection{Additional Installation Steps For Other \LaTeX{} Engines}
You will have to call \texttt{bezierplot} as an external program via the option \texttt{--shell-escape} (\texttt{--write18} for MiK\TeX{}). Therefore, \texttt{bezierplot.lua} has to be copied with the name \texttt{bezierplot} to a place, where your OS can find it. Under Linux this usually means copying to the directory \texttt{/usr/local/bin/}, but for Windows this will probably include more steps (like adding to the \texttt{PATH}). Of course, Lua has to be installed as well. As soon as you can call \texttt{bezierplot} from a command line (e.g. by typing \verb|bezierplot "x^2"|), it should also work with other \LaTeX{} engines. 
\section{Loading}
The \texttt{bezierplot} package is loaded with \verb|\usepackage{bezierplot}|. There are no loading options for the package.
\section{Usage}
\begin{multicols}{2}
\noindent A minimal example of Lua\LaTeX{} document could be:
\begin{verbatim}
\documentclass{article}
\usepackage{tikz,bezierplot}
\begin{document}
\tikz \draw \bezierplot{x^2};	
\end{document}
\end{verbatim}
\begin{center}
	\tikz \draw[scale=.7] \bezierplot{x^2};	
\end{center}
\end{multicols}
\noindent
The command \verb|\bezierplot| has 6 optional arguments in the sense of
\begin{center}
	\verb|\bezierplot[XMIN][XMAX][YMIN][YMAX][SAMPLES]{FUNCTION}|
\end{center}
The defaults are \verb|XMIN| = \verb|YMIN| $= -5$, \verb|XMAX| = \verb|YMAX| $= 5$ and \verb|SAMPLES| $= 0$ (this will set as few samples as possible).
\begin{center}
	\begin{tikzpicture}[scale=.7]
		\draw \bezierplot[-1][2]{x^2};
		\draw (0,0) node[below]{\verb|\bezierplot[-1][2]{x^2}|};
		\begin{scope}[shift={(10,0)}]
		\draw \bezierplot[-1][2][0.5][3]{x^2};
		\draw (0,0) node[below]{\verb|\bezierplot[-1][2][0.5][3]{x^2}|};
      		\end{scope}
	\end{tikzpicture}	
\end{center}
You may reverse the graph by making \verb|XMIN| bigger than \verb|XMAX|. E.g.
\begin{verbatim}
	\bezierplot[-5][5]{0.5*x+1}
\end{verbatim}
returns \verb|(-5,-1.5) -- (5,3.5)|, whereas 
\begin{verbatim}
	\bezierplot[5][-5]{0.5*x+1}
\end{verbatim}
returns the reversed path \verb|(5,3.5) -- (-5,-1.5)|. This is useful, if you want to cycle a path to a closed area:
\begin{multicols}{2}
\begin{verbatim}
\begin{tikzpicture}
	\fill[black!30] \bezierplot[-1][1]{2-x^2} 
	-- \bezierplot[1][-1]{x^3-x} -- cycle;
	\draw \bezierplot[-1.1][1.1]{2-x^2};
	\draw \bezierplot[-1.1][1.1]{x^3-x};
\end{tikzpicture}	
\end{verbatim}
\begin{center}
	\begin{tikzpicture}
		\fill[black!30] \bezierplot[-1][1]{2-x^2} -- \bezierplot[1][-1]{x^3-x} -- cycle;
		\draw \bezierplot[-1.1][1.1]{2-x^2};
		\draw \bezierplot[-1.1][1.1]{x^3-x};
	\end{tikzpicture}	
\end{center}
\end{multicols}
\subsection{Running Raw \texttt{bezierplot}}
Of course, you can run \verb|bezierplot.lua| in a terminal without using \LaTeX{}, e.g.
\begin{verbatim}
lua bezierplot.lua "3*x^0.8+2"
\end{verbatim}
will return
\begin{verbatim}
(0,2) .. controls (0.03,2.282) and (0.268,3.244) .. (1,5)
\end{verbatim}
You can set the window of the graph and the number of samples as follows:
\begin{verbatim}
lua bezierplot.lua "FUNCTION" XMIN XMAX YMIN YMAX SAMPLES
\end{verbatim}
e.g.
\begin{verbatim}
lua bezierplot.lua "FUNCTION" 0 1 -3 2.5 201
\end{verbatim}
will set $0\leq x\leq 1$ and $-3\leq y\leq 2.5$ and $201$ equidistant samples. You may also omit the $y$--range, hence
\begin{verbatim}
lua bezierplot.lua "FUNCTION" 0 1
\end{verbatim}
will set $0\leq x\leq 1$ and leave the default $-5\leq y\leq 5$. The variables \verb|XMIN|, \verb|XMAX|, \verb|YMIN| and \verb|YMAX| may also be computable expressions like \verb|2*pi+6|:
\begin{verbatim}
lua bezierplot.lua "sin(x)" -pi pi
\end{verbatim}
You may use \verb|huge| for $\infty$:
\begin{verbatim}
lua bezierplot "1/x" 0 1 0 huge
\end{verbatim}
As \verb|huge| is very huge and \verb|bezierplot| uses recursive calls for nontrivial functions and non--fixed samples, this can last very long:
\begin{verbatim}
lua bezierplot "1/x" -5 5 -huge huge
\end{verbatim}
But if you set fixed samples, it will be fast again (as this does not use recursive calls):
\begin{verbatim}
lua bezierplot "1/x" -5 5 -huge huge 100
\end{verbatim}
\subsection{Notation Of Functions}
The function term given to \verb|bezierplot| must contain at most one variable: $x$. E.g. \verb|"2.3*(x-1)^2-3"|. You must not omit \verb|*| operators:
\begin{center}
	wrong:\quad $\cancel{\texttt{2x(x+1)}}$ \hfil correct:\quad \texttt{2*x*(x+1)}
\end{center}
You have two possibilities to write powers: \verb|"x^2"| and \verb|"x**2"| both mean $x^2$.

\medskip

The following functions and constants are possible:
\begin{center}
\begin{tabular}{ll}
	\verb|abs| & absolute value (remember: your function should still be smooth)\\
	\verb|acos| & $\cos^{-1}$ inverse function of cosine in radians\\
	\verb|asin| & $\sin^{-1}$ inverse function of sine in radians\\
	\verb|atan| & $\tan^{-1}$ inverse function of tangent in radians\\
	\verb|cbrt| & cube root $\sqrt[3]{\quad}$ that works for negative numbers, too\\
	\verb|cos| & cosine for angles in radians\\
	\verb|exp| & the exponential function $e^{(\;)}$\\
	\verb|huge| & the numerical $\infty$\\
	\verb|e| & the euler constant $e=\mathrm{exp}(1)$\\
	\verb|log| & the natural logarithm $\mathrm{log}_e(\;)$\\
	\verb|pi| & Archimedes’ constant $\pi\approx 3.14$\\
	\verb|sgn| & sign function\\
	\verb|sin| & sine for angles in radians\\
	\verb|sqrt| & square root $\sqrt{\quad}$\\
	\verb|tan| & tangent for angles in radians
\end{tabular}
\end{center}
%
\newpage
%
\section{Examples of \texttt{bezierplot} in Comparison with \textsc{gnuplot}}
The following graphs are drawn with \texttt{bezierplot} (black) and \textsc{gnuplot} (red). You may not recognize the red behind the black unless you zoom in. \textsc{gnuplot} used 1000 samples per example. The functions are given below the pictures (left: bezierplot, right: \textsc{gnuplot}).
\begin{multicols}{3}
\graphcomparison{0.32*x-0.7}{0.32*x-0.7}
\graphcomparison{-x^2+4}{-x**2+4}
\graphcomparison{(x+1)*x*(x-1)}{(x+1)*x*(x-1)}
\graphcomparison{x^0.5}{x**0.5}
%\graphcomparison{x^(1/3)}{x**(1/3.)}
\graphcomparison{cbrt(x)}{sgn(x)*abs(x)**(1/3.)}
\graphcomparison{x^3*(x-1)}{x**3*(x-1)}
\graphcomparison{2*cos(3*x+4)+3}{2*cos(3*x+4)+3}
\graphcomparison{tan(x)}{tan(x)}
\graphcomparison{x+0.5*sin(x)}{x+0.5*sin(x)}
%\graphcomparison{1/(x-2)+1}{1/(x-2)+1}
\graphcomparison{2*x^2/(3*x-3)}{2*x**2/(3*x-3)}
\graphcomparison{4-exp(x)}{4-exp(x)}
\graphcomparison{log(x+4)}{log(x+4)}
\end{multicols}

\end{document}