diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.polar.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.polar.code.tex | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.polar.code.tex b/Master/texmf-dist/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.polar.code.tex new file mode 100644 index 00000000000..f39adbbedaa --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.polar.code.tex @@ -0,0 +1,192 @@ +% Copyright 2008 by Till Tantau +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Public License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + +\ProvidesFileRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/libraries/datavisualization/pgflibrarydatavisualization.polar.code.tex,v 1.2 2008/11/24 18:31:22 tantau Exp $ + +\usepgfmodule{datavisualization} + +% This file defines code for doing plots involving polar +% coordinates. This includes not only standard polar plots, but also +% pie charts. + + + +\pgfooclass{polar transformer} +{ + % Class plor mapper + % + % A polar mapper is used to transform attributes given as (2d) polar + % coordinates to canvas coordinates. Note that no special ranges + % can be specified and that the angle must be given in degrees. You + % can, however, use a standard mapper to change these things. + + \attribute angle; + % The attribute from which the angle is read. + + \attribute radius; + % The attribute from which the radius is read. + + \attribute unit vector 0 degrees; + % The unit vector 0 degrees + + \attribute unit vector 90 degrees; + % The unit vector 90 degrees + + + + % Constructor + % + % #1 = angle attribute. Example: rotation. + % #2 = radius attribute. Example: height. + % #3 = unit vector 0 degrees + % #4 = unit vector 90 degrees + % + \method polar transformer(#1,#2,#3,#4) { + \pgfooset{angle}{#1} + \pgfooset{radius}{#2} + \pgfooset{unit vector 0 degrees}{#3} + \pgfooset{unit vector 90 degrees}{#4} + } + + % Method + \method default connects() { + \pgfoothis.get handle(\pgf@dv@me) + \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,transform,transform datapoint signal) + \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,path,path signal) + \pgfkeysvalueof{/pgf/data visualization/obj}.connect(\pgf@dv@me,direction,direction signal) + } + + % Getters + \method get angle attribute(#1) { + \pgfooget{angle}{#1} + } + + \method get radius attribute(#1) { + \pgfooget{radius}{#1} + } + + + % Slot + % + % This slot should be connected to the transform datapoint + % signal. When this signal is emitted, the coordinate system will be + % shifted according to the current value of the attribute. + \method transform() { + \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}/const}\pgf@dv@angle% + \ifx\pgf@dv@angle\relax + \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}}\pgf@dv@angle% + \fi + \ifx\pgf@dv@angle\relax\else% + \ifx\pgf@dv@angle\pgfutil@empty\else% + \pgfkeysgetvalue{/data point/\pgfoovalueof{radius}/const}\pgf@dv@radius% + \ifx\pgf@dv@radius\relax + \pgfkeysgetvalue{/data point/\pgfoovalueof{radius}}\pgf@dv@radius% + \fi + \ifx\pgf@dv@radius\pgfutil@empty\else% + \ifx\pgf@dv@radius\relax\else% + \pgfmathsincos{\pgf@dv@angle}% + \pgfmathmultiply{\pgfmathresultx}{\pgf@dv@radius}% + \let\pgf@dv@polar@temp=\pgfmathresult + \pgftransformshift{\pgfpointscale{\pgf@dv@polar@temp}{\pgfoovalueof{unit vector 0 degrees}}}% + \pgfmathmultiply{\pgfmathresulty}{\pgf@dv@radius}% + \let\pgf@dv@polar@temp=\pgfmathresult + \pgftransformshift{\pgfpointscale{\pgf@dv@polar@temp}{\pgfoovalueof{unit vector 90 degrees}}}% + \fi% + \fi% + \fi% + \fi% + } + + + + % Reaction to the path signal + % + % Here is what we do: When a pgfdvpathmoveto is done, the radius and + % the angle are recorded. When a pgfdvpathlineto is done, the saved + % radius and angle are compared with the new angle and radius. If, + % and only if, the radius is the same, but the angle is different, + % the lineto is caught and replaced by an arc from the previous + % position to the new position. + + \attribute prev angle; + \attribute prev radius; + + \method path(#1) {% + \ifpgfdvhandled% + \else% + \ifx#1\pgfdvpathlinetotoken + % Ok, let us have a look... + \pgfooget{prev radius}\pgf@dv@prev@rad + \pgfkeysgetvalue{/data point/\pgfoovalueof{radius}}\pgf@dv@current@rad + \ifx\pgf@dv@current@rad\relax + \else + \ifdim\pgf@dv@current@rad pt=\pgf@dv@prev@rad pt% + \pgfooget{prev angle}\pgf@dv@prev@angle + \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}}\pgf@dv@current@angle + \ifx\pgf@dv@current@angle\relax + \else + \ifdim\pgf@dv@current@angle pt=\pgf@dv@prev@angle pt% + % do nothing + \else% + % Do arc: + \pgfpatharcaxes{\pgf@dv@prev@angle}{\pgf@dv@current@angle} + {\pgfpointscale{\pgf@dv@current@rad}{\pgfoovalueof{unit vector 0 degrees}}} + {\pgfpointscale{\pgf@dv@current@rad}{\pgfoovalueof{unit vector 90 degrees}}}% + \pgfdvhandledtrue% + \fi% + \fi% + \fi% + \fi% + \fi% + \fi% + % No matter what, record the current position + \pgfooeset{prev angle}{\pgfkeysvalueof{/data point/\pgfoovalueof{angle}}} + \pgfooeset{prev radius}{\pgfkeysvalueof{/data point/\pgfoovalueof{radius}}} + } + + % Method + % + % React to direction signals. See pgfpointdvdirection for an + % explanation + % + \method direction(#1) {% + \ifx#1\pgfdvdirectionfromtoken + % Record angle and radius + \xdef\pgf@dv@polar@from@angle{\pgfkeysvalueof{/data point/\pgfoovalueof{angle}}} + \xdef\pgf@dv@polar@from@radius{\pgfkeysvalueof{/data point/\pgfoovalueof{radius}}} + \else% + \pgfkeysgetvalue{/data point/\pgfoovalueof{radius}}\pgf@dv@polar@to@radius + \ifx\pgf@dv@polar@to@radius\relax + \else + \ifdim\pgf@dv@polar@to@radius pt=\pgf@dv@polar@from@radius pt% + \pgfkeysgetvalue{/data point/\pgfoovalueof{angle}}\pgf@dv@polar@to@angle + \ifx\pgf@dv@polar@to@angle\relax + \else + \ifdim\pgf@dv@polar@to@angle pt=\pgf@dv@polar@from@angle pt% + % do nothing + \else% + % Output vector that it orthogonal to start angle: + \ifdim\pgf@dv@polar@to@angle pt>\pgf@dv@polar@from@angle pt% + \pgf@process{\pgfpointpolar{\pgf@dv@polar@from@angle+90}{1pt}} + \else + \pgf@process{\pgfpointpolar{\pgf@dv@polar@from@angle-90}{1pt}} + \fi + \pgfdvhandledtrue + \fi% + \fi% + \fi% + \fi% + \fi% + } +} + + +\endinput + + |