summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex')
-rw-r--r--Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex524
1 files changed, 510 insertions, 14 deletions
diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex
index 44774b573b3..145463b7ffb 100644
--- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex
+++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transformations.tex
@@ -7,19 +7,20 @@
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.
-\section{Coordinate and Canvas Transformations}
+\section{Coordinate, Canvas, and Nonlinear Transformations}
\subsection{Overview}
-\pgfname\ offers two different ways of scaling, shifting, and rotating
+\pgfname\ offers different ways of scaling, shifting, and rotating
(these operations are generally known as \emph{transformations})
graphics: You can apply \emph{coordinate transformations} to all
-coordinates and you can apply \emph{canvas transformations} to the
-canvas on which you draw. (The names ``coordinate'' and ``canvas''
+coordinates, you can apply \emph{canvas transformations} to the
+canvas on which you draw, and you can apply \emph{additional nonlinear
+ transformations.} (The names ``coordinate'' and ``canvas''
transformations are not standard, I introduce them only for the
purposes of this manual.)
-The difference is the following:
+The differences are the following:
\begin{itemize}
\item
@@ -44,6 +45,17 @@ The difference is the following:
canvas is transformed, in this case stretched by a factor of
two. In the resulting image \emph{everything} will be larger: Text,
lines, coordinates, and shadings.
+\item
+ Nonlinear transformations are a special form of coordinate
+ transformations that are, as the name suggests, not linear. The
+ support for nonlinear transformations is quite different from the
+ support for linear coordinate transformations, the main reason being
+ speed: While linear coordinate transformations can be applied very
+ quickly (\pgfname\ does so almost constantly), nonlinear
+ transformations are much harder to apply and also to use. For this
+ reason, nonlinear transformations are implemented in a special
+ module |nonlineartransformations| that has to be loaded
+ explicitly. By default, they are not available.
\end{itemize}
In many cases, it is preferable that you use coordinate
@@ -52,13 +64,16 @@ transformations are used, \pgfname\ looses track of the coordinates of
nodes and shapes. Also, canvas transformations often cause undesirable
effects like changing text size. For these reasons, \pgfname\ makes it
easy to setup the coordinate transformation, but a bit harder to
-change the canvas transformation.
+change the canvas transformation. Because of the speed penalties
+caused by nonlinear transformations, they are even harder to set up.
\subsection{Coordinate Transformations}
+\label{section-linear-coordinate-transformations}
\subsubsection{How PGF Keeps Track of the Coordinate Transformation
Matrix}
+\label{section-transform-cm}
\pgfname\ has an internal coordinate transformation matrix. This
matrix is applied to coordinates ``in certain situations.'' This means
@@ -70,7 +85,7 @@ matrix to their inputs.
The coordinate transformation matrix consists of four numbers $a$,
$b$, $c$, and $d$, and two dimensions $s$ and $t$. When the coordinate
-transformation matrix is applied to a coordinate $(x,y)$ the new
+transformation matrix is applied to a coordinate $(x,y)$, the new
coordinate $(ax+by+s,cx+dy+t)$ results. For more details on how
transformation matrices work in general, please see, for example, the
\textsc{pdf} or PostScript reference or a textbook on computer
@@ -187,8 +202,8 @@ coordinate transformations.
-\begin{command}{\pgftransformrotate\marg{degrees}}
- Rotates coordinates counterclockwise by \meta{degrees}.
+\begin{command}{\pgftransformrotate\marg{angles}}
+ Rotates coordinates counterclockwise by \meta{angles} given in degrees.
\begin{codeexample}[]
\begin{tikzpicture}
\draw[help lines] (0,0) grid (3,2);
@@ -236,7 +251,7 @@ coordinate transformations.
\begin{command}{\pgftransformarrow\marg{start}\marg{end}}
- Shift coordinates to the end of the line going from \meta{start}
+ Shifts coordinates to the end of the line going from \meta{start}
to \meta{end} with the correct rotation.
\begin{codeexample}[]
\begin{tikzpicture}
@@ -280,7 +295,7 @@ coordinate transformations.
ensure that the rotation is done in such a way that text is never
``upside down.''
- There is another \TeX\ if that influences this command. If you set
+ There is another \TeX\ |\if| that influences this command. If you set
|\ifpgfresetnontranslationattime| to true, then, between
shifting the coordinate and (possibly) rotating/sloping the
coordinate, the command |\pgftransformresetnontranslations| is
@@ -341,6 +356,33 @@ coordinate transformations.
\end{command}
+\begin{command}{\pgftransformarcaxesattime\marg{time
+ $t$}\marg{center}\marg{0-degree axis}\marg{90-degree
+ axis}\marg{start angle}\marg{end angle}}
+ Shifts coordinates by a specific point on an arc at a specific
+ time, see Section~\ref{section-pointsattime} once more.
+
+ As for the previous commands, |\ifpgfslopedattime|
+ decides whether an additional rotation should be applied and
+ |\ifpgfallowupsidedowattime| is also considered.
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw[help lines] (0,0) grid (3,2);
+ \pgfpathmoveto{\pgfpoint{2cm}{1cm}}
+ \pgfpatharcaxes{0}{60}{\pgfpoint{2cm}{0cm}}{\pgfpoint{0cm}{1cm}}
+ \pgfusepath{stroke}
+ \pgfslopedattimetrue
+ \pgftransformarcaxesattime{.25}
+ {\pgfpoint{0cm}{1cm}}
+ {\pgfpoint{2cm}{0cm}}{\pgfpoint{0cm}{1cm}}
+ {0}{60}
+ \pgftext{Hi!}
+\end{tikzpicture}
+\end{codeexample}
+ The value of |\ifpgfresetnontranslationsattime| is also taken into account.
+\end{command}
+
+
{
\let\ifpgfslopedattime=\relax
\begin{textoken}{\ifpgfslopedattime}
@@ -352,7 +394,7 @@ coordinate transformations.
\let\ifpgfallowupsidedowattime=\relax
\begin{textoken}{\ifpgfallowupsidedowattime}
Decides whether the ``at time'' transformation commands should
- allow the rotation be down in such a way that ``upside-down text''
+ allow the rotation be done in such a way that ``upside-down text''
can result.
\end{textoken}
}
@@ -370,7 +412,7 @@ coordinate transformations.
The coordinate transformation commands introduced up to now are always
applied in addition to any previous transformations. In contrast, the
commands presented in the following can be used to change the
-transformation matrix ``absolutely.'' Note that this is, in general,
+transformation matrix ``in absolute terms.'' Note that this is, in general,
dangerous and will often produce unexpected effects. You should use
these commands only if you really know what you are doing.
@@ -467,7 +509,7 @@ transformation matrices.
\subsection{Canvas Transformations}
The canvas transformation matrix is not managed by \pgfname, but by
-the output format like \pdf\ or PostScript. All the \pgfname\ does is
+the output format like \pdf\ or PostScript. All that \pgfname\ does is
to call appropriate low-level |\pgfsys@| commands to change the canvas
transformation matrix.
@@ -582,9 +624,463 @@ a coordinate transformation, see the previous section).
\end{contextenvironment}
+\subsection{Nonlinear Transformations}
+\label{section-nonlinear-transformations}
+In order to use nonlinear transformations, you first have to load the
+following \pgfname\ module:
+
+\begin{pgfmodule}{nonlineartransformations}
+ Loads the necessary functionality for nonlinear transformations.
+\end{pgfmodule}
+
+
+\subsubsection{Introduction}
+
+The difference between the coordinate transformations introduced in
+Section~\ref{section-linear-coordinate-transformations} above to
+nonlinear transformations is, of course, that the transformations can
+be nonlinear. An example of a nonlinear transformation is the
+transformation underlying polar coordinates: A polar coordinate
+$(r,d)$ gets transformed to the canvas position $(d\cos r,d\sin r)$,
+which is clearly not a linear transformation.
+
+Nonlinear transformations work somewhat like the normal linear
+coordinate transformations in the sense that they apply to coordinate
+and thereby to the construction of paths, but not to things like text
+or line width or shadings. (Indeed, it is not possible to apply
+nonlinear transformations to, say, text.)
+
+This means that there is a fundamental
+difference between, on the one hand, calling a function like
+|\pgfpointpolar| or specifying a coordinate as |(45:2)| in \tikzname\
+and, on the other hand, installing the nonlinear transformation
+``polar coordinates'' using the command |\pgftransformnonlinear|: In a
+coordinate like |(45:2)| the user explicitly says ``please evaluate
+this one coordinate in polar coordinate and then continue in the
+normal coordinate system with the result.'' Otherwise nothing changes
+and a line between two points specified in this way is still a
+straight line.
+
+Things are quite different when we install a polar
+\emph{transformation} using |\pgftransformnonlinear|. Now, even a
+seemingly low-level Cartesian coordinate |\pgfqpoint{1pt}{1pt}| will
+get transformed. Even more drastically, what is specified as a
+straight line like
+\begin{codeexample}[code only]
+\draw (0,1) -- (1,1);
+\end{codeexample}
+can become curved since \emph{everything} gets transformed.
+
+
+\subsubsection{Installing Nonlinear Transformation}
+
+\makeatletter
+\def\polartransformation{
+ % \pgf@x will contain the radius
+ % \pgf@y will contain the distance
+ \pgfmathsincos@{\pgf@x}%
+ % pgfmathresultx is now the cosine of radius and
+ % pgfmathresulty is the sine of radius
+ \pgf@x=\pgfmathresultx\pgf@y%
+ \pgf@y=\pgfmathresulty\pgf@y%
+}
+\makeatother
+
+\begin{command}{\pgftransformnonlinear\marg{transformation code}}
+ This command adds the \meta{transformation code} to the list of non-linear
+ transformations currently in force. Thus, similar to linear
+ coordinate transformations, each additional call to this function
+ adds another transformation to the current \TeX\ scope and the
+ effect ends at the end of the current scope. In practice, however,
+ you typically will not have more than one active nonlinear
+ transformation.
+
+ The job of the \meta{transformation code} is to map a point~$p$
+ given in the registers |\pgf@x| and |\pgf@y| to a new
+ coordinate~$f(p)$, which should be returned in |\pgf@x| and |\pgf@y|
+ as well. As an example, suppose we wish to install polar coordinates
+ as the nonlinear transformation. For this, we need a bit of code:
+\begin{codeexample}[code only]
+\def\polartransformation{%
+ % \pgf@x will contain the radius
+ % \pgf@y will contain the distance
+ \pgfmathsincos@{\pgf@x}%
+ % pgfmathresultx is now the cosine of radius and
+ % pgfmathresulty is the sine of radius
+ \pgf@x=\pgfmathresultx\pgf@y%
+ \pgf@y=\pgfmathresulty\pgf@y%
+}
+\end{codeexample}
+ (In case you wonder why you cannot just call |\pgfpointpolar| at
+ this point: You can, but this function internally uses |\pgf@x|
+ and |\pgf@y| in complicated ways, so you would first have to safe
+ them so some other registers. Also, the above is faster.)
+
+ If we were to call this function again, we would get something funny
+ like ``polar-polar coordinates,'' so let's not do this. Let us
+ instead have a look at the effect this call has: Once a nonlinear
+ transformation is installed, all subsequent path constructions are
+ affected by this transformation. In particular, a normal grid now
+ becomes the typical ``polar grid.''
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ % Start nonlinear transformation
+ \pgftransformnonlinear{\polartransformation}% see above
+
+ % Draw something with this transformation in force
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+\end{tikzpicture}
+\end{codeexample}
+\end{command}
+
+
+\subsubsection{Applying Nonlinear Transformations to Points}
+
+\begin{command}{\pgfpointtransformednonlinear\marg{point}}
+ Works like |\pgfpointtransformed|, but also applies the current
+ nonlinear transformation; that is, it first applies the current
+ linear transformation and then the current nonlinear
+ transformations. Note that, just like |\pgfpointtransformed|, you
+ normally do not call this function directly since it is called
+ internally by the path drawing commands.
+\end{command}
+
+
+\subsubsection{Applying Nonlinear Transformations to Paths}
+
+When a nonlinear transformation is installed, the normal path
+construction commands like |\pgfpathmoveto| get adjusted so that the
+``honour'' the nonlinear transformations currently in force. For
+|\pgfpathmoveto| this is pretty simple: Instead of just applying the
+linear transformation matrix to the point to which the path should
+``jump'' next, we also apply the nonlinear transformation. However,
+for a command like |\pgfpathlineto|, things are much more difficult:
+A straight line will no longer be a straight line!
+
+In order to make straight lines ``bend'', the following changes are in
+force while a nonlinear transformation is installed:
+
+\begin{enumerate}
+\item Whenever a straight line between two points $p$ and $q$ should
+ be added to the path, either through |\pgfpathlineto| or through
+ |\pgfpathclose|, we replace this straight line by a ``degenerated
+ curve'' from $p$ to $q$ whose control points are at one third and
+ two third of the distance between $p$ and $q$ on the line between
+ $p$ and $q$. In this way, while nonlinear transformations are in
+ force, we only need to transform curves.
+\item Next, suppose we wish to transform a curve from $p$ to $q$ with
+ supports $s$ and $t$. For this, we simply apply the nonlinear
+ transformation $f$ to all four points and draw a line with the
+ results. Note that this mapping is actually not quite satisfactory
+ for long lines that are strongly curved:
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgftransformnonlinear{\polartransformation}
+ % The curve with the controls computed by pgf: a nice quarter arc
+ \draw [red] (0,20mm) -- (90pt,20mm);
+ }
+ % Here is the curve with controls just transformed:
+ \draw (0:20mm) .. controls (30pt:20mm) and (60pt:20mm) .. (90pt:20mm);
+\end{tikzpicture}
+\end{codeexample}
+ As the example shows, the control points now lie on the arc; but in
+ reality they should point along the tangents at the start and the
+ end. This is exactly when \pgfname\ does through the computation
+ described above.
+\item
+ To overcome the effect of the control points being ``off,'' it is
+ necessary to split up longer curves into smaller parts, which are
+ drawn individually to increase the accuracy. When such splitting
+ occurs, can be configured using the following command:
+ \begin{command}{\pgfsettransformnonlinearflatness\marg{dimension}
+ (initially 5pt)}
+ Whenever in a to-be-drawn curve the $L^\infty$-distance (maximum
+ of the distances in $x$- and $y$-directions) between the start of
+ a curve and its first control point or between the first and
+ second control points or between the second control point and the
+ end is more than \meta{distance}, the curve gets split in the
+ middle (more precisely, at time $t= 0.5$) and we draw the two
+ parts individually (for them, splitting may occur again, if the
+ curve is still too long).
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \draw[red] (0:20mm) arc [start angle=0, end angle=90, radius=2cm];
+ {
+ \pgftransformnonlinear{\polartransformation}
+ \pgfsettransformnonlinearflatness{2pt} % very precise
+ \draw (0,20mm) -- (90pt,20mm);
+ }
+\end{tikzpicture}
+\end{codeexample}
+ \end{command}
+\end{enumerate}
+
+
+\subsubsection{Applying Nonlinear Transformations to Text}
+
+Earlier, it was pointed that nonlinear transformations do not apply
+to text. Nevertheless, when you use |\pgftext| or |\pgfnode|,
+\pgfname\ will do a sort of ``best effort'' to render the text in
+the nonlinear coordinate system: The point where the text should be
+shown can obviously be computed easily. When then temporarily reset
+the nonlinear transformation and, instead, setup a linear
+transformation that matches the nonlinear transformation at the
+point where the text should be. Then, the text is shown. This means
+that if the text is longer, it will not ``follow'' the nonlinear
+transformation, but near the origin of the text it will look
+``correct.'' As an example, let us add some text at the grid point
+of the above example:
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \pgftransformnonlinear{\polartransformation}% see above
+
+ % Draw something with this transformation in force
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+
+ \foreach \angle in {0,30,60,90}
+ \foreach \dist in {1,2}
+ {
+ \pgftransformshift{\pgfpoint{\angle pt}{\dist cm}}
+ \pgftext{\angle$^\circ$}
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsubsection{Approximating Nonlinear Transformations Using Linear Transformations}
+
+At any given point, the current nonlinear transformation can be
+approximated using a linear transformation. The following two
+functions allow you to install such a local approximation:
+
+\begin{command}{\pgfapproximatenonlineartransformation}
+ This command will do two things:
+ \begin{enumerate}
+ \item It clears the nonlinear transformations for the rest of the
+ current \TeX\ scope, so only linear transformations apply.
+ \item However, before removing the nonlinear transformations, the
+ linear transformation matrix is modified so that it mimics the
+ effect the nonlinear transformation had at the origin. That is,
+ after you call this command, drawing something near the origin
+ will look almost the same as if you had not called it.
+ \end{enumerate}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \pgftransformnonlinear{\polartransformation}% see above
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+
+ \begin{scope}[shift={(45pt,20mm)}]
+ % Draw something near "origin":
+ \draw [red] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [red] (10pt,-10pt) -- (-10pt,10pt);
+
+ % Now draw the same, but in the "approximate" coordinate system:
+ \pgfapproximatenonlineartransformation
+ \draw [] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [] (10pt,-10pt) -- (-10pt,10pt);
+ \pgftext{foo};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+ This command is used by |\pgftext| and |\pgfnode| to transform text
+ when a nonlinear transformation is in force.
+\end{command}
+
+\begin{command}{\pgfapproximatenonlineartranslation}
+ This command works like the normal approximation command, but it
+ will only approximate how the origin gets translated, it will not
+ approximate the rotation, skewing, or scaling that is involved. This
+ is useful for drawing text at the right position, but without
+ ``mutilating'' the text.
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ \pgftransformnonlinear{\polartransformation}% see above
+ \draw (0pt,0mm) grid [xstep=10pt, ystep=5mm] (90pt, 20mm);
+
+ \begin{scope}[shift={(45pt,20mm)}]
+ % Draw something near "origin":
+ \draw [red] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [red] (10pt,-10pt) -- (-10pt,10pt);
+
+ % Now draw the same, but in the "approximate" coordinate system:
+ \pgfapproximatenonlineartranslation
+ \draw [] (-10pt,-10pt) -- (10pt,10pt);
+ \draw [] (10pt,-10pt) -- (-10pt,10pt);
+ \pgftext{foo};
+ \end{scope}
+\end{tikzpicture}
+\end{codeexample}
+\end{command}
+
+
+\subsubsection{Nonlinear Transformation Libraries}
+\label{section-library-curvilinear}
+
+\begin{pgflibrary}{curvilinear}
+ This library defines commands for computing nonlinear
+ transformations ``along B\'ezier curves''.
+\end{pgflibrary}
+
+Up to now, our running example for a nonlinear transformation was
+polar transformation. However, is \pgfname\ nonlinear transformations
+are \emph{actually} mainly used for transforming arrow tips; and these
+need to be transformed ``along curves.'' The |curvilinear| library
+defines a number of commands that offer the necessary computations for
+such transformations.
+
+\begin{command}{\pgfsetcurvilinearbeziercurve\marg{start}\marg{first
+ support}\marg{second support}\marg{end}}
+ Prior to using any other command from this library, you first call
+ this function to ``install'' a B\'ezier curve to which the commands
+ will refer. This curve will be local to the current \TeX\ scope and
+ you can install only one curve at a time.
+
+ The main job of this command is to store the passed points
+ internally and to build a lookup table for distance-to-time
+ conversions, see the next command.
+\begin{codeexample}[code only]
+\pgfsetcurvilinearbeziercurve
+ {\pgfpointorigin}
+ {\pgfpoint{1cm}{1cm}}
+ {\pgfpoint{2cm}{1cm}}
+ {\pgfpoint{3cm}{0cm}}
+\end{codeexample}
+\end{command}
+
+\begin{command}{\pgfcurvilineardistancetotime\marg{distance}}
+ This command does a ``distance-to-time-conversion'': It tries to
+ compute a time $t$, returned in |\pgf@x|, that corresponds to
+ travelling \meta{distance} along the curve that has last been
+ installed using the command |\pgfsetcurvilinearbeziercurve|. The distance-to-time-conversion
+ uses the precomputations done by that command. Note that several
+ compromises had to be made between speed and accuracy:
+ \begin{itemize}
+ \item The conversion will be best near the start of the curve.
+ \item The more ``degenerate'' the curve, the worse the results.
+ \end{itemize}
+\end{command}
+
+
+\begin{command}{\pgfpointcurvilinearbezierorthogonal\marg{distance}\marg{offset}}
+ This command computes the following point: Consider the curve
+ last installed using the command |\pgfsetcurvilinearbeziercurve|. We
+ travel along this curve by \meta{distance}, arriving at a point
+ $p$. Then, we turn by $90^\circ$ and travel by \meta{offset} units
+ ``aways from the curve,'' arriving at a point $q$. This point $q$
+ will now be returned in |\pgf@x| and |\pgf@y|; furthermore, the
+ transformed local coordinate system at point $q$ will also be
+ returned |\pgf@xa| and the other registers, see
+ |\pgftransformnonlinear| for details.
+ \makeatletter
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{11mm}{20mm}}
+ {\pgfpoint{20mm}{11mm}}
+ {\pgfpoint{20mm}{0mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierorthogonal\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (11mm,20mm) and (20mm,11mm) .. (20mm,0mm);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{10mm}{20mm}}
+ {\pgfpoint{10mm}{10mm}}
+ {\pgfpoint{20mm}{10mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierorthogonal\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (10mm,20mm) and (10mm,10mm) .. (20mm,10mm);
+\end{tikzpicture}
+\end{codeexample}
+\end{command}
+
+
+\begin{command}{\pgfpointcurvilinearbezierpolar\marg{x}\marg{y}}
+ This command is similar to the previous version, but the
+ transformation is different: The idea is that a line form $(0,0)$ to
+ $(x,0)$ gets transformed to the curve from the start of the curve to
+ a point at distance $x$ along the curve. This is identical to what
+ the ``orthogonal'' transformation above also does. The difference is
+ that a line from $(0,0)$ to $(0,y)$ gets still transformed to an
+ initial segment of the curve of a length of $y$, but now rotated by
+ $90^\circ$. In general, the point $p = (x,y)$ gets transferred to a
+ point that at distance $|p| = \sqrt{x^2+y^2}$ along the curve, but
+ rotated by the angle of $p$ relative to the $x$-axis.
+
+ All of these computations mainly have the following effect: Two
+ straight lines from the start of the curve as in a |Straight Barb|
+ arrow tip get transformed to an initial segment of the curve whose
+ length is the length of the two lines, but this segment gets rotated
+ by the angle of the two lines.
+ \makeatletter
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{11mm}{20mm}}
+ {\pgfpoint{20mm}{11mm}}
+ {\pgfpoint{20mm}{0mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierpolar\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ % Add a "barb":
+ \draw [blue, very thick] (20pt,10pt) -- (0,0) -- (20pt,-10pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (11mm,20mm) and (20mm,11mm) .. (20mm,0mm);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{codeexample}[]
+\begin{tikzpicture}
+ \draw [help lines] (0,0) grid (3,2);
+ {
+ \pgfsetcurvilinearbeziercurve
+ {\pgfpoint{0mm}{20mm}}
+ {\pgfpoint{10mm}{20mm}}
+ {\pgfpoint{10mm}{10mm}}
+ {\pgfpoint{20mm}{10mm}}
+ \pgftransformnonlinear{\pgfpointcurvilinearbezierpolar\pgf@x\pgf@y}%
+ \draw (0,-30pt) grid [step=10pt] (80pt,30pt);
+ % Add a "barb":
+ \draw [blue, very thick] (20pt,10pt) -- (0,0) -- (20pt,-10pt);
+ }
+ \draw[red, very thick]
+ (0mm,20mm) .. controls (10mm,20mm) and (10mm,10mm) .. (20mm,10mm);
+\end{tikzpicture}
+\end{codeexample}
+\end{command}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "pgfmanual"
%%% End:
+
+% LocalWords: nonlineartransformations PGF cx dy pdf PostScript pgfscope xstep
+% LocalWords: Reinstalls shiftx backend pgflowlevelscope ystep ezier lookup xa
+% LocalWords: precomputations