diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex | 8070 |
1 files changed, 4034 insertions, 4036 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex b/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex index ae7ec0f3c4e..08ef867ff0e 100644 --- a/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex @@ -7,87 +7,87 @@ % % See the file doc/generic/pgf/licenses/LICENSE for more details. -\ProvidesFileRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex,v 1.1 2008/06/26 16:55:55 tantau Exp $ +\ProvidesFileRCS{pgflibraryshapes.geometric.code.tex} \pgfdeclareshape{ellipse} % % Draws a circle around the text % -{ +{% \savedanchor\centerpoint{% \pgf@x=.5\wd\pgfnodeparttextbox% \pgf@y=.5\ht\pgfnodeparttextbox% \advance\pgf@y by-.5\dp\pgfnodeparttextbox% - } + }% \savedanchor\radius{% - % - % Caculate ``height radius'' - % + % + % Calculate ``height radius'' + % \pgf@y=.5\ht\pgfnodeparttextbox% \advance\pgf@y by.5\dp\pgfnodeparttextbox% \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/inner ysep}}% \advance\pgf@y by\pgf@yb% - % - % Caculate ``width radius'' - % + % + % Calculate ``width radius'' + % \pgf@x=.5\wd\pgfnodeparttextbox% \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/inner xsep}}% \advance\pgf@x by\pgf@xb% - % + % % Adjust - % + % \pgf@x=1.4142136\pgf@x% \pgf@y=1.4142136\pgf@y% - % - % Adjust hieght, if necessary - % + % + % Adjust height, if necessary + % \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/minimum height}}% \ifdim\pgf@y<.5\pgf@yc% \pgf@y=.5\pgf@yc% \fi% - % + % % Adjust width, if necessary - % + % \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}% \ifdim\pgf@x<.5\pgf@xc% \pgf@x=.5\pgf@xc% \fi% - % + % % Add outer sep - % - \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}% + % + \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}% \advance\pgf@x by\pgf@xb% \advance\pgf@y by\pgf@yb% - } + }% % % Anchors - % - \anchor{center}{\centerpoint} - \anchor{mid}{\centerpoint\pgfmathsetlength\pgf@y{.5ex}} - \anchor{base}{\centerpoint\pgf@y=0pt} + % + \anchor{center}{\centerpoint}% + \anchor{mid}{\centerpoint\pgfmathsetlength\pgf@y{.5ex}}% + \anchor{base}{\centerpoint\pgf@y=0pt}% \anchor{north} { \pgf@process{\radius} \pgf@ya=\pgf@y% \pgf@process{\centerpoint} \advance\pgf@y by\pgf@ya - } + }% \anchor{south} { \pgf@process{\radius} \pgf@ya=\pgf@y% \pgf@process{\centerpoint} \advance\pgf@y by-\pgf@ya - } + }% \anchor{west} { \pgf@process{\radius} \pgf@xa=\pgf@x% \pgf@process{\centerpoint} \advance\pgf@x by-\pgf@xa - } + }% \anchor{mid west} {% \pgf@process{\radius} @@ -95,7 +95,7 @@ \pgf@process{\centerpoint} \advance\pgf@x by-\pgf@xa% \pgfmathsetlength\pgf@y{.5ex} - } + }% \anchor{base west} {% \pgf@process{\radius} @@ -103,7 +103,7 @@ \pgf@process{\centerpoint} \advance\pgf@x by-\pgf@xa% \pgf@y=0pt - } + }% \anchor{north west} { \pgf@process{\radius} @@ -112,7 +112,7 @@ \pgf@process{\centerpoint} \advance\pgf@x by-0.707107\pgf@xa \advance\pgf@y by0.707107\pgf@ya - } + }% \anchor{south west} { \pgf@process{\radius} @@ -121,14 +121,14 @@ \pgf@process{\centerpoint} \advance\pgf@x by-0.707107\pgf@xa \advance\pgf@y by-0.707107\pgf@ya - } + }% \anchor{east} {% \pgf@process{\radius} \pgf@xa=\pgf@x% \pgf@process{\centerpoint} \advance\pgf@x by\pgf@xa - } + }% \anchor{mid east} {% \pgf@process{\radius} @@ -136,7 +136,7 @@ \pgf@process{\centerpoint} \advance\pgf@x by\pgf@xa% \pgfmathsetlength\pgf@y{.5ex} - } + }% \anchor{base east} {% \pgf@process{\radius} @@ -144,7 +144,7 @@ \pgf@process{\centerpoint} \advance\pgf@x by\pgf@xa% \pgf@y=0pt - } + }% \anchor{north east} { \pgf@process{\radius} @@ -153,7 +153,7 @@ \pgf@process{\centerpoint} \advance\pgf@x by0.707107\pgf@xa \advance\pgf@y by0.707107\pgf@ya - } + }% \anchor{south east} { \pgf@process{\radius} @@ -162,7 +162,7 @@ \pgf@process{\centerpoint} \advance\pgf@x by0.707107\pgf@xa \advance\pgf@y by-0.707107\pgf@ya - } + }% \anchorborder{ \edef\pgf@marshal{% \noexpand\pgfpointborderellipse @@ -175,7 +175,7 @@ \centerpoint% \advance\pgf@x by\pgf@xa% \advance\pgf@y by\pgf@ya% - } + }% % % Background path @@ -185,13 +185,13 @@ \pgf@process{\radius}% \pgfutil@tempdima=\pgf@x% \pgfutil@tempdimb=\pgf@y% - \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}% + \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}% \advance\pgfutil@tempdima by-\pgf@xb% \advance\pgfutil@tempdimb by-\pgf@yb% \pgfpathellipse{\centerpoint}{\pgfqpoint{\pgfutil@tempdima}{0pt}}{\pgfqpoint{0pt}{\pgfutil@tempdimb}}% - } -} + }% +}% @@ -209,14 +209,14 @@ % /pgf/aspect : recommended width/height quotient. % \pgfkeys{/pgf/.cd, - aspect/.code={\pgfsetshapeaspect{#1}},% this for tikz... - shape aspect/.initial=1,% but this is consistent with other pgfset stuff. - shape aspect/.code={% - \pgfkeys{/pgf/aspect=#1}% - \pgfkeyssetvalue{/pgf/shape aspect}{#1} - }% -} - + aspect/.code={\pgfsetshapeaspect{#1}},% this for tikz... + shape aspect/.initial=1,% but this is consistent with other pgfset stuff. + shape aspect/.code={% + \pgfkeys{/pgf/aspect=#1}% + \pgfkeyssetvalue{/pgf/shape aspect}{#1} + }% +}% + \def\pgfsetshapeaspect#1{% \def\pgfshapeaspect{#1}% @@ -226,13 +226,13 @@ \c@pgf@counta=\pgfutil@tempdima\relax% 8192*determinant \pgfutil@tempdima=8192pt% \divide\pgfutil@tempdima by\c@pgf@counta% - \edef\pgfshapeaspectinverse{\pgf@sys@tonumber{\pgfutil@tempdima}} -} + \edef\pgfshapeaspectinverse{\pgf@sys@tonumber{\pgfutil@tempdima}}% +}% -\pgfsetshapeaspect{1} +\pgfsetshapeaspect{1}% \pgfdeclareshape{diamond} -{ +{% \savedanchor\outernortheast{% % % Calculate width and height of the inner rectangle @@ -255,13 +255,13 @@ % Check against minimum height/width % \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}% - \pgf@xb=.5\pgf@xb% + \pgf@xb=.5\pgf@xb% \ifdim\pgf@x<\pgf@xb% % yes, too small. Enlarge... \pgf@x=\pgf@xb% \fi% \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}% - \pgf@yb=.5\pgf@yb% + \pgf@yb=.5\pgf@yb% \ifdim\pgf@y<\pgf@yb% % yes, too small. Enlarge... \pgf@y=\pgf@yb% @@ -273,12 +273,12 @@ \advance\pgf@x by\pgf@xa% \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}% \advance\pgf@y by\pgf@ya% - } + }% \savedanchor\text{% \pgf@x=-.5\wd\pgfnodeparttextbox% \pgf@y=-.5\ht\pgfnodeparttextbox% \advance\pgf@y by.5\dp\pgfnodeparttextbox% - } + }% % % Anchors @@ -288,18 +288,18 @@ \anchor{mid}{% \pgf@process{\text}% \pgf@x=0pt% - \pgfmathsetlength\pgf@ya{.5ex} + \pgfmathsetlength\pgf@ya{.5ex}% \advance\pgf@y by\pgf@ya% - } - \anchor{base}{\pgf@process{\text}\pgf@x=0pt } - \anchor{north}{\pgf@process{\outernortheast}\pgf@x=0pt} - \anchor{south}{\pgf@process{\outernortheast}\pgf@x=0pt\pgf@y=-\pgf@y} - \anchor{west}{\pgf@process{\outernortheast}\pgf@x=-\pgf@x\pgf@y=0pt} - \anchor{north west}{\pgf@process{\outernortheast}\pgf@x=-.5\pgf@x\pgf@y=.5\pgf@y} - \anchor{south west}{\pgf@process{\outernortheast}\pgf@x=-.5\pgf@x\pgf@y=-.5\pgf@y} - \anchor{east}{\pgf@process{\outernortheast}\pgf@y=0pt} - \anchor{north east}{\pgf@process{\outernortheast}\pgf@x=.5\pgf@x\pgf@y=.5\pgf@y} - \anchor{south east}{\pgf@process{\outernortheast}\pgf@x=.5\pgf@x\pgf@y=-.5\pgf@y} + }% + \anchor{base}{\pgf@process{\text}\pgf@x=0pt}% + \anchor{north}{\pgf@process{\outernortheast}\pgf@x=0pt}% + \anchor{south}{\pgf@process{\outernortheast}\pgf@x=0pt\pgf@y=-\pgf@y}% + \anchor{west}{\pgf@process{\outernortheast}\pgf@x=-\pgf@x\pgf@y=0pt}% + \anchor{north west}{\pgf@process{\outernortheast}\pgf@x=-.5\pgf@x\pgf@y=.5\pgf@y}% + \anchor{south west}{\pgf@process{\outernortheast}\pgf@x=-.5\pgf@x\pgf@y=-.5\pgf@y}% + \anchor{east}{\pgf@process{\outernortheast}\pgf@y=0pt}% + \anchor{north east}{\pgf@process{\outernortheast}\pgf@x=.5\pgf@x\pgf@y=.5\pgf@y}% + \anchor{south east}{\pgf@process{\outernortheast}\pgf@x=.5\pgf@x\pgf@y=-.5\pgf@y}% \anchorborder{% \pgf@xa=\pgf@x% \pgf@ya=\pgf@y% @@ -320,7 +320,7 @@ {\noexpand\pgfqpoint{0pt}{\the\pgf@y}}% }% \pgf@process{\pgf@marshal}% - } + }% % % Background path @@ -338,8 +338,8 @@ \pgfpathlineto{\pgfqpoint{-\pgf@xc}{0pt}}% \pgfpathlineto{\pgfqpoint{0pt}{-\pgf@yc}}% \pgfpathclose% - } -} + }% +}% @@ -356,571 +356,569 @@ % /pgf/star point ratio : The ratio of the outer point and inner point radii. \pgfkeys{/pgf/.cd, - star points/.initial=5, - star point height/.initial=.5cm, - star point height/.code={% - \def\pgf@lib@temp{#1}% - \pgfkeyslet{/pgf/star point height}{\pgf@lib@temp}% - \pgf@lib@shapes@starouterradiususesratiofalse% - }, - star point ratio/.initial=1.5, - star point ratio/.code={% - \def\pgf@lib@temp{#1}% - \pgfkeyslet{/pgf/star point ratio}{\pgf@lib@temp}% - \pgf@lib@shapes@starouterradiususesratiotrue% - },% - star rotate/.style={/pgf/shape border rotate=#1}% For compatability with 1.18 -} + star points/.initial=5, + star point height/.initial=.5cm, + star point height/.code={% + \def\pgf@lib@temp{#1}% + \pgfkeyslet{/pgf/star point height}{\pgf@lib@temp}% + \pgf@lib@shapes@starouterradiususesratiofalse% + }, + star point ratio/.initial=1.5, + star point ratio/.code={% + \def\pgf@lib@temp{#1}% + \pgfkeyslet{/pgf/star point ratio}{\pgf@lib@temp}% + \pgf@lib@shapes@starouterradiususesratiotrue% + },% + star rotate/.style={/pgf/shape border rotate=#1},% For compatibility with 1.18 +}% % Shape star. % -\pgfdeclareshape{star}{ - \savedmacro\totalstarpoints{% - \pgfmathsetcounter{pgf@counta}{\pgfkeysvalueof{/pgf/star points}}% - \multiply\c@pgf@counta2\relax% - \edef\totalstarpoints{\the\c@pgf@counta}% - } - \savedmacro\anglestep{% - \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/star points}}% - \let\anglestep\pgfmathresult% - } - \savedmacro\calculateradii{% - % - % Get the node dimensions. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - \ifdim\pgf@y>\pgf@x% - \pgf@x\pgf@y% - \fi% - % - % Calculate the incircle radius. - % - \pgf@x1.41421\pgf@x% - \edef\innerradius{\the\pgf@x}% - % - % Calculate the circumcircle radius. - % - % Use the star point height or the star point ratio? - % - \ifpgf@lib@shapes@starouterradiususesratio% - \pgfmathparse{\pgfkeysvalueof{/pgf/star point ratio}}% - \expandafter\pgf@x\pgfmathresult\pgf@x% - \else% - \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/star point height}}% - \fi% - \pgf@xc\pgf@x% - % - % Accommodate the larger of the minimum height/width. - % - \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}% - \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@ya>\pgf@xa% - \pgf@xa\pgf@ya% - \fi% - \ifdim\pgf@x<.5\pgf@xa% - \pgf@x.5\pgf@xa% - \fi% - \edef\outerradius{\the\pgf@x}% - % - % If the outer radius has been enlarged, adjust the inner radius... - % - \ifdim\pgf@x>\pgf@xc% - % - % ...using the star point ratio, or... - % - \ifpgf@lib@shapes@starouterradiususesratio% - \pgfmathreciprocal{\pgfkeysvalueof{/pgf/star point ratio}}% - \pgf@xa\pgfmathresult\pgf@x\relax% - \edef\innerradius{\the\pgf@xa}% - \else% - % - % The star point height. - % - \pgf@xa\pgf@x\relax% - \pgfmathaddtolength\pgf@xa{-\pgfkeysvalueof{/pgf/star point height}}% - \edef\innerradius{\the\pgf@xa}% - \fi% - \fi% - \edef\outerradius{\the\pgf@x}% - % - % Now calculate the anchor radii from the outer sep. - % - \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@ya>\pgf@xa% - \pgf@xa\pgf@ya% - \fi - % - % Take into account the miter length... - % - \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/star points}}% - \let\angletofirstpoint\pgfmathresult% - \pgfmathmultiply@{\angletofirstpoint}{2}% - \let\angletosecondpoint\pgfmathresult% - % - % ...for the outer radius... - % - \pgfmathanglebetweenlines% - {\pgfqpointpolar{\angletofirstpoint}{\outerradius}}% - {\pgfqpointpolar{\angletosecondpoint}{\innerradius}}% - {\pgfqpointpolar{\angletofirstpoint}{\outerradius}}% - {\pgfqpointpolar{0}{\innerradius}}% - \pgfmathdivide@{\pgfmathresult}{2}% - \pgfmathcosec@{\pgfmathresult}% - \pgf@x\outerradius\relax% - \advance\pgf@x\pgfmathresult\pgf@xa% - \edef\anchorouterradius{\the\pgf@x}% - % - % ...and for the inner radius. - % - \pgfmathanglebetweenlines% - {\pgfqpointpolar{\angletofirstpoint}{\innerradius}}% - {\pgfqpointpolar{0}{\outerradius}}% - {\pgfqpointpolar{\angletofirstpoint}{\innerradius}}% - {\pgfqpointpolar{\angletosecondpoint}{\outerradius}}% - \pgfmathdivide@{\pgfmathresult}{2}% - \pgfmathcosec@{\pgfmathresult}% - \pgf@x\innerradius\relax% - \advance\pgf@x\pgfmathresult\pgf@xa% - \edef\anchorinnerradius{\the\pgf@x}% - % - % Save all radii. - % - \addtosavedmacro{\innerradius}% - \addtosavedmacro{\outerradius}% - \addtosavedmacro{\anchorinnerradius}% - \addtosavedmacro{\anchorouterradius}% - } - \savedmacro\startangle{% - \pgfmathadd{90}{\pgfkeysvalueof{/pgf/shape border rotate}}% - \let\startangle\pgfmathresult% - } - % - % Saved anchors. - % - \savedanchor{\centerpoint}{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor{\midpoint}{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - % - % Other anchors. - % -% - % Other anchors. - % - \anchor{center}{\centerpoint}% - \anchor{mid}{\centerpoint\pgfmathsetlength\pgf@y{.5ex}}% - \anchor{base}{\centerpoint\pgf@y=0pt}% - \anchor{north}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{0pt}{\anchorouterradius}}}% - \anchor{south}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{0pt}{-\anchorouterradius}}}% - \anchor{east}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{0pt}}}% - \anchor{west}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{0pt}}}% - \anchor{north east}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{\anchorouterradius}}}% - \anchor{north west}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{\anchorouterradius}}}% - \anchor{south east}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{-\anchorouterradius}}}% - \anchor{south west}{% - \calculateradii% - \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{-\anchorouterradius}}}% - % - % Background path. - % - \backgroundpath{% - \calculateradii% - \let\angle\startangle% - \pgfpathmoveto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\startangle}{\outerradius}}}% - \pgfmathloop% - \pgfmathadd@{\angle}{\anglestep}% - \let\angle\pgfmathresult% - \ifnum\pgfmathcounter=\totalstarpoints% - \pgfpathclose% - \else% - \ifodd\pgfmathcounter - \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\innerradius}}}% - \else% - \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\outerradius}}}% - \fi% - \repeatpgfmathloop% - }% - % - % Define points on the anchor border. - % - \anchorborder{% - % - % Save x and y. - % - \edef\externalx{\the\pgf@x}% - \edef\externaly{\the\pgf@y}% - % - % Adjust the location of the external - % point relative to \centerpoint. - % - \centerpoint% - \pgf@xa\externalx\relax% - \pgf@ya\externaly\relax% - \advance\pgf@xa\pgf@x% - \advance\pgf@ya\pgf@y% - \edef\externalx{\the\pgf@xa}% - \edef\externaly{\the\pgf@ya}% - % - % Get the angle of the external point to the \centerpoint. - % - \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% - % - % Locate the appropriate sides on the star border... - % - \pgfmathsubtract@{\pgfmathresult}{\startangle}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \pgfmathdivide@{\pgfmathresult}{\anglestep}% - \pgfmathfloor@{\pgfmathresult}% - \afterassignment\pgfmath@gobbletilpgfmath@ - \c@pgf@counta\pgfmathresult\relax\pgfmath@ - \pgfmathmultiply@{\pgfmathresult}{\anglestep}% - \pgfmathadd@{\pgfmathresult}{\startangle}% - \let\firstangle\pgfmathresult% - \pgfmathadd@{\pgfmathresult}{\anglestep}% - \let\secondangle\pgfmathresult% - \calculateradii% - % - % ...and thus, the point on the star border. - % - \ifodd\c@pgf@counta - \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}% - {% - \pgfpointadd{\centerpoint}% - {\pgfqpointpolar{+\firstangle}{+\anchorinnerradius}}% - }% - {% - \pgfpointadd{\centerpoint}% - {\pgfqpointpolar{+\secondangle}{+\anchorouterradius}}% - }% - \else% - \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}% - {% - \pgfpointadd{\centerpoint}% - {\pgfqpointpolar{+\firstangle}{+\anchorouterradius}}% - }% - {% - \pgfpointadd{\centerpoint}% - {\pgfqpointpolar{+\secondangle}{+\anchorinnerradius}}% - }% - \fi% - } - % - % Some hackery. This is needed if a star is positioned using - % a `...point <n+1>' anchor, where n is the maximum number of - % points of any previously drawn star. - % - \pgfutil@g@addto@macro\pgf@sh@s@star{% - \c@pgf@counta\totalstarpoints\relax% - \divide\c@pgf@counta2\relax% - \pgfmathloop% - \ifnum\c@pgf@counta>0\relax% - \c@pgf@countb\c@pgf@counta\relax% - \advance\c@pgf@countb-1\relax% - \pgfutil@ifundefined{pgf@anchor@star@inner point\space\the\c@pgf@counta}{% - \expandafter\xdef\csname pgf@anchor@star@inner point\space\the\c@pgf@counta\endcsname{% - \noexpand\calculateradii% - \noexpand\pgfmathmultiply@{\the\c@pgf@countb}{\noexpand\anglestep}% - \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{2}% - \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\anglestep}% - \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% - \noexpand\let\noexpand\angle\noexpand\pgfmathresult% - \noexpand\pgfpointadd{\noexpand\centerpoint}% - {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorinnerradius}}% - }% - \expandafter\xdef\csname pgf@anchor@star@outer point\space\the\c@pgf@counta\endcsname{% - \noexpand\calculateradii% - \noexpand\pgfmathmultiply@{\the\c@pgf@countb}{\noexpand\anglestep}% - \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{2}% - \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% - \noexpand\let\noexpand\angle\noexpand\pgfmathresult% - \noexpand\pgfpointadd{\noexpand\centerpoint}% - {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorouterradius}}% - }% - }{\c@pgf@counta0\relax}% - \advance\c@pgf@counta-1\relax% - \repeatpgfmathloop% - }% -} +\pgfdeclareshape{star}{% + \savedmacro\totalstarpoints{% + \pgfmathsetcounter{pgf@counta}{\pgfkeysvalueof{/pgf/star points}}% + \multiply\c@pgf@counta2\relax% + \edef\totalstarpoints{\the\c@pgf@counta}% + }% + \savedmacro\anglestep{% + \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/star points}}% + \let\anglestep\pgfmathresult% + }% + \savedmacro\calculateradii{% + % + % Get the node dimensions. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + \ifdim\pgf@y>\pgf@x% + \pgf@x\pgf@y% + \fi% + % + % Calculate the incircle radius. + % + \pgf@x1.41421\pgf@x% + \edef\innerradius{\the\pgf@x}% + % + % Calculate the circumcircle radius. + % + % Use the star point height or the star point ratio? + % + \ifpgf@lib@shapes@starouterradiususesratio% + \pgfmathparse{\pgfkeysvalueof{/pgf/star point ratio}}% + \expandafter\pgf@x\pgfmathresult\pgf@x% + \else% + \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/star point height}}% + \fi% + \pgf@xc\pgf@x% + % + % Accommodate the larger of the minimum height/width. + % + \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}% + \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@ya>\pgf@xa% + \pgf@xa\pgf@ya% + \fi% + \ifdim\pgf@x<.5\pgf@xa% + \pgf@x.5\pgf@xa% + \fi% + \edef\outerradius{\the\pgf@x}% + % + % If the outer radius has been enlarged, adjust the inner radius... + % + \ifdim\pgf@x>\pgf@xc% + % + % ...using the star point ratio, or... + % + \ifpgf@lib@shapes@starouterradiususesratio% + \pgfmathreciprocal{\pgfkeysvalueof{/pgf/star point ratio}}% + \pgf@xa\pgfmathresult\pgf@x\relax% + \edef\innerradius{\the\pgf@xa}% + \else% + % + % The star point height. + % + \pgf@xa\pgf@x\relax% + \pgfmathaddtolength\pgf@xa{-\pgfkeysvalueof{/pgf/star point height}}% + \edef\innerradius{\the\pgf@xa}% + \fi% + \fi% + \edef\outerradius{\the\pgf@x}% + % + % Now calculate the anchor radii from the outer sep. + % + \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@ya>\pgf@xa% + \pgf@xa\pgf@ya% + \fi + % + % Take into account the miter length... + % + \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/star points}}% + \let\angletofirstpoint\pgfmathresult% + \pgfmathmultiply@{\angletofirstpoint}{2}% + \let\angletosecondpoint\pgfmathresult% + % + % ...for the outer radius... + % + \pgfmathanglebetweenlines% + {\pgfqpointpolar{\angletofirstpoint}{\outerradius}}% + {\pgfqpointpolar{\angletosecondpoint}{\innerradius}}% + {\pgfqpointpolar{\angletofirstpoint}{\outerradius}}% + {\pgfqpointpolar{0}{\innerradius}}% + \pgfmathdivide@{\pgfmathresult}{2}% + \pgfmathcosec@{\pgfmathresult}% + \pgf@x\outerradius\relax% + \advance\pgf@x\pgfmathresult\pgf@xa% + \edef\anchorouterradius{\the\pgf@x}% + % + % ...and for the inner radius. + % + \pgfmathanglebetweenlines% + {\pgfqpointpolar{\angletofirstpoint}{\innerradius}}% + {\pgfqpointpolar{0}{\outerradius}}% + {\pgfqpointpolar{\angletofirstpoint}{\innerradius}}% + {\pgfqpointpolar{\angletosecondpoint}{\outerradius}}% + \pgfmathdivide@{\pgfmathresult}{2}% + \pgfmathcosec@{\pgfmathresult}% + \pgf@x\innerradius\relax% + \advance\pgf@x\pgfmathresult\pgf@xa% + \edef\anchorinnerradius{\the\pgf@x}% + % + % Save all radii. + % + \addtosavedmacro{\innerradius}% + \addtosavedmacro{\outerradius}% + \addtosavedmacro{\anchorinnerradius}% + \addtosavedmacro{\anchorouterradius}% + }% + \savedmacro\startangle{% + \pgfmathadd{90}{\pgfkeysvalueof{/pgf/shape border rotate}}% + \let\startangle\pgfmathresult% + }% + % + % Saved anchors. + % + \savedanchor{\centerpoint}{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor{\midpoint}{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + % + % + % Other anchors. + % + \anchor{center}{\centerpoint}% + \anchor{mid}{\centerpoint\pgfmathsetlength\pgf@y{.5ex}}% + \anchor{base}{\centerpoint\pgf@y=0pt}% + \anchor{north}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{0pt}{\anchorouterradius}}}% + \anchor{south}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{0pt}{-\anchorouterradius}}}% + \anchor{east}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{0pt}}}% + \anchor{west}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{0pt}}}% + \anchor{north east}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{\anchorouterradius}}}% + \anchor{north west}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{\anchorouterradius}}}% + \anchor{south east}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{\anchorouterradius}{-\anchorouterradius}}}% + \anchor{south west}{% + \calculateradii% + \csname pgf@anchor@star@border\endcsname{\pgfqpoint{-\anchorouterradius}{-\anchorouterradius}}}% + % + % Background path. + % + \backgroundpath{% + \calculateradii% + \let\angle\startangle% + \pgfpathmoveto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\startangle}{\outerradius}}}% + \pgfmathloop% + \pgfmathadd@{\angle}{\anglestep}% + \let\angle\pgfmathresult% + \ifnum\pgfmathcounter=\totalstarpoints% + \pgfpathclose% + \else% + \ifodd\pgfmathcounter + \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\innerradius}}}% + \else% + \pgfpathlineto{\pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\outerradius}}}% + \fi% + \repeatpgfmathloop% + }% + % + % Define points on the anchor border. + % + \anchorborder{% + % + % Save x and y. + % + \edef\externalx{\the\pgf@x}% + \edef\externaly{\the\pgf@y}% + % + % Adjust the location of the external + % point relative to \centerpoint. + % + \centerpoint% + \pgf@xa\externalx\relax% + \pgf@ya\externaly\relax% + \advance\pgf@xa\pgf@x% + \advance\pgf@ya\pgf@y% + \edef\externalx{\the\pgf@xa}% + \edef\externaly{\the\pgf@ya}% + % + % Get the angle of the external point to the \centerpoint. + % + \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% + % + % Locate the appropriate sides on the star border... + % + \pgfmathsubtract@{\pgfmathresult}{\startangle}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \pgfmathdivide@{\pgfmathresult}{\anglestep}% + \pgfmathfloor@{\pgfmathresult}% + \afterassignment\pgfmath@gobbletilpgfmath@ + \c@pgf@counta\pgfmathresult\relax\pgfmath@ + \pgfmathmultiply@{\pgfmathresult}{\anglestep}% + \pgfmathadd@{\pgfmathresult}{\startangle}% + \let\firstangle\pgfmathresult% + \pgfmathadd@{\pgfmathresult}{\anglestep}% + \let\secondangle\pgfmathresult% + \calculateradii% + % + % ...and thus, the point on the star border. + % + \ifodd\c@pgf@counta + \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}% + {% + \pgfpointadd{\centerpoint}% + {\pgfqpointpolar{+\firstangle}{+\anchorinnerradius}}% + }% + {% + \pgfpointadd{\centerpoint}% + {\pgfqpointpolar{+\secondangle}{+\anchorouterradius}}% + }% + \else% + \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}% + {% + \pgfpointadd{\centerpoint}% + {\pgfqpointpolar{+\firstangle}{+\anchorouterradius}}% + }% + {% + \pgfpointadd{\centerpoint}% + {\pgfqpointpolar{+\secondangle}{+\anchorinnerradius}}% + }% + \fi% + }% + % + % Some hackery. This is needed if a star is positioned using + % a `...point <n+1>' anchor, where n is the maximum number of + % points of any previously drawn star. + % + \pgfutil@g@addto@macro\pgf@sh@s@star{% + \c@pgf@counta\totalstarpoints\relax% + \divide\c@pgf@counta2\relax% + \pgfmathloop% + \ifnum\c@pgf@counta>0\relax% + \c@pgf@countb\c@pgf@counta\relax% + \advance\c@pgf@countb-1\relax% + \pgfutil@ifundefined{pgf@anchor@star@inner point\space\the\c@pgf@counta}{% + \expandafter\xdef\csname pgf@anchor@star@inner point\space\the\c@pgf@counta\endcsname{% + \noexpand\calculateradii% + \noexpand\pgfmathmultiply@{\the\c@pgf@countb}{\noexpand\anglestep}% + \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{2}% + \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\anglestep}% + \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% + \noexpand\let\noexpand\angle\noexpand\pgfmathresult% + \noexpand\pgfpointadd{\noexpand\centerpoint}% + {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorinnerradius}}% + }% + \expandafter\xdef\csname pgf@anchor@star@outer point\space\the\c@pgf@counta\endcsname{% + \noexpand\calculateradii% + \noexpand\pgfmathmultiply@{\the\c@pgf@countb}{\noexpand\anglestep}% + \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{2}% + \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% + \noexpand\let\noexpand\angle\noexpand\pgfmathresult% + \noexpand\pgfpointadd{\noexpand\centerpoint}% + {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorouterradius}}% + }% + }{\c@pgf@counta0\relax}% + \advance\c@pgf@counta-1\relax% + \repeatpgfmathloop% + }% +}% % Keys for shape regular polygon % -% /pgf/regular polygon sides +% /pgf/regular polygon sides % \pgfkeys{/pgf/.cd, - regular polygon sides/.initial=5, - regular polygon rotate/.style={/pgf/shape border rotate=#1}% For compatability with 1.18 -} + regular polygon sides/.initial=5, + regular polygon rotate/.style={/pgf/shape border rotate=#1}% For compatibility with 1.18 +}% % Shape Regular Polygon. % -\pgfdeclareshape{regular polygon}{ - \savedmacro\sides{% - \pgfmathtruncatemacro\sides{\pgfkeysvalueof{/pgf/regular polygon sides}}% - } - \savedmacro\anglestep{% - \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/regular polygon sides}}% - \let\anglestep\pgfmathresult% - } - \savedmacro\calculateradii{% - % - % Get the node dimensions. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - \ifdim\pgf@y>\pgf@x% - \pgf@x\pgf@y% - \fi% - % - % Calculate i, the incircle radius - % - \pgf@x1.41421\pgf@x% - % - % Calculate r, the polygon radius - % - % r = i / cos(360 / s / 2) - % - % (s = polygon sides) - % - \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/regular polygon sides}}% - \pgfmathsec@{\pgfmathresult}% - \pgf@x\pgfmathresult\pgf@x% - % - % Accommodate the minimum width/height. - % - \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}% - \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@ya>\pgf@xa% - \pgf@xa\pgf@ya% - \fi% - \ifdim\pgf@x<.5\pgf@xa% - \pgf@x.5\pgf@xa% - \fi% - \edef\radius{\the\pgf@x}% - % - % Now calculate the anchor radius from the outer sep. - % - \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@ya>\pgf@xa% - \pgf@xa\pgf@ya% - \fi - % - % Take into account the miter length. - % - % m = o / sin (90 - (360 / s / 2)) - % - % (o = outer sep, s = sides) - % - \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/regular polygon sides}}% - \pgfmathsubtract@{90}{\pgfmathresult}% - \pgfmathcosec@{\pgfmathresult}% - \advance\pgf@x\pgfmathresult\pgf@xa% - \edef\anchorradius{\the\pgf@x}% - % - % Save both radii. - % - \addtosavedmacro{\radius}% - \addtosavedmacro{\anchorradius}% - } - \savedmacro\startangle{% - \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/regular polygon sides}}% - \let\anglestep\pgfmathresult% - \pgfmathtruncatemacro\sides{\pgfkeysvalueof{/pgf/regular polygon sides}}% - \expandafter\ifodd\sides\relax% - \edef\pgfmathresult{90}% - \else% - \pgfmathdivide@{\anglestep}{2}% - \pgfmathsubtract@{90}{\pgfmathresult}% - \fi% - \pgfmathadd{\pgfmathresult}{\pgfkeysvalueof{/pgf/shape border rotate}}% - \let\startangle\pgfmathresult% - } - % - % Saved anchors. - % - \savedanchor{\centerpoint}{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor{\midpoint}{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - % - % Other anchors. - % - \anchor{center}{\centerpoint}% - \anchor{mid}{\midpoint}% - \anchor{base}{\centerpoint\pgf@y=0pt}% - \anchor{north}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{0pt}{\anchorradius}}}% - \anchor{south}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{0pt}{-\anchorradius}}}% - \anchor{east}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{0pt}}}% - \anchor{west}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{0pt}}}% - \anchor{north east}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{\anchorradius}}}% - \anchor{north west}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{\anchorradius}}}% - \anchor{south east}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{-\anchorradius}}}% - \anchor{south west}{% - \calculateradii% - \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{-\anchorradius}}}% - % - % Background path. - % - \backgroundpath{% - \calculateradii% - \pgfpathmoveto{% - \pgfpointadd{\centerpoint}{\pgfqpointpolar{\startangle}{\radius}}% - }% - \let\angle\startangle% - \pgfmathloop% - \ifnum\pgfmathcounter=\sides\relax% - \pgfpathclose% - \else% - \pgfmathadd@{\angle}{\anglestep}% - \let\angle\pgfmathresult% - \pgfpathlineto{% - \pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\radius}}% - }% - \repeatpgfmathloop% - }% - \anchorborder{% - % - % Save x and y. - % - \edef\externalx{\the\pgf@x}% - \edef\externaly{\the\pgf@y}% - % - % Adjust the location of the external - % point relative to \centerpoint. - % - \centerpoint% - \pgf@xa\externalx\relax% - \pgf@ya\externaly\relax% - \advance\pgf@xa\pgf@x% - \advance\pgf@ya\pgf@y% - \edef\externalx{\the\pgf@xa}% - \edef\externaly{\the\pgf@ya}% - % - % Get the angle of the external point to the \centerpoint. - % - \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% - % - % Locate the appropriate sides on the polygon border... - % - \pgfmathsubtract@{\pgfmathresult}{\startangle}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \pgfmathdivide@{\pgfmathresult}{\anglestep}% - \pgfmathfloor@{\pgfmathresult}% - \pgfmathmultiply@{\pgfmathresult}{\anglestep}% - \pgfmathadd@{\pgfmathresult}{\startangle}% - \let\firstangle\pgfmathresult% - \pgfmathadd@{\pgfmathresult}{\anglestep}% - \let\secondangle\pgfmathresult% - \calculateradii% - % - % ...and thus, the point on the polygon border. - % - \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}% - {% - \pgfpointadd{\centerpoint}% - {\pgfqpointpolar{+\firstangle}{+\anchorradius}}% - }% - {% - \pgfpointadd{\centerpoint}% - {\pgfqpointpolar{+\secondangle}{+\anchorradius}}% - }% - } - % - % More hackery for when the recuglar polygon is positioned using - % a `corner <n+1>' or `side <n+1>' anchor, where n is the maximum - % number of sides of any previously drawn regular polygon. - % - \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@regular polygon\endcsname{% - \c@pgf@counta\sides\relax% - \pgfmathloop% - \ifnum\c@pgf@counta>0\relax% - \pgfutil@ifundefined{pgf@anchor@regular polygon@corner\space\the\c@pgf@counta}{% - % - % ...(manually \xdef as \gdef is normally used by \anchor)... - % - \expandafter\xdef\csname pgf@anchor@regular polygon@corner\space\the\c@pgf@counta\endcsname{% - \noexpand\calculateradii% - \noexpand\pgfmathsubtract@{\the\c@pgf@counta}{1}% - \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{\noexpand\anglestep}% - \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% - \noexpand\let\noexpand\angle\noexpand\pgfmathresult% - \noexpand\pgfpointadd{\noexpand\centerpoint}% - {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorradius}}% - }% - \expandafter\xdef\csname pgf@anchor@regular polygon@side\space\the\c@pgf@counta\endcsname{% - \noexpand\calculateradii% - \noexpand\pgfmathsubtract@{\the\c@pgf@counta}{1}% - \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{\noexpand\anglestep}% - \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% - \noexpand\let\noexpand\firstangle\noexpand\pgfmathresult% - \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\anglestep}% - \noexpand\let\noexpand\secondangle\noexpand\pgfmathresult% - \noexpand\pgfpointlineattime{0.5}% - {\noexpand\pgfpointadd{\noexpand\centerpoint}% - {\noexpand\pgfqpointpolar{\noexpand\firstangle}{\noexpand\anchorradius}}}% - {\noexpand\pgfpointadd{\noexpand\centerpoint}% - {\noexpand\pgfqpointpolar{\noexpand\secondangle}{\noexpand\anchorradius}}}% - }% - }{\c@pgf@counta0\relax}% - \advance\c@pgf@counta-1\relax% - \repeatpgfmathloop% - }% -} +\pgfdeclareshape{regular polygon}{% + \savedmacro\sides{% + \pgfmathtruncatemacro\sides{\pgfkeysvalueof{/pgf/regular polygon sides}}% + }% + \savedmacro\anglestep{% + \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/regular polygon sides}}% + \let\anglestep\pgfmathresult% + }% + \savedmacro\calculateradii{% + % + % Get the node dimensions. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + \ifdim\pgf@y>\pgf@x% + \pgf@x\pgf@y% + \fi% + % + % Calculate i, the incircle radius + % + \pgf@x1.41421\pgf@x% + % + % Calculate r, the polygon radius + % + % r = i / cos(360 / s / 2) + % + % (s = polygon sides) + % + \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/regular polygon sides}}% + \pgfmathsec@{\pgfmathresult}% + \pgf@x\pgfmathresult\pgf@x% + % + % Accommodate the minimum width/height. + % + \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}% + \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@ya>\pgf@xa% + \pgf@xa\pgf@ya% + \fi% + \ifdim\pgf@x<.5\pgf@xa% + \pgf@x.5\pgf@xa% + \fi% + \edef\radius{\the\pgf@x}% + % + % Now calculate the anchor radius from the outer sep. + % + \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@ya>\pgf@xa% + \pgf@xa\pgf@ya% + \fi + % + % Take into account the miter length. + % + % m = o / sin (90 - (360 / s / 2)) + % + % (o = outer sep, s = sides) + % + \pgfmathdivide{180}{\pgfkeysvalueof{/pgf/regular polygon sides}}% + \pgfmathsubtract@{90}{\pgfmathresult}% + \pgfmathcosec@{\pgfmathresult}% + \advance\pgf@x\pgfmathresult\pgf@xa% + \edef\anchorradius{\the\pgf@x}% + % + % Save both radii. + % + \addtosavedmacro{\radius}% + \addtosavedmacro{\anchorradius}% + }% + \savedmacro\startangle{% + \pgfmathdivide{360}{\pgfkeysvalueof{/pgf/regular polygon sides}}% + \let\anglestep\pgfmathresult% + \pgfmathtruncatemacro\sides{\pgfkeysvalueof{/pgf/regular polygon sides}}% + \expandafter\ifodd\sides\relax% + \edef\pgfmathresult{90}% + \else% + \pgfmathdivide@{\anglestep}{2}% + \pgfmathsubtract@{90}{\pgfmathresult}% + \fi% + \pgfmathadd{\pgfmathresult}{\pgfkeysvalueof{/pgf/shape border rotate}}% + \let\startangle\pgfmathresult% + }% + % + % Saved anchors. + % + \savedanchor{\centerpoint}{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor{\midpoint}{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + % + % Other anchors. + % + \anchor{center}{\centerpoint}% + \anchor{mid}{\midpoint}% + \anchor{base}{\centerpoint\pgf@y=0pt}% + \anchor{north}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{0pt}{\anchorradius}}}% + \anchor{south}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{0pt}{-\anchorradius}}}% + \anchor{east}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{0pt}}}% + \anchor{west}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{0pt}}}% + \anchor{north east}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{\anchorradius}}}% + \anchor{north west}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{\anchorradius}}}% + \anchor{south east}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{\anchorradius}{-\anchorradius}}}% + \anchor{south west}{% + \calculateradii% + \csname pgf@anchor@regular polygon@border\endcsname{\pgfqpoint{-\anchorradius}{-\anchorradius}}}% + % + % Background path. + % + \backgroundpath{% + \calculateradii% + \pgfpathmoveto{% + \pgfpointadd{\centerpoint}{\pgfqpointpolar{\startangle}{\radius}}% + }% + \let\angle\startangle% + \pgfmathloop% + \ifnum\pgfmathcounter=\sides\relax% + \pgfpathclose% + \else% + \pgfmathadd@{\angle}{\anglestep}% + \let\angle\pgfmathresult% + \pgfpathlineto{% + \pgfpointadd{\centerpoint}{\pgfqpointpolar{\angle}{\radius}}% + }% + \repeatpgfmathloop% + }% + \anchorborder{% + % + % Save x and y. + % + \edef\externalx{\the\pgf@x}% + \edef\externaly{\the\pgf@y}% + % + % Adjust the location of the external + % point relative to \centerpoint. + % + \centerpoint% + \pgf@xa\externalx\relax% + \pgf@ya\externaly\relax% + \advance\pgf@xa\pgf@x% + \advance\pgf@ya\pgf@y% + \edef\externalx{\the\pgf@xa}% + \edef\externaly{\the\pgf@ya}% + % + % Get the angle of the external point to the \centerpoint. + % + \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% + % + % Locate the appropriate sides on the polygon border... + % + \pgfmathsubtract@{\pgfmathresult}{\startangle}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \pgfmathdivide@{\pgfmathresult}{\anglestep}% + \pgfmathfloor@{\pgfmathresult}% + \pgfmathmultiply@{\pgfmathresult}{\anglestep}% + \pgfmathadd@{\pgfmathresult}{\startangle}% + \let\firstangle\pgfmathresult% + \pgfmathadd@{\pgfmathresult}{\anglestep}% + \let\secondangle\pgfmathresult% + \calculateradii% + % + % ...and thus, the point on the polygon border. + % + \pgfpointintersectionoflines{\centerpoint}{\pgfpoint{+\externalx}{+\externaly}}% + {% + \pgfpointadd{\centerpoint}% + {\pgfqpointpolar{+\firstangle}{+\anchorradius}}% + }% + {% + \pgfpointadd{\centerpoint}% + {\pgfqpointpolar{+\secondangle}{+\anchorradius}}% + }% + }% + % + % More hackery for when the rectangular polygon is positioned using + % a `corner <n+1>' or `side <n+1>' anchor, where n is the maximum + % number of sides of any previously drawn regular polygon. + % + \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@regular polygon\endcsname{% + \c@pgf@counta\sides\relax% + \pgfmathloop% + \ifnum\c@pgf@counta>0\relax% + \pgfutil@ifundefined{pgf@anchor@regular polygon@corner\space\the\c@pgf@counta}{% + % + % ...(manually \xdef as \gdef is normally used by \anchor)... + % + \expandafter\xdef\csname pgf@anchor@regular polygon@corner\space\the\c@pgf@counta\endcsname{% + \noexpand\calculateradii% + \noexpand\pgfmathsubtract@{\the\c@pgf@counta}{1}% + \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{\noexpand\anglestep}% + \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% + \noexpand\let\noexpand\angle\noexpand\pgfmathresult% + \noexpand\pgfpointadd{\noexpand\centerpoint}% + {\noexpand\pgfqpointpolar{\noexpand\angle}{\noexpand\anchorradius}}% + }% + \expandafter\xdef\csname pgf@anchor@regular polygon@side\space\the\c@pgf@counta\endcsname{% + \noexpand\calculateradii% + \noexpand\pgfmathsubtract@{\the\c@pgf@counta}{1}% + \noexpand\pgfmathmultiply@{\noexpand\pgfmathresult}{\noexpand\anglestep}% + \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\startangle}% + \noexpand\let\noexpand\firstangle\noexpand\pgfmathresult% + \noexpand\pgfmathadd@{\noexpand\pgfmathresult}{\noexpand\anglestep}% + \noexpand\let\noexpand\secondangle\noexpand\pgfmathresult% + \noexpand\pgfpointlineattime{0.5}% + {\noexpand\pgfpointadd{\noexpand\centerpoint}% + {\noexpand\pgfqpointpolar{\noexpand\firstangle}{\noexpand\anchorradius}}}% + {\noexpand\pgfpointadd{\noexpand\centerpoint}% + {\noexpand\pgfqpointpolar{\noexpand\secondangle}{\noexpand\anchorradius}}}% + }% + }{\c@pgf@counta0\relax}% + \advance\c@pgf@counta-1\relax% + \repeatpgfmathloop% + }% +}% @@ -930,15 +928,15 @@ % /pgf/trapezium right angle : angle of the right side. \pgfkeys{/pgf/.cd, - trapezium left angle/.initial=60, - trapezium right angle/.initial=60, - trapezium angle/.style={ - /pgf/trapezium left angle=#1, - /pgf/trapezium right angle=#1 - },% - trapezium stretches/.is if=pgf@lib@sh@trapeziumstretches,% - trapezium stretches body/.is if=pgf@lib@sh@trapeziumstretchesbody% -} + trapezium left angle/.initial=60, + trapezium right angle/.initial=60, + trapezium angle/.style={ + /pgf/trapezium left angle=#1, + /pgf/trapezium right angle=#1 + },% + trapezium stretches/.is if=pgf@lib@sh@trapeziumstretches,% + trapezium stretches body/.is if=pgf@lib@sh@trapeziumstretchesbody,% +}% \newif\ifpgf@lib@sh@trapeziumstretchesbody \newif\ifpgf@lib@sh@trapeziumstretches @@ -946,1394 +944,1394 @@ % Shape trapezium. % -\pgfdeclareshape{trapezium}{ - \savedmacro\installtrapeziumparameters{% - % - % Get the node dimensions. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - \ifpgfshapeborderusesincircle% - % - % Get the rotation (no rounding). - % - \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% - % - % Use the radius of the incircle if required... - % - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \pgf@x1.41421\pgf@x% - \pgf@y\pgf@x% - \else% - % - % Get the rotation (with rounding). - % - \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% - \afterassignment\pgfmath@gobbletilpgfmath@% - \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% - \advance\c@pgf@counta45\relax% - \divide\c@pgf@counta90\relax% - \multiply\c@pgf@counta90\relax% - \ifnum\c@pgf@counta<0\relax% - \advance\c@pgf@counta360\relax% - \fi% - \edef\rotate{\the\c@pgf@counta}% - % - % Calculate the width and height of the node - % contents, according to any border rotation. - % - \ifnum\c@pgf@counta=90\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \else% - \ifnum\c@pgf@counta=270\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \fi% - \fi% - \fi% - \pgfmathmod{\pgfkeysvalueof{/pgf/trapezium left angle}}{360}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\leftangle\pgfmathresult% - \ifdim\leftangle pt=0pt\relax% - \def\pgfmathresult{0}% - \else% - \pgfmathcot@{\leftangle}% - \fi% - \pgf@xa2\pgf@y% - \pgf@xa\pgfmathresult\pgf@xa% - \pgfmathmod{\pgfkeysvalueof{/pgf/trapezium right angle}}{360}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\rightangle\pgfmathresult% - \ifdim\rightangle pt=0pt\relax% - \def\pgfmathresult{0}% - \else% - \pgfmathcot@{\rightangle}% - \fi% - \pgf@xb2\pgf@y% - \pgf@xb\pgfmathresult\pgf@xb% - % - % Take into account minimum height and width. - % - \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@y<.5\pgf@ya% - \ifpgf@lib@sh@trapeziumstretches% - \pgf@y.5\pgf@ya% - \else% - \ifpgf@lib@sh@trapeziumstretchesbody% - \pgf@y.5\pgf@ya% - \else% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@y}}% - \pgf@yb.5\pgf@ya% - \pgf@yb\pgfmathresult\pgf@yb% - \pgf@y.5\pgf@ya% - \pgf@x\pgfmath@tonumber{\pgf@yb}\pgf@x% - \pgf@xa\pgfmath@tonumber{\pgf@yb}\pgf@xa% - \pgf@xb\pgfmath@tonumber{\pgf@yb}\pgf@xb% - \fi% - \fi% - \fi% - \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum width}}% - \pgf@xc2\pgf@x% - \ifdim\pgf@xa<0pt\relax% - \advance\pgf@xc-\pgf@xa% - \else% - \advance\pgf@xc\pgf@xa% - \fi% - \ifdim\pgf@xb<0pt\relax% - \advance\pgf@xc-\pgf@xb% - \else% - \advance\pgf@xc\pgf@xb% - \fi% - \ifdim\pgf@xc<\pgf@ya% - \ifpgf@lib@sh@trapeziumstretchesbody% - \pgf@xc-\pgf@xc% - \advance\pgf@xc\pgf@ya% - \advance\pgf@x.5\pgf@xc% - \else% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xc}}% - \pgf@ya\pgfmathresult\pgf@ya% - \pgf@x\pgfmath@tonumber{\pgf@ya}\pgf@x% - \pgf@xa\pgfmath@tonumber{\pgf@ya}\pgf@xa% - \pgf@xb\pgfmath@tonumber{\pgf@ya}\pgf@xb% - \ifpgf@lib@sh@trapeziumstretches% - \else% - \pgf@y\pgfmath@tonumber{\pgf@ya}\pgf@y% - \fi% - \fi% - \fi% - \edef\halfheight{\the\pgf@y}% - \edef\halfwidth{\the\pgf@x}% - \edef\leftextension{\the\pgf@xa}% - \edef\rightextension{\the\pgf@xb}% - \pgf@xc2\pgf@x% - % - % Take the larger of the outer sep. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@y>\pgf@x% - \pgf@x\pgf@y% - \fi% - \edef\outersep{\the\pgf@x}% - % - % The \externalradius is a length that is - % guarenteed to produce a point outside the trapezium. - % - \advance\pgf@xc2.0\pgf@x% - \pgf@yc\halfheight\relax% - \multiply\pgf@yc2\relax% - \advance\pgf@yc2.0\pgf@x% - \ifdim\pgf@xc<\pgf@yc% - \edef\externalradius{\the\pgf@yc}% - \else% - \edef\externalradius{\the\pgf@xc}% - \fi% - % - % Calculate the centre base and mid poins of the node. - % - \pgfextract@process\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \pgfextract@process\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \pgfextract@process\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - % - % Calculate each point on the trapezium (without rotation). - % - \pgfextract@process\lowerleftpoint{% - \centerpoint% - \advance\pgf@x-\halfwidth\relax% - \ifdim\leftextension>0pt\relax% - \advance\pgf@x-\leftextension\relax% - \fi% - \advance\pgf@y-\halfheight\relax% - }% - \pgfextract@process\upperleftpoint{% - \centerpoint% - \advance\pgf@x-\halfwidth\relax% - \ifdim\leftextension<0pt\relax% - \advance\pgf@x\leftextension\relax% - \fi% - \advance\pgf@y\halfheight\relax% - }% - \pgfextract@process\upperrightpoint{% - \centerpoint% - \advance\pgf@x\halfwidth\relax% - \ifdim\rightextension<0pt\relax% - \advance\pgf@x-\rightextension\relax% - \fi% - \advance\pgf@y\halfheight\relax% - }% - \pgfextract@process\lowerrightpoint{% - \centerpoint% - \advance\pgf@x\halfwidth\relax% - \ifdim\rightextension>0pt\relax% - \advance\pgf@x\rightextension\relax% - \fi% - \advance\pgf@y-\halfheight\relax% - }% - % - % Now calculate the adjustment for the miter length at each corner - % of the trapezium. This ensures more accurate anchor positioning - % when the line width is particularly thick. - % - \pgfextract@process\lowerleftmiter{% - \pgfmathanglebetweenlines{\lowerleftpoint}{\lowerrightpoint}{\lowerleftpoint}{\upperleftpoint}% - \pgfmathmultiply@{\pgfmathresult}{.5}% - \pgfmathtan@{\pgfmathresult}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@x-\outersep\relax% - \pgf@x\pgfmathresult\pgf@x% - \pgf@y-\outersep\relax% - }% - \pgfextract@process\upperleftmiter{% - \pgfmathanglebetweenlines{\upperleftpoint}{\lowerleftpoint}{\upperleftpoint}{\upperrightpoint}% - \pgfmathmultiply@{\pgfmathresult}{.5}% - \pgfmathtan@{\pgfmathresult}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@x-\outersep\relax% - \pgf@x\pgfmathresult\pgf@x% - \pgf@y\outersep\relax% - }% - \pgfextract@process\upperrightmiter{% - \pgfmathanglebetweenlines{\upperrightpoint}{\upperleftpoint}{\upperrightpoint}{\lowerrightpoint}% - \pgfmathmultiply@{\pgfmathresult}{.5}% - \pgfmathtan@{\pgfmathresult}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@x\outersep\relax% - \pgf@x\pgfmathresult\pgf@x% - \pgf@y\outersep\relax% - }% - \pgfextract@process\lowerrightmiter{% - \pgfmathanglebetweenlines{\lowerrightpoint}{\upperrightpoint}{\lowerrightpoint}{\lowerleftpoint}% - \pgfmathmultiply@{\pgfmathresult}{.5}% - \pgfmathtan@{\pgfmathresult}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@x\outersep\relax% - \pgf@x\pgfmathresult\pgf@x% - \pgf@y-\outersep\relax% - }% - % - % Now calculate the corners for determining anchor border - % points, by adding the adjustment for the miter length. - % - \pgfextract@process\lowerleftborderpoint{% - \pgfpointadd{\lowerleftpoint}{\lowerleftmiter}% - }% - \pgfextract@process\upperleftborderpoint{% - \pgfpointadd{\upperleftpoint}{\upperleftmiter}% - }% - \pgfextract@process\upperrightborderpoint{% - \pgfpointadd{\upperrightpoint}{\upperrightmiter}% - }% - \pgfextract@process\lowerrightborderpoint{% - \pgfpointadd{\lowerrightpoint}{\lowerrightmiter}% - }% - % - % Calulate the angle from the centerpoint to each corner. - % Rotation is not important here (see \anchorborder code). - % - \pgfmathanglebetweenpoints{\centerpoint}{\lowerleftborderpoint}% - \let\angletolowerleft\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\upperleftborderpoint}% - \let\angletoupperleft\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\upperrightborderpoint}% - \let\angletoupperright\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\lowerrightborderpoint}% - \let\angletolowerright\pgfmathresult% - % - % Do the same for the *inversely rotated* base point... - % - \pgfextract@process\rotatedbasepoint{% - \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lowerleftborderpoint}% - \let\baseangletolowerleft\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\upperleftborderpoint}% - \let\baseangletoupperleft\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\upperrightborderpoint}% - \let\baseangletoupperright\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lowerrightborderpoint}% - \let\baseangletolowerright\pgfmathresult% - % - % And the *inversely rotated* mid point... - % - \pgfextract@process\rotatedmidpoint{% - \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lowerleftborderpoint}% - \let\midangletolowerleft\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\upperleftborderpoint}% - \let\midangletoupperleft\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\upperrightborderpoint}% - \let\midangletoupperright\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lowerrightborderpoint}% - \let\midangletolowerright\pgfmathresult% - % - % Now rotate the border points around the centerpoint... - % - \pgfextract@process\lowerleftborderpoint{% - \pgfmathrotatepointaround% - {\lowerleftborderpoint}% - {\centerpoint}% - {\rotate}% - }% - \pgfextract@process\upperleftborderpoint{% - \pgfmathrotatepointaround% - {\upperleftborderpoint}% - {\centerpoint}% - {\rotate}% - }% - \pgfextract@process\upperrightborderpoint{% - \pgfmathrotatepointaround% - {\upperrightborderpoint}% - {\centerpoint}% - {\rotate}% - }% - \pgfextract@process\lowerrightborderpoint{% - \pgfmathrotatepointaround% - {\lowerrightborderpoint}% - {\centerpoint}% - {\rotate}% - }% - % - % ...and the points for drawing the border (i.e. no outer sep). - % - \pgfextract@process\lowerleftpoint{% - \pgfmathrotatepointaround{\lowerleftpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\upperleftpoint{% - \pgfmathrotatepointaround{\upperleftpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\upperrightpoint{% - \pgfmathrotatepointaround{\upperrightpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\lowerrightpoint{% - \pgfmathrotatepointaround{\lowerrightpoint}{\centerpoint}{\rotate}% - }% - % - % And finally, save all the relevant stuff. - % - \addtosavedmacro{\lowerleftpoint}% - \addtosavedmacro{\upperleftpoint}% - \addtosavedmacro{\upperrightpoint}% - \addtosavedmacro{\lowerrightpoint}% - % - \addtosavedmacro{\lowerleftborderpoint}% - \addtosavedmacro{\upperleftborderpoint}% - \addtosavedmacro{\upperrightborderpoint}% - \addtosavedmacro{\lowerrightborderpoint}% - % - \addtosavedmacro{\angletolowerleft}% - \addtosavedmacro{\angletoupperleft}% - \addtosavedmacro{\angletoupperright}% - \addtosavedmacro{\angletolowerright}% - % - \addtosavedmacro{\baseangletolowerleft}% - \addtosavedmacro{\baseangletoupperleft}% - \addtosavedmacro{\baseangletoupperright}% - \addtosavedmacro{\baseangletolowerright}% - % - \addtosavedmacro{\midangletolowerleft}% - \addtosavedmacro{\midangletoupperleft}% - \addtosavedmacro{\midangletoupperright}% - \addtosavedmacro{\midangletolowerright}% - % - \addtosavedmacro{\rotate}% - \addtosavedmacro{\externalradius}% - } - \savedanchor\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \savedanchor\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - \anchor{center}{\centerpoint}% - \anchor{base}{\basepoint}% - \anchor{base east}{% - \installtrapeziumparameters% - \let\pgf@trapeziumanchorborderreferencepoint\basepoint% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - } - \anchor{base west}{% - \installtrapeziumparameters% - \let\pgf@trapeziumanchorborderreferencepoint\basepoint% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - }% - \anchor{mid}{\midpoint}% - \anchor{mid east}{% - \installtrapeziumparameters% - \let\pgf@trapeziumanchorborderreferencepoint\midpoint% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - } - \anchor{mid west}{% - \installtrapeziumparameters% - \let\pgf@trapeziumanchorborderreferencepoint\midpoint% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - }% - \anchor{north}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{0pt}{\externalradius}}% - } - \anchor{south}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}% - } - \anchor{east}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - } - \anchor{west}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - } - \anchor{north east}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}% - } - \anchor{south west}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}% - } - \anchor{south east}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}% - } - \anchor{north west}{% - \installtrapeziumparameters% - \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}% - } - \anchor{bottom left corner}{% - \installtrapeziumparameters% - \lowerleftborderpoint% - }% - \anchor{top left corner}{% - \installtrapeziumparameters% - \upperleftborderpoint% - }% - \anchor{top right corner}{% - \installtrapeziumparameters% - \upperrightborderpoint% - }% - \anchor{bottom right corner}{% - \installtrapeziumparameters% - \lowerrightborderpoint% - }% - \anchor{left side}{% - \installtrapeziumparameters% - \pgfpointlineattime{0.5}{\lowerleftborderpoint}{\upperleftborderpoint}% - }% - \anchor{right side}{% - \installtrapeziumparameters% - \pgfpointlineattime{0.5}{\lowerrightborderpoint}{\upperrightborderpoint}% - }% - \anchor{top side}{% - \installtrapeziumparameters% - \pgfpointlineattime{0.5}{\upperleftborderpoint}{\upperrightborderpoint}% - }% - \anchor{bottom side}{% - \installtrapeziumparameters% - \pgfpointlineattime{0.5}{\lowerleftborderpoint}{\lowerrightborderpoint}% - }% - \backgroundpath{% - \installtrapeziumparameters% - \pgfpathmoveto{\lowerleftpoint}% - \pgfpathlineto{\upperleftpoint}% - \pgfpathlineto{\upperrightpoint}% - \pgfpathlineto{\lowerrightpoint}% - \pgfpathclose% - } - \anchorborder{% - % - % Save x and y. - % - \edef\externalx{\the\pgf@x}% - \edef\externaly{\the\pgf@y}% - % - % This allows anchors base east, base west, mid east and mid west, - % to redefine the `center' of the node to correctly calculate the - % border points. - % - \pgfutil@ifundefined{pgf@trapeziumanchorborderreferencepoint}% - {\let\referencepoint\centerpoint}% - {\let\referencepoint\pgf@trapeziumanchorborderreferencepoint}% - % - % Adjust the location of the external - % point relative to the reference point. - % - \referencepoint% - \pgf@xa\externalx\relax% - \pgf@ya\externaly\relax% - \advance\pgf@xa\pgf@x% - \advance\pgf@ya\pgf@y% - \edef\externalx{\the\pgf@xa}% - \edef\externaly{\the\pgf@ya}% - % - % Install the required points and angles. - % - \installtrapeziumparameters% - % - % Get the angle of the external point to the \referencepoint. - % - \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - % - % *Subtract* the rotation from the external angle. This is - % why the border point angles do not neeed to be rotated. - % - \pgfmathsubtract@{\pgfmathresult}{\rotate}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - % - % Get the relevant angles for the reference point. - % - \let\externalangle\pgfmathresult% - \ifx\referencepoint\basepoint% - \let\angletoupperright\baseangletoupperright% - \let\angletoupperleft\baseangletoupperleft% - \let\angletolowerright\baseangletolowerright% - \let\angletolowerleft\baseangletolowerleft% - \else% - \ifx\referencepoint\midpoint% - \let\angletoupperright\midangletoupperright% - \let\angletoupperleft\midangletoupperleft% - \let\angletolowerright\midangletolowerright% - \let\angletolowerleft\midangletolowerleft% - \fi\fi% - % - % Find the line on the border... - % - \ifdim\externalangle pt<\angletoupperright pt\relax% - \let\firstpoint\upperrightborderpoint% - \let\secondpoint\lowerrightborderpoint% - \else% - \ifdim\externalangle pt<\angletoupperleft pt\relax% - \let\firstpoint\upperleftborderpoint% - \let\secondpoint\upperrightborderpoint% - \else% - \ifdim\externalangle pt<\angletolowerleft pt\relax% - \let\firstpoint\upperleftborderpoint% - \let\secondpoint\lowerleftborderpoint% - \else% - \ifdim\externalangle pt<\angletolowerright pt\relax% - \let\firstpoint\lowerleftborderpoint% - \let\secondpoint\lowerrightborderpoint% - \else% - \let\firstpoint\upperrightborderpoint% - \let\secondpoint\lowerrightborderpoint% - \fi% - \fi% - \fi% - \fi% - % - % ...and thus the point on the border. - % - \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - {\firstpoint}{\secondpoint}% - }% -} +\pgfdeclareshape{trapezium}{% + \savedmacro\installtrapeziumparameters{% + % + % Get the node dimensions. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + \ifpgfshapeborderusesincircle% + % + % Get the rotation (no rounding). + % + \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% + % + % Use the radius of the incircle if required... + % + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \pgf@x1.41421\pgf@x% + \pgf@y\pgf@x% + \else% + % + % Get the rotation (with rounding). + % + \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% + \afterassignment\pgfmath@gobbletilpgfmath@% + \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% + \advance\c@pgf@counta45\relax% + \divide\c@pgf@counta90\relax% + \multiply\c@pgf@counta90\relax% + \ifnum\c@pgf@counta<0\relax% + \advance\c@pgf@counta360\relax% + \fi% + \edef\rotate{\the\c@pgf@counta}% + % + % Calculate the width and height of the node + % contents, according to any border rotation. + % + \ifnum\c@pgf@counta=90\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \else% + \ifnum\c@pgf@counta=270\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \fi% + \fi% + \fi% + \pgfmathmod{\pgfkeysvalueof{/pgf/trapezium left angle}}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\leftangle\pgfmathresult% + \ifdim\leftangle pt=0pt\relax% + \def\pgfmathresult{0}% + \else% + \pgfmathcot@{\leftangle}% + \fi% + \pgf@xa2\pgf@y% + \pgf@xa\pgfmathresult\pgf@xa% + \pgfmathmod{\pgfkeysvalueof{/pgf/trapezium right angle}}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\rightangle\pgfmathresult% + \ifdim\rightangle pt=0pt\relax% + \def\pgfmathresult{0}% + \else% + \pgfmathcot@{\rightangle}% + \fi% + \pgf@xb2\pgf@y% + \pgf@xb\pgfmathresult\pgf@xb% + % + % Take into account minimum height and width. + % + \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@y<.5\pgf@ya% + \ifpgf@lib@sh@trapeziumstretches% + \pgf@y.5\pgf@ya% + \else% + \ifpgf@lib@sh@trapeziumstretchesbody% + \pgf@y.5\pgf@ya% + \else% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@y}}% + \pgf@yb.5\pgf@ya% + \pgf@yb\pgfmathresult\pgf@yb% + \pgf@y.5\pgf@ya% + \pgf@x\pgfmath@tonumber{\pgf@yb}\pgf@x% + \pgf@xa\pgfmath@tonumber{\pgf@yb}\pgf@xa% + \pgf@xb\pgfmath@tonumber{\pgf@yb}\pgf@xb% + \fi% + \fi% + \fi% + \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum width}}% + \pgf@xc2\pgf@x% + \ifdim\pgf@xa<0pt\relax% + \advance\pgf@xc-\pgf@xa% + \else% + \advance\pgf@xc\pgf@xa% + \fi% + \ifdim\pgf@xb<0pt\relax% + \advance\pgf@xc-\pgf@xb% + \else% + \advance\pgf@xc\pgf@xb% + \fi% + \ifdim\pgf@xc<\pgf@ya% + \ifpgf@lib@sh@trapeziumstretchesbody% + \pgf@xc-\pgf@xc% + \advance\pgf@xc\pgf@ya% + \advance\pgf@x.5\pgf@xc% + \else% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xc}}% + \pgf@ya\pgfmathresult\pgf@ya% + \pgf@x\pgfmath@tonumber{\pgf@ya}\pgf@x% + \pgf@xa\pgfmath@tonumber{\pgf@ya}\pgf@xa% + \pgf@xb\pgfmath@tonumber{\pgf@ya}\pgf@xb% + \ifpgf@lib@sh@trapeziumstretches% + \else% + \pgf@y\pgfmath@tonumber{\pgf@ya}\pgf@y% + \fi% + \fi% + \fi% + \edef\halfheight{\the\pgf@y}% + \edef\halfwidth{\the\pgf@x}% + \edef\leftextension{\the\pgf@xa}% + \edef\rightextension{\the\pgf@xb}% + \pgf@xc2\pgf@x% + % + % Take the larger of the outer sep. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@y>\pgf@x% + \pgf@x\pgf@y% + \fi% + \edef\outersep{\the\pgf@x}% + % + % The \externalradius is a length that is + % guarenteed to produce a point outside the trapezium. + % + \advance\pgf@xc2.0\pgf@x% + \pgf@yc\halfheight\relax% + \multiply\pgf@yc2\relax% + \advance\pgf@yc2.0\pgf@x% + \ifdim\pgf@xc<\pgf@yc% + \edef\externalradius{\the\pgf@yc}% + \else% + \edef\externalradius{\the\pgf@xc}% + \fi% + % + % Calculate the centre base and mid poins of the node. + % + \pgfextract@process\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \pgfextract@process\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \pgfextract@process\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + % + % Calculate each point on the trapezium (without rotation). + % + \pgfextract@process\lowerleftpoint{% + \centerpoint% + \advance\pgf@x-\halfwidth\relax% + \ifdim\leftextension>0pt\relax% + \advance\pgf@x-\leftextension\relax% + \fi% + \advance\pgf@y-\halfheight\relax% + }% + \pgfextract@process\upperleftpoint{% + \centerpoint% + \advance\pgf@x-\halfwidth\relax% + \ifdim\leftextension<0pt\relax% + \advance\pgf@x\leftextension\relax% + \fi% + \advance\pgf@y\halfheight\relax% + }% + \pgfextract@process\upperrightpoint{% + \centerpoint% + \advance\pgf@x\halfwidth\relax% + \ifdim\rightextension<0pt\relax% + \advance\pgf@x-\rightextension\relax% + \fi% + \advance\pgf@y\halfheight\relax% + }% + \pgfextract@process\lowerrightpoint{% + \centerpoint% + \advance\pgf@x\halfwidth\relax% + \ifdim\rightextension>0pt\relax% + \advance\pgf@x\rightextension\relax% + \fi% + \advance\pgf@y-\halfheight\relax% + }% + % + % Now calculate the adjustment for the miter length at each corner + % of the trapezium. This ensures more accurate anchor positioning + % when the line width is particularly thick. + % + \pgfextract@process\lowerleftmiter{% + \pgfmathanglebetweenlines{\lowerleftpoint}{\lowerrightpoint}{\lowerleftpoint}{\upperleftpoint}% + \pgfmathmultiply@{\pgfmathresult}{.5}% + \pgfmathtan@{\pgfmathresult}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@x-\outersep\relax% + \pgf@x\pgfmathresult\pgf@x% + \pgf@y-\outersep\relax% + }% + \pgfextract@process\upperleftmiter{% + \pgfmathanglebetweenlines{\upperleftpoint}{\lowerleftpoint}{\upperleftpoint}{\upperrightpoint}% + \pgfmathmultiply@{\pgfmathresult}{.5}% + \pgfmathtan@{\pgfmathresult}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@x-\outersep\relax% + \pgf@x\pgfmathresult\pgf@x% + \pgf@y\outersep\relax% + }% + \pgfextract@process\upperrightmiter{% + \pgfmathanglebetweenlines{\upperrightpoint}{\upperleftpoint}{\upperrightpoint}{\lowerrightpoint}% + \pgfmathmultiply@{\pgfmathresult}{.5}% + \pgfmathtan@{\pgfmathresult}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@x\outersep\relax% + \pgf@x\pgfmathresult\pgf@x% + \pgf@y\outersep\relax% + }% + \pgfextract@process\lowerrightmiter{% + \pgfmathanglebetweenlines{\lowerrightpoint}{\upperrightpoint}{\lowerrightpoint}{\lowerleftpoint}% + \pgfmathmultiply@{\pgfmathresult}{.5}% + \pgfmathtan@{\pgfmathresult}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@x\outersep\relax% + \pgf@x\pgfmathresult\pgf@x% + \pgf@y-\outersep\relax% + }% + % + % Now calculate the corners for determining anchor border + % points, by adding the adjustment for the miter length. + % + \pgfextract@process\lowerleftborderpoint{% + \pgfpointadd{\lowerleftpoint}{\lowerleftmiter}% + }% + \pgfextract@process\upperleftborderpoint{% + \pgfpointadd{\upperleftpoint}{\upperleftmiter}% + }% + \pgfextract@process\upperrightborderpoint{% + \pgfpointadd{\upperrightpoint}{\upperrightmiter}% + }% + \pgfextract@process\lowerrightborderpoint{% + \pgfpointadd{\lowerrightpoint}{\lowerrightmiter}% + }% + % + % Calculate the angle from the centerpoint to each corner. + % Rotation is not important here (see \anchorborder code). + % + \pgfmathanglebetweenpoints{\centerpoint}{\lowerleftborderpoint}% + \let\angletolowerleft\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\upperleftborderpoint}% + \let\angletoupperleft\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\upperrightborderpoint}% + \let\angletoupperright\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\lowerrightborderpoint}% + \let\angletolowerright\pgfmathresult% + % + % Do the same for the *inversely rotated* base point... + % + \pgfextract@process\rotatedbasepoint{% + \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lowerleftborderpoint}% + \let\baseangletolowerleft\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\upperleftborderpoint}% + \let\baseangletoupperleft\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\upperrightborderpoint}% + \let\baseangletoupperright\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lowerrightborderpoint}% + \let\baseangletolowerright\pgfmathresult% + % + % And the *inversely rotated* mid point... + % + \pgfextract@process\rotatedmidpoint{% + \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lowerleftborderpoint}% + \let\midangletolowerleft\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\upperleftborderpoint}% + \let\midangletoupperleft\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\upperrightborderpoint}% + \let\midangletoupperright\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lowerrightborderpoint}% + \let\midangletolowerright\pgfmathresult% + % + % Now rotate the border points around the centerpoint... + % + \pgfextract@process\lowerleftborderpoint{% + \pgfmathrotatepointaround% + {\lowerleftborderpoint}% + {\centerpoint}% + {\rotate}% + }% + \pgfextract@process\upperleftborderpoint{% + \pgfmathrotatepointaround% + {\upperleftborderpoint}% + {\centerpoint}% + {\rotate}% + }% + \pgfextract@process\upperrightborderpoint{% + \pgfmathrotatepointaround% + {\upperrightborderpoint}% + {\centerpoint}% + {\rotate}% + }% + \pgfextract@process\lowerrightborderpoint{% + \pgfmathrotatepointaround% + {\lowerrightborderpoint}% + {\centerpoint}% + {\rotate}% + }% + % + % ...and the points for drawing the border (i.e. no outer sep). + % + \pgfextract@process\lowerleftpoint{% + \pgfmathrotatepointaround{\lowerleftpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\upperleftpoint{% + \pgfmathrotatepointaround{\upperleftpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\upperrightpoint{% + \pgfmathrotatepointaround{\upperrightpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\lowerrightpoint{% + \pgfmathrotatepointaround{\lowerrightpoint}{\centerpoint}{\rotate}% + }% + % + % And finally, save all the relevant stuff. + % + \addtosavedmacro{\lowerleftpoint}% + \addtosavedmacro{\upperleftpoint}% + \addtosavedmacro{\upperrightpoint}% + \addtosavedmacro{\lowerrightpoint}% + % + \addtosavedmacro{\lowerleftborderpoint}% + \addtosavedmacro{\upperleftborderpoint}% + \addtosavedmacro{\upperrightborderpoint}% + \addtosavedmacro{\lowerrightborderpoint}% + % + \addtosavedmacro{\angletolowerleft}% + \addtosavedmacro{\angletoupperleft}% + \addtosavedmacro{\angletoupperright}% + \addtosavedmacro{\angletolowerright}% + % + \addtosavedmacro{\baseangletolowerleft}% + \addtosavedmacro{\baseangletoupperleft}% + \addtosavedmacro{\baseangletoupperright}% + \addtosavedmacro{\baseangletolowerright}% + % + \addtosavedmacro{\midangletolowerleft}% + \addtosavedmacro{\midangletoupperleft}% + \addtosavedmacro{\midangletoupperright}% + \addtosavedmacro{\midangletolowerright}% + % + \addtosavedmacro{\rotate}% + \addtosavedmacro{\externalradius}% + }% + \savedanchor\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \savedanchor\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + \anchor{center}{\centerpoint}% + \anchor{base}{\basepoint}% + \anchor{base east}{% + \installtrapeziumparameters% + \let\pgf@trapeziumanchorborderreferencepoint\basepoint% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{base west}{% + \installtrapeziumparameters% + \let\pgf@trapeziumanchorborderreferencepoint\basepoint% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{mid}{\midpoint}% + \anchor{mid east}{% + \installtrapeziumparameters% + \let\pgf@trapeziumanchorborderreferencepoint\midpoint% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{mid west}{% + \installtrapeziumparameters% + \let\pgf@trapeziumanchorborderreferencepoint\midpoint% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{north}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{0pt}{\externalradius}}% + }% + \anchor{south}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}% + }% + \anchor{east}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{west}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{north east}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}% + }% + \anchor{south west}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}% + }% + \anchor{south east}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}% + }% + \anchor{north west}{% + \installtrapeziumparameters% + \csname pgf@anchor@trapezium@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}% + }% + \anchor{bottom left corner}{% + \installtrapeziumparameters% + \lowerleftborderpoint% + }% + \anchor{top left corner}{% + \installtrapeziumparameters% + \upperleftborderpoint% + }% + \anchor{top right corner}{% + \installtrapeziumparameters% + \upperrightborderpoint% + }% + \anchor{bottom right corner}{% + \installtrapeziumparameters% + \lowerrightborderpoint% + }% + \anchor{left side}{% + \installtrapeziumparameters% + \pgfpointlineattime{0.5}{\lowerleftborderpoint}{\upperleftborderpoint}% + }% + \anchor{right side}{% + \installtrapeziumparameters% + \pgfpointlineattime{0.5}{\lowerrightborderpoint}{\upperrightborderpoint}% + }% + \anchor{top side}{% + \installtrapeziumparameters% + \pgfpointlineattime{0.5}{\upperleftborderpoint}{\upperrightborderpoint}% + }% + \anchor{bottom side}{% + \installtrapeziumparameters% + \pgfpointlineattime{0.5}{\lowerleftborderpoint}{\lowerrightborderpoint}% + }% + \backgroundpath{% + \installtrapeziumparameters% + \pgfpathmoveto{\lowerleftpoint}% + \pgfpathlineto{\upperleftpoint}% + \pgfpathlineto{\upperrightpoint}% + \pgfpathlineto{\lowerrightpoint}% + \pgfpathclose% + }% + \anchorborder{% + % + % Save x and y. + % + \edef\externalx{\the\pgf@x}% + \edef\externaly{\the\pgf@y}% + % + % This allows anchors base east, base west, mid east and mid west, + % to redefine the `center' of the node to correctly calculate the + % border points. + % + \pgfutil@ifundefined{pgf@trapeziumanchorborderreferencepoint}% + {\let\referencepoint\centerpoint}% + {\let\referencepoint\pgf@trapeziumanchorborderreferencepoint}% + % + % Adjust the location of the external + % point relative to the reference point. + % + \referencepoint% + \pgf@xa\externalx\relax% + \pgf@ya\externaly\relax% + \advance\pgf@xa\pgf@x% + \advance\pgf@ya\pgf@y% + \edef\externalx{\the\pgf@xa}% + \edef\externaly{\the\pgf@ya}% + % + % Install the required points and angles. + % + \installtrapeziumparameters% + % + % Get the angle of the external point to the \referencepoint. + % + \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + % + % *Subtract* the rotation from the external angle. This is + % why the border point angles do not neeed to be rotated. + % + \pgfmathsubtract@{\pgfmathresult}{\rotate}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + % + % Get the relevant angles for the reference point. + % + \let\externalangle\pgfmathresult% + \ifx\referencepoint\basepoint% + \let\angletoupperright\baseangletoupperright% + \let\angletoupperleft\baseangletoupperleft% + \let\angletolowerright\baseangletolowerright% + \let\angletolowerleft\baseangletolowerleft% + \else% + \ifx\referencepoint\midpoint% + \let\angletoupperright\midangletoupperright% + \let\angletoupperleft\midangletoupperleft% + \let\angletolowerright\midangletolowerright% + \let\angletolowerleft\midangletolowerleft% + \fi\fi% + % + % Find the line on the border... + % + \ifdim\externalangle pt<\angletoupperright pt\relax% + \let\firstpoint\upperrightborderpoint% + \let\secondpoint\lowerrightborderpoint% + \else% + \ifdim\externalangle pt<\angletoupperleft pt\relax% + \let\firstpoint\upperleftborderpoint% + \let\secondpoint\upperrightborderpoint% + \else% + \ifdim\externalangle pt<\angletolowerleft pt\relax% + \let\firstpoint\upperleftborderpoint% + \let\secondpoint\lowerleftborderpoint% + \else% + \ifdim\externalangle pt<\angletolowerright pt\relax% + \let\firstpoint\lowerleftborderpoint% + \let\secondpoint\lowerrightborderpoint% + \else% + \let\firstpoint\upperrightborderpoint% + \let\secondpoint\lowerrightborderpoint% + \fi% + \fi% + \fi% + \fi% + % + % ...and thus the point on the border. + % + \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + {\firstpoint}{\secondpoint}% + }% +}% % Shape semicircle. % -\pgfdeclareshape{semicircle}{ - \savedmacro\installsemicircleparameters{% - % - % Get the larger of the outer sep. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \edef\outersep{\the\pgf@x}% - % - % Get the node dimensions. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x+.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y+.5\ht\pgfnodeparttextbox% - \advance\pgf@y+.5\dp\pgfnodeparttextbox% - % - % Use the radius of the incircle if required... - % - \ifpgfshapeborderusesincircle% - % - % Get the rotation (no rounding). - % - \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \pgf@x1.41421\pgf@x% - \edef\halfheight{\the\pgf@x}% - \advance\pgf@x\pgf@x% - \else% - % - % Get the rotation (with rounding). - % - \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% - \afterassignment\pgfmath@gobbletilpgfmath@% - \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% - \advance\c@pgf@counta45\relax% - \divide\c@pgf@counta90\relax% - \multiply\c@pgf@counta90\relax% - \ifnum\c@pgf@counta<0\relax% - \advance\c@pgf@counta360\relax% - \fi% - \edef\rotate{\the\c@pgf@counta}% - % - % Calculate the width and height of the node - % contents, according to any border rotation. - % - \ifnum\c@pgf@counta=90\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \else% - \ifnum\c@pgf@counta=270\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \fi% - \fi% - \advance\pgf@y\pgf@y% - \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}% - \pgf@x\pgfmathresult pt\relax% - \pgf@y.5\pgf@y% - \edef\halfheight{\the\pgf@y}% - \fi% - \edef\defaultradius{\the\pgf@x}% - % - % Take into account minimum height and width. - % - \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}% - \ifdim\pgf@x<.5\pgf@xa% - \pgf@x.5\pgf@xa% - \fi% - \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@x<\pgf@ya% - \pgf@x\pgf@ya% - \fi% - \edef\semicircleradius{\the\pgf@x}% - % - % Find the center/base/mid of the semi circle node. - % - \pgfextract@process\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y+-.5\dp\pgfnodeparttextbox% - }% - \pgfextract@process\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \pgfextract@process\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - \pgfextract@process\semicirclecenterpoint{% - \centerpoint% - \pgf@ya\semicircleradius\relax% - \advance\pgf@ya-\defaultradius\relax% - % - % The point is adjusted to make the node contents - % appear more centered if the node is enlarged to - % some minimum size. The factor .4 just seems OK. - % - \pgf@ya.4\pgf@ya% - \advance\pgf@y-\pgf@ya% - \pgf@ya\halfheight\relax% - \advance\pgf@y-\pgf@ya% - }% - % - % Add the outer sep to the radius here. - % - \pgf@x\semicircleradius\relax% - \advance\pgf@x\outersep\relax% - \edef\semicircleradius{\the\pgf@x}% - \pgfpointdiff{\centerpoint}{\semicirclecenterpoint}% - \ifdim\pgf@y<0pt\pgf@y-\pgf@y\fi% - \edef\centerpointdiff{\the\pgf@y}% - % - % Calculate the start and end points on the border. - % - \pgfextract@process\arcstartborder{% - \semicirclecenterpoint% - \advance\pgf@x\semicircleradius\relax% - }% - \pgfextract@process\arcendborder{% - \semicirclecenterpoint% - \advance\pgf@x-\semicircleradius\relax% - }% - % - % Calculate the start and end *corner* points on the border. - % This is needed to accommodate the outer sep. - % - \pgfextract@process\arcstartcorner{% - \arcstartborder% - \advance\pgf@y-\outersep\relax% - }% - \pgfextract@process\arcendcorner{% - \arcendborder% - \advance\pgf@y-\outersep\relax% - } - % - % Now calculate all the relevant angles. - % - % For the center point. - % - \pgfmathanglebetweenpoints{\centerpoint}{\arcstartborder}% - \let\angletoarcstartborder\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\arcendborder}% - \let\angletoarcendborder\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\arcstartcorner}% - \let\angletoarcstartcorner\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\arcendcorner}% - \let\angletoarcendcorner\pgfmathresult% - % - % For the basepoint (rotated about the center point). - % - \pgfextract@process\rotatedbasepoint{% - \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcstartborder}% - \let\baseangletoarcstartborder\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcendborder}% - \let\baseangletoarcendborder\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcstartcorner}% - \let\baseangletoarcstartcorner\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcendcorner}% - \let\baseangletoarcendcorner\pgfmathresult% - % - % For the midpoint (rotated about the center point). - % - \pgfextract@process\rotatedmidpoint{% - \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcstartborder}% - \let\midangletoarcstartborder\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcendborder}% - \let\midangletoarcendborder\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcstartcorner}% - \let\midangletoarcstartcorner\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcendcorner}% - \let\midangletoarcendcorner\pgfmathresult% - % - % Now, rotate the semicircle points around the centerpoint. - % - \pgfextract@process\semicirclecenterpoint{% - \pgfmathrotatepointaround{\semicirclecenterpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcstartborder{% - \pgfmathrotatepointaround{\arcstartborder}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcendborder{% - \pgfmathrotatepointaround{\arcendborder}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcstartcorner{% - \pgfmathrotatepointaround{\arcstartcorner}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcendcorner{% - \pgfmathrotatepointaround{\arcendcorner}{\centerpoint}{\rotate}% - }% - % - % Calculate the distance between the base point and the (rotated) semicircle center. - % - \pgfpointdiff{\basepoint}{\semicirclecenterpoint}% - \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}% - \edef\basesemicirclecenterdiff{\pgfmathresult pt}% - % - % Calculate the distance between the base point and the (rotated) semicircle center. - % - \pgfpointdiff{\midpoint}{\semicirclecenterpoint}% - \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}% - \edef\midsemicirclecenterdiff{\pgfmathresult pt}% - % - % And save all the stuff. - % - \addtosavedmacro{\rotate}% - \addtosavedmacro{\outersep}% - \addtosavedmacro{\semicircleradius}% - % - \addtosavedmacro{\arcstartborder}% - \addtosavedmacro{\arcendborder}% - \addtosavedmacro{\arcstartcorner}% - \addtosavedmacro{\arcendcorner}% - \addtosavedmacro{\semicirclecenterpoint}% - % - \addtosavedmacro{\angletoarcstartborder}% - \addtosavedmacro{\angletoarcendborder}% - \addtosavedmacro{\angletoarcstartcorner}% - \addtosavedmacro{\angletoarcendcorner}% - % - \addtosavedmacro{\centerpointdiff}% - \addtosavedmacro{\basesemicirclecenterdiff}% - \addtosavedmacro{\midsemicirclecenterdiff}% - % - \addtosavedmacro{\baseangletoarcstartborder}% - \addtosavedmacro{\baseangletoarcendborder}% - \addtosavedmacro{\baseangletoarcstartcorner}% - \addtosavedmacro{\baseangletoarcendcorner}% - % - \addtosavedmacro{\midangletoarcstartborder}% - \addtosavedmacro{\midangletoarcendborder}% - \addtosavedmacro{\midangletoarcstartcorner}% - \addtosavedmacro{\midangletoarcendcorner}% - } - \savedanchor{\centerpoint}{% - \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}% - \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}% - \pgfmathaddtolength\pgf@y{-.5\dp\pgfnodeparttextbox}% - } - \savedanchor{\basepoint}{% - \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}% - \pgf@y0pt\relax% - } - \savedanchor{\midpoint}{% - \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}% - \pgfmathsetlength\pgf@y{+.5ex}% - } - \anchor{center}{\centerpoint} - \anchor{base}{\basepoint} - \anchor{base west}{% - \installsemicircleparameters% - \let\pgf@semicirclereferencepoint\basepoint% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{-\semicircleradius}{0pt}}% - } - \anchor{base east}{% - \installsemicircleparameters% - \let\pgf@semicirclereferencepoint\basepoint% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{\semicircleradius}{0pt}}% - } - \anchor{mid}{\midpoint} - \anchor{mid west}{% - \installsemicircleparameters% - \let\pgf@semicirclereferencepoint\midpoint% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{-\semicircleradius}{0pt}}% - } - \anchor{mid east}{% - \installsemicircleparameters% - \let\pgf@semicirclereferencepoint\midpoint% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{\semicircleradius}{0pt}}% - } - \anchor{apex}{% - \installsemicircleparameters% - \pgfmathadd@{\rotate}{90}% - \let\angle\pgfmathresult% - \pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\angle}{\semicircleradius}}% - } - \anchor{arc start}{% - \installsemicircleparameters% - \arcstartcorner% - } - \anchor{arc end}{% - \installsemicircleparameters% - \arcendcorner% - } - \anchor{chord center}{% - \installsemicircleparameters% - \pgfpointlineattime{0.5}{\arcstartcorner}{\arcendcorner}% - } - \anchor{north}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{90}{\semicircleradius}}% - } - \anchor{south}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{270}{\semicircleradius}}% - } - \anchor{east}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{0}{\semicircleradius}}% - } - \anchor{west}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{180}{\semicircleradius}}% - } - \anchor{north west}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{135}{\semicircleradius}}% - } - \anchor{south west}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{225}{\semicircleradius}}% - } - \anchor{north east}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{45}{\semicircleradius}}% - } - \anchor{south east}{% - \installsemicircleparameters% - \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{315}{\semicircleradius}}% - } - \backgroundpath{% - \installsemicircleparameters% - \pgf@x\semicircleradius\relax% - \advance\pgf@x-\outersep\relax% - \edef\semicircleradius{\the\pgf@x}% - \pgfpathmoveto{\pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\rotate}{\semicircleradius}}}% - {% - \pgftransformrotate{\rotate}% - \pgfpatharc{0}{180}{\semicircleradius}% - \pgfpathclose% - }% - } - \anchorborder{% - % - % Save x and y. - % - \edef\externalx{\the\pgf@x}% - \edef\externaly{\the\pgf@y}% - % - % Check if a reference point has been defined (i.e. \midpoint or \basepoint). - % - \pgfutil@ifundefined{pgf@semicirclereferencepoint}% - {\let\referencepoint\centerpoint}% - {\let\referencepoint\pgf@semicirclereferencepoint}% - % - % Adjust the location of the external point relative to the reference point. - % - \referencepoint% - \pgf@xa\externalx\relax% - \pgf@ya\externaly\relax% - \advance\pgf@xa\pgf@x% - \advance\pgf@ya\pgf@y% - \edef\externalx{\the\pgf@xa}% - \edef\externaly{\the\pgf@ya}% - % - % Install the required points and angles. - % - \installsemicircleparameters% - % - % Get the angle of the external point to the \referencepoint. - % - \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - \let\externalangle\pgfmathresult% - % - % *Subtract* the rotation from the external angle. - % - \pgfmathsubtract@{\pgfmathresult}{\rotate}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\angle\pgfmathresult% - \ifx\referencepoint\basepoint% - \let\angletoarcstartborder\baseangletoarcstartborder% - \let\angletoarcendborder\baseangletoarcendborder% - \let\angletoarcstartcorner\baseangletoarcstartcorner% - \let\angletoarcendcorner\baseangletoarcendcorner% - \let\centerpointdiff\basesemicirclecenterdiff% - \else% - \ifx\referencepoint\midpoint% - \let\angletoarcstartborder\midangletoarcstartborder% - \let\angletoarcendborder\midangletoarcendborder% - \let\angletoarcstartcorner\midangletoarcstartcorner% - \let\angletoarcendcorner\midangletoarcendcorner% - \let\centerpointdiff\midsemicirclecenterdiff% - \fi\fi% - % - % Determine if the line will cross the semicircle arc, or the chord. - % - \ifdim\angle pt>\angletoarcstartborder pt\relax% - \let\firstpoint\pgfutil@empty% - \let\secondpoint\pgfutil@empty% - \else% - \ifdim\angle pt>\angletoarcstartcorner pt\relax% - \let\firstpoint\arcstartcorner% - \let\secondpoint\arcstartborder% - \else% - \ifdim\angle pt>\angletoarcendcorner pt\relax% - \let\firstpoint\arcendcorner% - \let\secondpoint\arcstartcorner% - \else% - \ifdim\angle pt>\angletoarcendborder pt\relax% - \let\firstpoint\arcendborder% - \let\secondpoint\arcendcorner% - \else% - \let\firstpoint\pgfutil@empty% - \let\secondpoint\pgfutil@empty% - \fi% - \fi% - \fi% - \fi% - \ifx\firstpoint\pgfutil@empty - % - % Calculate the angle from the centre of the semicircle to the - % point on the semicircle arc which intersects the line from - % the external point to the reference point... - % - \pgfmathanglebetweenlines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - {\semicirclecenterpoint}{\referencepoint}% - \pgfmathsin@{\pgfmathresult}% - \let\sineangle\pgfmathresult% - \pgf@x\semicircleradius\relax% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}% - \let\reciprocalradius\pgfmathresult% - \pgf@x\centerpointdiff\relax% - \pgf@x\sineangle\pgf@x% - \pgf@x\reciprocalradius\pgf@x% - \pgfmathasin@{\pgfmath@tonumber{\pgf@x}}% - \pgf@x\pgfmathresult pt\relax% - \advance\pgf@x\externalangle pt\relax% - \edef\angle{\pgfmath@tonumber{\pgf@x}}% - % - % ...and thus the point on the border. - % - \pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\angle}{\semicircleradius}}% - \else% - % - % Calculate the the point where the semicircle chord intersects - % the line from the external point to the reference point. - % - \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - {\firstpoint}{\secondpoint}% - \fi% - } -} +\pgfdeclareshape{semicircle}{% + \savedmacro\installsemicircleparameters{% + % + % Get the larger of the outer sep. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \edef\outersep{\the\pgf@x}% + % + % Get the node dimensions. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x+.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y+.5\ht\pgfnodeparttextbox% + \advance\pgf@y+.5\dp\pgfnodeparttextbox% + % + % Use the radius of the incircle if required... + % + \ifpgfshapeborderusesincircle% + % + % Get the rotation (no rounding). + % + \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \pgf@x1.41421\pgf@x% + \edef\halfheight{\the\pgf@x}% + \advance\pgf@x\pgf@x% + \else% + % + % Get the rotation (with rounding). + % + \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% + \afterassignment\pgfmath@gobbletilpgfmath@% + \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% + \advance\c@pgf@counta45\relax% + \divide\c@pgf@counta90\relax% + \multiply\c@pgf@counta90\relax% + \ifnum\c@pgf@counta<0\relax% + \advance\c@pgf@counta360\relax% + \fi% + \edef\rotate{\the\c@pgf@counta}% + % + % Calculate the width and height of the node + % contents, according to any border rotation. + % + \ifnum\c@pgf@counta=90\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \else% + \ifnum\c@pgf@counta=270\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \fi% + \fi% + \advance\pgf@y\pgf@y% + \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}% + \pgf@x\pgfmathresult pt\relax% + \pgf@y.5\pgf@y% + \edef\halfheight{\the\pgf@y}% + \fi% + \edef\defaultradius{\the\pgf@x}% + % + % Take into account minimum height and width. + % + \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}% + \ifdim\pgf@x<.5\pgf@xa% + \pgf@x.5\pgf@xa% + \fi% + \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@x<\pgf@ya% + \pgf@x\pgf@ya% + \fi% + \edef\semicircleradius{\the\pgf@x}% + % + % Find the center/base/mid of the semi circle node. + % + \pgfextract@process\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y+-.5\dp\pgfnodeparttextbox% + }% + \pgfextract@process\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \pgfextract@process\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + \pgfextract@process\semicirclecenterpoint{% + \centerpoint% + \pgf@ya\semicircleradius\relax% + \advance\pgf@ya-\defaultradius\relax% + % + % The point is adjusted to make the node contents + % appear more centered if the node is enlarged to + % some minimum size. The factor .4 just seems OK. + % + \pgf@ya.4\pgf@ya% + \advance\pgf@y-\pgf@ya% + \pgf@ya\halfheight\relax% + \advance\pgf@y-\pgf@ya% + }% + % + % Add the outer sep to the radius here. + % + \pgf@x\semicircleradius\relax% + \advance\pgf@x\outersep\relax% + \edef\semicircleradius{\the\pgf@x}% + \pgfpointdiff{\centerpoint}{\semicirclecenterpoint}% + \ifdim\pgf@y<0pt\pgf@y-\pgf@y\fi% + \edef\centerpointdiff{\the\pgf@y}% + % + % Calculate the start and end points on the border. + % + \pgfextract@process\arcstartborder{% + \semicirclecenterpoint% + \advance\pgf@x\semicircleradius\relax% + }% + \pgfextract@process\arcendborder{% + \semicirclecenterpoint% + \advance\pgf@x-\semicircleradius\relax% + }% + % + % Calculate the start and end *corner* points on the border. + % This is needed to accommodate the outer sep. + % + \pgfextract@process\arcstartcorner{% + \arcstartborder% + \advance\pgf@y-\outersep\relax% + }% + \pgfextract@process\arcendcorner{% + \arcendborder% + \advance\pgf@y-\outersep\relax% + } + % + % Now calculate all the relevant angles. + % + % For the center point. + % + \pgfmathanglebetweenpoints{\centerpoint}{\arcstartborder}% + \let\angletoarcstartborder\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\arcendborder}% + \let\angletoarcendborder\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\arcstartcorner}% + \let\angletoarcstartcorner\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\arcendcorner}% + \let\angletoarcendcorner\pgfmathresult% + % + % For the basepoint (rotated about the center point). + % + \pgfextract@process\rotatedbasepoint{% + \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcstartborder}% + \let\baseangletoarcstartborder\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcendborder}% + \let\baseangletoarcendborder\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcstartcorner}% + \let\baseangletoarcstartcorner\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\arcendcorner}% + \let\baseangletoarcendcorner\pgfmathresult% + % + % For the midpoint (rotated about the center point). + % + \pgfextract@process\rotatedmidpoint{% + \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcstartborder}% + \let\midangletoarcstartborder\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcendborder}% + \let\midangletoarcendborder\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcstartcorner}% + \let\midangletoarcstartcorner\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\arcendcorner}% + \let\midangletoarcendcorner\pgfmathresult% + % + % Now, rotate the semicircle points around the centerpoint. + % + \pgfextract@process\semicirclecenterpoint{% + \pgfmathrotatepointaround{\semicirclecenterpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcstartborder{% + \pgfmathrotatepointaround{\arcstartborder}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcendborder{% + \pgfmathrotatepointaround{\arcendborder}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcstartcorner{% + \pgfmathrotatepointaround{\arcstartcorner}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcendcorner{% + \pgfmathrotatepointaround{\arcendcorner}{\centerpoint}{\rotate}% + }% + % + % Calculate the distance between the base point and the (rotated) semicircle center. + % + \pgfpointdiff{\basepoint}{\semicirclecenterpoint}% + \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}% + \edef\basesemicirclecenterdiff{\pgfmathresult pt}% + % + % Calculate the distance between the base point and the (rotated) semicircle center. + % + \pgfpointdiff{\midpoint}{\semicirclecenterpoint}% + \pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}% + \edef\midsemicirclecenterdiff{\pgfmathresult pt}% + % + % And save all the stuff. + % + \addtosavedmacro{\rotate}% + \addtosavedmacro{\outersep}% + \addtosavedmacro{\semicircleradius}% + % + \addtosavedmacro{\arcstartborder}% + \addtosavedmacro{\arcendborder}% + \addtosavedmacro{\arcstartcorner}% + \addtosavedmacro{\arcendcorner}% + \addtosavedmacro{\semicirclecenterpoint}% + % + \addtosavedmacro{\angletoarcstartborder}% + \addtosavedmacro{\angletoarcendborder}% + \addtosavedmacro{\angletoarcstartcorner}% + \addtosavedmacro{\angletoarcendcorner}% + % + \addtosavedmacro{\centerpointdiff}% + \addtosavedmacro{\basesemicirclecenterdiff}% + \addtosavedmacro{\midsemicirclecenterdiff}% + % + \addtosavedmacro{\baseangletoarcstartborder}% + \addtosavedmacro{\baseangletoarcendborder}% + \addtosavedmacro{\baseangletoarcstartcorner}% + \addtosavedmacro{\baseangletoarcendcorner}% + % + \addtosavedmacro{\midangletoarcstartborder}% + \addtosavedmacro{\midangletoarcendborder}% + \addtosavedmacro{\midangletoarcstartcorner}% + \addtosavedmacro{\midangletoarcendcorner}% + }% + \savedanchor{\centerpoint}{% + \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}% + \pgfmathsetlength\pgf@y{+.5\ht\pgfnodeparttextbox}% + \pgfmathaddtolength\pgf@y{-.5\dp\pgfnodeparttextbox}% + }% + \savedanchor{\basepoint}{% + \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}% + \pgf@y0pt\relax% + }% + \savedanchor{\midpoint}{% + \pgfmathsetlength\pgf@x{+.5\wd\pgfnodeparttextbox}% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + \anchor{center}{\centerpoint}% + \anchor{base}{\basepoint}% + \anchor{base west}{% + \installsemicircleparameters% + \let\pgf@semicirclereferencepoint\basepoint% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{-\semicircleradius}{0pt}}% + }% + \anchor{base east}{% + \installsemicircleparameters% + \let\pgf@semicirclereferencepoint\basepoint% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{\semicircleradius}{0pt}}% + }% + \anchor{mid}{\midpoint}% + \anchor{mid west}{% + \installsemicircleparameters% + \let\pgf@semicirclereferencepoint\midpoint% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{-\semicircleradius}{0pt}}% + }% + \anchor{mid east}{% + \installsemicircleparameters% + \let\pgf@semicirclereferencepoint\midpoint% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpoint{\semicircleradius}{0pt}}% + }% + \anchor{apex}{% + \installsemicircleparameters% + \pgfmathadd@{\rotate}{90}% + \let\angle\pgfmathresult% + \pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\angle}{\semicircleradius}}% + }% + \anchor{arc start}{% + \installsemicircleparameters% + \arcstartcorner% + }% + \anchor{arc end}{% + \installsemicircleparameters% + \arcendcorner% + }% + \anchor{chord center}{% + \installsemicircleparameters% + \pgfpointlineattime{0.5}{\arcstartcorner}{\arcendcorner}% + }% + \anchor{north}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{90}{\semicircleradius}}% + }% + \anchor{south}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{270}{\semicircleradius}}% + }% + \anchor{east}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{0}{\semicircleradius}}% + }% + \anchor{west}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{180}{\semicircleradius}}% + }% + \anchor{north west}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{135}{\semicircleradius}}% + }% + \anchor{south west}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{225}{\semicircleradius}}% + }% + \anchor{north east}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{45}{\semicircleradius}}% + }% + \anchor{south east}{% + \installsemicircleparameters% + \csname pgf@anchor@semicircle@border\endcsname{\pgfqpointpolar{315}{\semicircleradius}}% + }% + \backgroundpath{% + \installsemicircleparameters% + \pgf@x\semicircleradius\relax% + \advance\pgf@x-\outersep\relax% + \edef\semicircleradius{\the\pgf@x}% + \pgfpathmoveto{\pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\rotate}{\semicircleradius}}}% + {% + \pgftransformrotate{\rotate}% + \pgfpatharc{0}{180}{\semicircleradius}% + \pgfpathclose% + }% + }% + \anchorborder{% + % + % Save x and y. + % + \edef\externalx{\the\pgf@x}% + \edef\externaly{\the\pgf@y}% + % + % Check if a reference point has been defined (i.e. \midpoint or \basepoint). + % + \pgfutil@ifundefined{pgf@semicirclereferencepoint}% + {\let\referencepoint\centerpoint}% + {\let\referencepoint\pgf@semicirclereferencepoint}% + % + % Adjust the location of the external point relative to the reference point. + % + \referencepoint% + \pgf@xa\externalx\relax% + \pgf@ya\externaly\relax% + \advance\pgf@xa\pgf@x% + \advance\pgf@ya\pgf@y% + \edef\externalx{\the\pgf@xa}% + \edef\externaly{\the\pgf@ya}% + % + % Install the required points and angles. + % + \installsemicircleparameters% + % + % Get the angle of the external point to the \referencepoint. + % + \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + \let\externalangle\pgfmathresult% + % + % *Subtract* the rotation from the external angle. + % + \pgfmathsubtract@{\pgfmathresult}{\rotate}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\angle\pgfmathresult% + \ifx\referencepoint\basepoint% + \let\angletoarcstartborder\baseangletoarcstartborder% + \let\angletoarcendborder\baseangletoarcendborder% + \let\angletoarcstartcorner\baseangletoarcstartcorner% + \let\angletoarcendcorner\baseangletoarcendcorner% + \let\centerpointdiff\basesemicirclecenterdiff% + \else% + \ifx\referencepoint\midpoint% + \let\angletoarcstartborder\midangletoarcstartborder% + \let\angletoarcendborder\midangletoarcendborder% + \let\angletoarcstartcorner\midangletoarcstartcorner% + \let\angletoarcendcorner\midangletoarcendcorner% + \let\centerpointdiff\midsemicirclecenterdiff% + \fi\fi% + % + % Determine if the line will cross the semicircle arc, or the chord. + % + \ifdim\angle pt>\angletoarcstartborder pt\relax% + \let\firstpoint\pgfutil@empty% + \let\secondpoint\pgfutil@empty% + \else% + \ifdim\angle pt>\angletoarcstartcorner pt\relax% + \let\firstpoint\arcstartcorner% + \let\secondpoint\arcstartborder% + \else% + \ifdim\angle pt>\angletoarcendcorner pt\relax% + \let\firstpoint\arcendcorner% + \let\secondpoint\arcstartcorner% + \else% + \ifdim\angle pt>\angletoarcendborder pt\relax% + \let\firstpoint\arcendborder% + \let\secondpoint\arcendcorner% + \else% + \let\firstpoint\pgfutil@empty% + \let\secondpoint\pgfutil@empty% + \fi% + \fi% + \fi% + \fi% + \ifx\firstpoint\pgfutil@empty + % + % Calculate the angle from the centre of the semicircle to the + % point on the semicircle arc which intersects the line from + % the external point to the reference point... + % + \pgfmathanglebetweenlines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + {\semicirclecenterpoint}{\referencepoint}% + \pgfmathsin@{\pgfmathresult}% + \let\sineangle\pgfmathresult% + \pgf@x\semicircleradius\relax% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}% + \let\reciprocalradius\pgfmathresult% + \pgf@x\centerpointdiff\relax% + \pgf@x\sineangle\pgf@x% + \pgf@x\reciprocalradius\pgf@x% + \pgfmathasin@{\pgfmath@tonumber{\pgf@x}}% + \pgf@x\pgfmathresult pt\relax% + \advance\pgf@x\externalangle pt\relax% + \edef\angle{\pgfmath@tonumber{\pgf@x}}% + % + % ...and thus the point on the border. + % + \pgfpointadd{\semicirclecenterpoint}{\pgfqpointpolar{\angle}{\semicircleradius}}% + \else% + % + % Calculate the the point where the semicircle chord intersects + % the line from the external point to the reference point. + % + \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + {\firstpoint}{\secondpoint}% + \fi% + }% +}% % Keys for shape isosceles triangle % % /pgf/isosceles triangle apex angle : angle at the apex of the triangle. \pgfkeys{/pgf/.cd, - isosceles triangle apex angle/.initial=45, - isosceles triangle stretches/.is if=pgf@lib@sh@isosceslestrianglestretches -} + isosceles triangle apex angle/.initial=45, + isosceles triangle stretches/.is if=pgf@lib@sh@isosceslestrianglestretches +}% \newif\ifpgf@lib@sh@isosceslestrianglestretches -\pgfdeclareshape{isosceles triangle}{ - \savedmacro\trianglepoints{% - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/isosceles triangle apex angle}}% - \divide\pgf@x2\relax% - \edef\halfapexangle{\pgfmath@tonumber{\pgf@x}}% - \addtosavedmacro\halfapexangle% - % - \pgfmathtan@{\halfapexangle}% - \let\tanhalfapexangle\pgfmathresult% - % - \pgfmathcot@{\halfapexangle}% - \let\cothalfapexangle\pgfmathresult% - % - \pgfmathsin@{\halfapexangle}% - \let\sinhalfapexangle\pgfmathresult% - % - \pgfmathreciprocal@{\pgfmathresult}% - \let\cosechalfapexangle\pgfmathresult% - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - % - \ifpgfshapeborderusesincircle% - \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \else% - \pgf@y\pgf@x% - \fi% - \pgf@x1.414213\pgf@x% - \pgf@y1.414213\pgf@y% - % - \pgf@xa\pgf@x% - \advance\pgf@xa\cosechalfapexangle\pgf@x% - \pgf@ya\tanhalfapexangle\pgf@xa% - \else% - \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \pgfmathsetcount\c@pgf@counta{+\pgfmathresult}% - \advance\c@pgf@counta45\relax% - \divide\c@pgf@counta90\relax% - \multiply\c@pgf@counta90\relax% - \edef\rotate{\the\c@pgf@counta}% - \ifnum\c@pgf@counta=90\relax% - \pgf@xa\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xa% - \else% - \ifnum\c@pgf@counta=270\relax% - \pgf@xa\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xa% - \fi% - \fi% - % - \pgf@xa2.0\pgf@x% - \pgf@ya\tanhalfapexangle\pgf@xa% - \advance\pgf@xa\cothalfapexangle\pgf@y% - \advance\pgf@ya\pgf@y% - \fi% - \addtosavedmacro\rotate% - \ifdim\pgf@xa=0pt\relax% - \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum height}}% - \fi% - % Adjust for minimum height and width. - % - \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum width}}% - \ifdim\pgf@ya<.5\pgf@yb% - \ifpgf@lib@sh@isosceslestrianglestretches% - \pgf@ya.5\pgf@yb% - % - \pgfmathdivide@{\pgfmath@tonumber{\pgf@ya}}{\pgfmath@tonumber{\pgf@xa}}% - \pgfmathatan@{\pgfmathresult}% - \let\halfapexangle\pgfmathresult% - % - \else% - \pgf@ya.5\pgf@yb% - \pgf@xa\cothalfapexangle\pgf@ya% - \fi% - \fi% - % - \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@xa<\pgf@xb% - \ifpgf@lib@sh@isosceslestrianglestretches% - \pgf@xa\pgf@xb% - % - \pgfmathdivide@{\pgfmath@tonumber{\pgf@ya}}{\pgfmath@tonumber{\pgf@xa}}% - \pgfmathatan@{\pgfmathresult}% - \let\halfapexangle\pgfmathresult% - % - \else% - \pgf@xa\pgf@xb% - \pgf@ya\tanhalfapexangle\pgf@xa% - \fi% - \fi% - % - % - % Now find the ``offset height'' (h'). This is the distance from the - % center of the node contents to the base of the triangle. - % - \ifpgfshapeborderusesincircle% - % - % h' = H*sin(a/2) / (1+sin(a/2)) - % - % where: - % H = the height of the triangle. - % a = the apex angle. - % - \pgf@xc\pgf@xa% - \pgfmathsin@{\halfapexangle}% - \pgf@xc\pgfmathresult\pgf@xc% - \pgf@yc1pt\relax% - \advance\pgf@yc\pgfmathresult pt\relax% - \pgfmathdivide@{\pgfmath@tonumber{\pgf@xc}}{\pgfmath@tonumber{\pgf@yc}} - \pgfutil@tempdima\pgfmathresult pt\relax% - \else% - % - % h' = 0.5*h + (0.5*(W-w)*cos(a/2) - h*sin(a/2))/(1+sin(a/2)) - % - % where: - % h = the height of the node contents. - % w = the width of the node contents. - % W = the width of the triangle. - % a = the apex angle. - % - \pgf@xc\pgf@ya% - \advance\pgf@xc-\pgf@y% - \pgfmathcos@{\halfapexangle}% - \pgf@xc\pgfmathresult\pgf@xc% - \pgfmathsin@{\halfapexangle}% - \advance\pgf@xc-\pgfmathresult\pgf@x% - \advance\pgf@xc-\pgfmathresult\pgf@x% - \pgf@yc\pgfmathresult pt\relax% - \advance\pgf@yc1pt\relax% - \pgfmathdivide@{\pgfmath@tonumber{\pgf@xc}}{\pgfmath@tonumber{\pgf@yc}}% - \pgfutil@tempdima\pgfmathresult pt\relax% - \advance\pgfutil@tempdima\pgf@x% - \fi% - \pgfextract@process\apex{% - \pgf@y0pt% - \pgf@x\pgf@xa% - \advance\pgf@x-\pgfutil@tempdima% - }% - \addtosavedmacro\apex% - % - \pgfextract@process\lowerleft{% - \pgf@y\pgf@ya% - \pgf@x-\pgfutil@tempdima% - }% - \addtosavedmacro\lowerleft% - % - \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@xb<\pgf@yb% - \pgf@xb\pgf@yb% - \fi% - \pgfextract@process\apexanchor{% - \apex% - \advance\pgf@x\cosechalfapexangle\pgf@xb% - }% - \addtosavedmacro\apexanchor% - % - \pgf@yc-\halfapexangle pt\relax% - \advance\pgf@yc90pt\relax% - \divide\pgf@yc2\relax% - \pgfmathcot@{\pgfmath@tonumber{\pgf@yc}}% - \pgfextract@process\lowerleftanchor{% - \lowerleft% - \advance\pgf@y\pgfmathresult\pgf@xb% - \advance\pgf@x-\pgf@xb% - }% - \addtosavedmacro\lowerleftanchor% - % - \pgfextract@process\lowerrightanchor{% - \lowerleftanchor% - \pgf@y-\pgf@y% - }% - \addtosavedmacro\lowerrightanchor% - } - \anchor{apex}{% - \trianglepoints% - \pgfpointadd{\centerpoint}{% - \pgfmathrotatepointaround{\apexanchor}{\pgfpointorigin}{\rotate}% - }% - }% - \anchor{left corner}{% - \trianglepoints% - \pgfpointadd{\centerpoint}{% - \pgfmathrotatepointaround{\lowerleftanchor}{\pgfpointorigin}{\rotate}% - }% - }% - \anchor{right corner}{% - \trianglepoints% - \pgfpointadd{\centerpoint}{% - \pgfmathrotatepointaround{\lowerrightanchor}{\pgfpointorigin}{\rotate}% - }% - }% - \savedanchor\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - \savedanchor\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt% - }% - \anchor{center}{\centerpoint}% - \anchor{mid}{\midpoint}% - \anchor{mid west}{% - \trianglepoints% - \let\pgf@isoscelestriangle@referencepoint\midpoint% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}% - }% - \anchor{mid east}{% - \trianglepoints% - \let\pgf@isoscelestriangle@referencepoint\midpoint% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}% - }% - \anchor{base}{\basepoint}% - \anchor{base west}{% - \trianglepoints% - \let\pgf@isoscelestriangle@referencepoint\basepoint% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}% - }% - \anchor{base east}{% - \trianglepoints% - \let\pgf@isoscelestriangle@referencepoint\basepoint% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}% - }% - \anchor{north}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{0pt}{1pt}}% - } - \anchor{south}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{0pt}{-1pt}}% - } - \anchor{east}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}% - } - \anchor{west}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}% - } - \anchor{north east}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{1pt}}% - } - \anchor{south west}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{-1pt}}% - } - \anchor{south east}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{-1pt}}% - } - \anchor{north west}{% - \trianglepoints% - \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{1pt}}% - } - \anchor{left side}{% - \trianglepoints% - \pgfmathrotatepointaround{% - \pgfpointadd{\pgfpointlineattime{0.5}{\lowerleftanchor}{\apexanchor}}{\centerpoint}}% - {\centerpoint}{\rotate}% - } - \anchor{right side}{% - \trianglepoints% - \pgfmathrotatepointaround{% - \pgfpointadd{\pgfpointlineattime{0.5}{\lowerrightanchor}{\apexanchor}}{\centerpoint}}% - {\centerpoint}{\rotate}% - } - \anchor{lower side}{% - \trianglepoints% - \pgfmathrotatepointaround{% - \pgfpointadd{\pgfpointlineattime{0.5}{\lowerleftanchor}{\lowerrightanchor}}{\centerpoint}}% - {\centerpoint}{\rotate}% - } - \backgroundpath{% - \trianglepoints% - {% - \pgftransformshift{\centerpoint}% - \pgftransformrotate{\rotate}% - \pgfpathmoveto{\apex}% - \pgfpathlineto{\lowerleft}% - \pgfpathlineto{\lowerleft\pgf@y-\pgf@y}% - \pgfpathclose% - }% - } - \anchorborder{% - \pgfutil@ifundefined{pgf@isoscelestriangle@referencepoint}{\let\referencepoint\centerpoint}% - {\let\referencepoint\pgf@isoscelestriangle@referencepoint}% - \pgfextract@process\externalpoint{% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \referencepoint% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - \trianglepoints% - \pgfmathanglebetweenpoints{\referencepoint}{\externalpoint}% - \pgfmathsubtract@{\pgfmathresult}{\rotate}% - \pgfmathmod@{\pgfmathresult}{360}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\externalangle\pgfmathresult% - % - \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\lowerrightanchor}}% - \ifdim\externalangle pt<\pgfmathresult pt\relax% - \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\lowerleftanchor}}% - \ifdim\externalangle pt<\pgfmathresult pt\relax% - \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\apexanchor}}% - \ifdim\externalangle pt>\pgfmathresult pt\relax% - \let\firstpoint\apexanchor% - \let\secondpoint\lowerleftanchor% - \else% - \let\firstpoint\apexanchor% - \let\secondpoint\lowerrightanchor% - \fi% - \else% - \let\firstpoint\lowerleftanchor% - \let\secondpoint\lowerrightanchor% - \fi% - \else% - \let\firstpoint\lowerrightanchor% - \let\secondpoint\apexanchor% - \fi% - \pgfpointintersectionoflines{\referencepoint}{\externalpoint}% - {\pgfmathrotatepointaround{\pgfpointadd{\centerpoint}{\firstpoint}}{\centerpoint}{\rotate}}% - {\pgfmathrotatepointaround{\pgfpointadd{\centerpoint}{\secondpoint}}{\centerpoint}{\rotate}}% - }% -} +\pgfdeclareshape{isosceles triangle}{% + \savedmacro\trianglepoints{% + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/isosceles triangle apex angle}}% + \divide\pgf@x2\relax% + \edef\halfapexangle{\pgfmath@tonumber{\pgf@x}}% + \addtosavedmacro\halfapexangle% + % + \pgfmathtan@{\halfapexangle}% + \let\tanhalfapexangle\pgfmathresult% + % + \pgfmathcot@{\halfapexangle}% + \let\cothalfapexangle\pgfmathresult% + % + \pgfmathsin@{\halfapexangle}% + \let\sinhalfapexangle\pgfmathresult% + % + \pgfmathreciprocal@{\pgfmathresult}% + \let\cosechalfapexangle\pgfmathresult% + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + % + \ifpgfshapeborderusesincircle% + \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \else% + \pgf@y\pgf@x% + \fi% + \pgf@x1.414213\pgf@x% + \pgf@y1.414213\pgf@y% + % + \pgf@xa\pgf@x% + \advance\pgf@xa\cosechalfapexangle\pgf@x% + \pgf@ya\tanhalfapexangle\pgf@xa% + \else% + \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \pgfmathsetcount\c@pgf@counta{+\pgfmathresult}% + \advance\c@pgf@counta45\relax% + \divide\c@pgf@counta90\relax% + \multiply\c@pgf@counta90\relax% + \edef\rotate{\the\c@pgf@counta}% + \ifnum\c@pgf@counta=90\relax% + \pgf@xa\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xa% + \else% + \ifnum\c@pgf@counta=270\relax% + \pgf@xa\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xa% + \fi% + \fi% + % + \pgf@xa2.0\pgf@x% + \pgf@ya\tanhalfapexangle\pgf@xa% + \advance\pgf@xa\cothalfapexangle\pgf@y% + \advance\pgf@ya\pgf@y% + \fi% + \addtosavedmacro\rotate% + \ifdim\pgf@xa=0pt\relax% + \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum height}}% + \fi% + % Adjust for minimum height and width. + % + \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum width}}% + \ifdim\pgf@ya<.5\pgf@yb% + \ifpgf@lib@sh@isosceslestrianglestretches% + \pgf@ya.5\pgf@yb% + % + \pgfmathdivide@{\pgfmath@tonumber{\pgf@ya}}{\pgfmath@tonumber{\pgf@xa}}% + \pgfmathatan@{\pgfmathresult}% + \let\halfapexangle\pgfmathresult% + % + \else% + \pgf@ya.5\pgf@yb% + \pgf@xa\cothalfapexangle\pgf@ya% + \fi% + \fi% + % + \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@xa<\pgf@xb% + \ifpgf@lib@sh@isosceslestrianglestretches% + \pgf@xa\pgf@xb% + % + \pgfmathdivide@{\pgfmath@tonumber{\pgf@ya}}{\pgfmath@tonumber{\pgf@xa}}% + \pgfmathatan@{\pgfmathresult}% + \let\halfapexangle\pgfmathresult% + % + \else% + \pgf@xa\pgf@xb% + \pgf@ya\tanhalfapexangle\pgf@xa% + \fi% + \fi% + % + % + % Now find the ``offset height'' (h'). This is the distance from the + % center of the node contents to the base of the triangle. + % + \ifpgfshapeborderusesincircle% + % + % h' = H*sin(a/2) / (1+sin(a/2)) + % + % where: + % H = the height of the triangle. + % a = the apex angle. + % + \pgf@xc\pgf@xa% + \pgfmathsin@{\halfapexangle}% + \pgf@xc\pgfmathresult\pgf@xc% + \pgf@yc1pt\relax% + \advance\pgf@yc\pgfmathresult pt\relax% + \pgfmathdivide@{\pgfmath@tonumber{\pgf@xc}}{\pgfmath@tonumber{\pgf@yc}} + \pgfutil@tempdima\pgfmathresult pt\relax% + \else% + % + % h' = 0.5*h + (0.5*(W-w)*cos(a/2) - h*sin(a/2))/(1+sin(a/2)) + % + % where: + % h = the height of the node contents. + % w = the width of the node contents. + % W = the width of the triangle. + % a = the apex angle. + % + \pgf@xc\pgf@ya% + \advance\pgf@xc-\pgf@y% + \pgfmathcos@{\halfapexangle}% + \pgf@xc\pgfmathresult\pgf@xc% + \pgfmathsin@{\halfapexangle}% + \advance\pgf@xc-\pgfmathresult\pgf@x% + \advance\pgf@xc-\pgfmathresult\pgf@x% + \pgf@yc\pgfmathresult pt\relax% + \advance\pgf@yc1pt\relax% + \pgfmathdivide@{\pgfmath@tonumber{\pgf@xc}}{\pgfmath@tonumber{\pgf@yc}}% + \pgfutil@tempdima\pgfmathresult pt\relax% + \advance\pgfutil@tempdima\pgf@x% + \fi% + \pgfextract@process\apex{% + \pgf@y0pt% + \pgf@x\pgf@xa% + \advance\pgf@x-\pgfutil@tempdima% + }% + \addtosavedmacro\apex% + % + \pgfextract@process\lowerleft{% + \pgf@y\pgf@ya% + \pgf@x-\pgfutil@tempdima% + }% + \addtosavedmacro\lowerleft% + % + \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@xb<\pgf@yb% + \pgf@xb\pgf@yb% + \fi% + \pgfextract@process\apexanchor{% + \apex% + \advance\pgf@x\cosechalfapexangle\pgf@xb% + }% + \addtosavedmacro\apexanchor% + % + \pgf@yc-\halfapexangle pt\relax% + \advance\pgf@yc90pt\relax% + \divide\pgf@yc2\relax% + \pgfmathcot@{\pgfmath@tonumber{\pgf@yc}}% + \pgfextract@process\lowerleftanchor{% + \lowerleft% + \advance\pgf@y\pgfmathresult\pgf@xb% + \advance\pgf@x-\pgf@xb% + }% + \addtosavedmacro\lowerleftanchor% + % + \pgfextract@process\lowerrightanchor{% + \lowerleftanchor% + \pgf@y-\pgf@y% + }% + \addtosavedmacro\lowerrightanchor% + }% + \anchor{apex}{% + \trianglepoints% + \pgfpointadd{\centerpoint}{% + \pgfmathrotatepointaround{\apexanchor}{\pgfpointorigin}{\rotate}% + }% + }% + \anchor{left corner}{% + \trianglepoints% + \pgfpointadd{\centerpoint}{% + \pgfmathrotatepointaround{\lowerleftanchor}{\pgfpointorigin}{\rotate}% + }% + }% + \anchor{right corner}{% + \trianglepoints% + \pgfpointadd{\centerpoint}{% + \pgfmathrotatepointaround{\lowerrightanchor}{\pgfpointorigin}{\rotate}% + }% + }% + \savedanchor\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + \savedanchor\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt% + }% + \anchor{center}{\centerpoint}% + \anchor{mid}{\midpoint}% + \anchor{mid west}{% + \trianglepoints% + \let\pgf@isoscelestriangle@referencepoint\midpoint% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}% + }% + \anchor{mid east}{% + \trianglepoints% + \let\pgf@isoscelestriangle@referencepoint\midpoint% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}% + }% + \anchor{base}{\basepoint}% + \anchor{base west}{% + \trianglepoints% + \let\pgf@isoscelestriangle@referencepoint\basepoint% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}% + }% + \anchor{base east}{% + \trianglepoints% + \let\pgf@isoscelestriangle@referencepoint\basepoint% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}% + }% + \anchor{north}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{0pt}{1pt}}% + }% + \anchor{south}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{0pt}{-1pt}}% + }% + \anchor{east}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{0pt}}% + }% + \anchor{west}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{0pt}}% + }% + \anchor{north east}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{1pt}}% + }% + \anchor{south west}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{-1pt}}% + }% + \anchor{south east}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{1pt}{-1pt}}% + }% + \anchor{north west}{% + \trianglepoints% + \csname pgf@anchor@isosceles triangle@border\endcsname{\pgfqpoint{-1pt}{1pt}}% + }% + \anchor{left side}{% + \trianglepoints% + \pgfmathrotatepointaround{% + \pgfpointadd{\pgfpointlineattime{0.5}{\lowerleftanchor}{\apexanchor}}{\centerpoint}}% + {\centerpoint}{\rotate}% + }% + \anchor{right side}{% + \trianglepoints% + \pgfmathrotatepointaround{% + \pgfpointadd{\pgfpointlineattime{0.5}{\lowerrightanchor}{\apexanchor}}{\centerpoint}}% + {\centerpoint}{\rotate}% + }% + \anchor{lower side}{% + \trianglepoints% + \pgfmathrotatepointaround{% + \pgfpointadd{\pgfpointlineattime{0.5}{\lowerleftanchor}{\lowerrightanchor}}{\centerpoint}}% + {\centerpoint}{\rotate}% + }% + \backgroundpath{% + \trianglepoints% + {% + \pgftransformshift{\centerpoint}% + \pgftransformrotate{\rotate}% + \pgfpathmoveto{\apex}% + \pgfpathlineto{\lowerleft}% + \pgfpathlineto{\lowerleft\pgf@y-\pgf@y}% + \pgfpathclose% + }% + }% + \anchorborder{% + \pgfutil@ifundefined{pgf@isoscelestriangle@referencepoint}{\let\referencepoint\centerpoint}% + {\let\referencepoint\pgf@isoscelestriangle@referencepoint}% + \pgfextract@process\externalpoint{% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \referencepoint% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + \trianglepoints% + \pgfmathanglebetweenpoints{\referencepoint}{\externalpoint}% + \pgfmathsubtract@{\pgfmathresult}{\rotate}% + \pgfmathmod@{\pgfmathresult}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\externalangle\pgfmathresult% + % + \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\lowerrightanchor}}% + \ifdim\externalangle pt<\pgfmathresult pt\relax% + \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\lowerleftanchor}}% + \ifdim\externalangle pt<\pgfmathresult pt\relax% + \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\centerpoint}{\apexanchor}}% + \ifdim\externalangle pt>\pgfmathresult pt\relax% + \let\firstpoint\apexanchor% + \let\secondpoint\lowerleftanchor% + \else% + \let\firstpoint\apexanchor% + \let\secondpoint\lowerrightanchor% + \fi% + \else% + \let\firstpoint\lowerleftanchor% + \let\secondpoint\lowerrightanchor% + \fi% + \else% + \let\firstpoint\lowerrightanchor% + \let\secondpoint\apexanchor% + \fi% + \pgfpointintersectionoflines{\referencepoint}{\externalpoint}% + {\pgfmathrotatepointaround{\pgfpointadd{\centerpoint}{\firstpoint}}{\centerpoint}{\rotate}}% + {\pgfmathrotatepointaround{\pgfpointadd{\centerpoint}{\secondpoint}}{\centerpoint}{\rotate}}% + }% +}% @@ -2342,654 +2340,654 @@ % % \pgfkeys{/pgf/.cd, - kite upper vertex angle/.initial=120, - kite lower vertex angle/.initial=60, - kite vertex angles/.code={% - \pgfutil@in@{and}{#1}% - \ifpgfutil@in@% - \def\pgf@marshal##1and##2\@@{% - \pgfkeys{/pgf/kite upper vertex angle=##1}% - \pgfkeys{/pgf/kite lower vertex angle=##2}% - }% - \expandafter\pgf@marshal#1\@@% - \else% - \pgfkeys{/pgf/kite upper vertex angle=#1}% - \pgfkeys{/pgf/kite lower vertex angle=#1}% - \fi% - }% -} + kite upper vertex angle/.initial=120, + kite lower vertex angle/.initial=60, + kite vertex angles/.code={% + \pgfutil@in@{and}{#1}% + \ifpgfutil@in@% + \def\pgf@marshal##1and##2\@@{% + \pgfkeys{/pgf/kite upper vertex angle=##1}% + \pgfkeys{/pgf/kite lower vertex angle=##2}% + }% + \expandafter\pgf@marshal#1\@@% + \else% + \pgfkeys{/pgf/kite upper vertex angle=#1}% + \pgfkeys{/pgf/kite lower vertex angle=#1}% + \fi% + }% +}% % Shape kite. % -\pgfdeclareshape{kite}{ - \savedmacro\installkiteparameters{% - % - % Get the larger of the outer sep. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \edef\outersep{\the\pgf@x}% - % - % Calculate the centre, base and mid points of the node. - % - \pgfextract@process\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \pgfextract@process\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \pgfextract@process\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - % - % Halve the vertex angles. - % - \pgfmathdivide{\pgfkeysvalueof{/pgf/kite upper vertex angle}}{2}% - \let\halfuppervertexangle\pgfmathresult% - \pgfmathdivide{\pgfkeysvalueof{/pgf/kite lower vertex angle}}{2}% - \let\halflowervertexangle\pgfmathresult% - % - % Get the node dimensions. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - \ifpgfshapeborderusesincircle% - % - % Get the rotation. - % - \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% - % - % Get the radis of the incircle. - % - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \pgf@x1.41421\pgf@x% - % - % Get the distances from the upper and lower verticies - % to the center of the incircle. - % - \pgfmathsin@{\halfuppervertexangle}% - \let\sinehalfuppervertexangle\pgfmathresult% - \pgfmathreciprocal@{\pgfmathresult}% - \let\cosechalfuppervertexangle\pgfmathresult% - \pgf@ya\pgfmathresult\pgf@x% - \pgfmathsin@{\halflowervertexangle}% - \let\sinehalflowervertexangle\pgfmathresult% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@yb\pgfmathresult\pgf@x% - % - % Now calculate vertical offset (yc) between the center of - % the incircle, and the intersection of the kite diagonals. - % - % yc = x * cosec(a/2) - x * cot(a/2) * (sin(a/2) + sin(b/2)) * cosec(a/2 + b/2) - % - % where: - % x = the incircle radius. - % a = the upper vertex angle. - % b = the lower vertex angle. - % - \pgf@yc\pgf@x% - \pgfmathadd@{\halfuppervertexangle}{\halflowervertexangle}% - \pgfmathcosec@{\pgfmathresult}% - \pgf@yc\pgfmathresult\pgf@yc% - \pgfmathadd@{\sinehalfuppervertexangle}{\sinehalflowervertexangle}% +\pgfdeclareshape{kite}{% + \savedmacro\installkiteparameters{% + % + % Get the larger of the outer sep. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \edef\outersep{\the\pgf@x}% + % + % Calculate the centre, base and mid points of the node. + % + \pgfextract@process\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \pgfextract@process\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \pgfextract@process\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + % + % Halve the vertex angles. + % + \pgfmathdivide{\pgfkeysvalueof{/pgf/kite upper vertex angle}}{2}% + \let\halfuppervertexangle\pgfmathresult% + \pgfmathdivide{\pgfkeysvalueof{/pgf/kite lower vertex angle}}{2}% + \let\halflowervertexangle\pgfmathresult% + % + % Get the node dimensions. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + \ifpgfshapeborderusesincircle% + % + % Get the rotation. + % + \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% + % + % Get the radius of the incircle. + % + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \pgf@x1.41421\pgf@x% + % + % Get the distances from the upper and lower vertices + % to the center of the incircle. + % + \pgfmathsin@{\halfuppervertexangle}% + \let\sinehalfuppervertexangle\pgfmathresult% + \pgfmathreciprocal@{\pgfmathresult}% + \let\cosechalfuppervertexangle\pgfmathresult% + \pgf@ya\pgfmathresult\pgf@x% + \pgfmathsin@{\halflowervertexangle}% + \let\sinehalflowervertexangle\pgfmathresult% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@yb\pgfmathresult\pgf@x% + % + % Now calculate vertical offset (yc) between the center of + % the incircle, and the intersection of the kite diagonals. + % + % yc = x * cosec(a/2) - x * cot(a/2) * (sin(a/2) + sin(b/2)) * cosec(a/2 + b/2) + % + % where: + % x = the incircle radius. + % a = the upper vertex angle. + % b = the lower vertex angle. + % + \pgf@yc\pgf@x% + \pgfmathadd@{\halfuppervertexangle}{\halflowervertexangle}% + \pgfmathcosec@{\pgfmathresult}% + \pgf@yc\pgfmathresult\pgf@yc% + \pgfmathadd@{\sinehalfuppervertexangle}{\sinehalflowervertexangle}% \pgf@yc\pgfmathresult\pgf@yc% - \pgfmathcos@{\halfuppervertexangle}% - \pgf@yc\pgfmathresult\pgf@yc% - \pgf@yc-\cosechalfuppervertexangle\pgf@yc% - \advance\pgf@yc\cosechalfuppervertexangle\pgf@x% - \edef\deltay{\the\pgf@yc}% - % - % Now calculate the height of the kite... - % - \advance\pgf@ya-\pgf@yc% - % - % ...and the depth. - % - \advance\pgf@yb\pgf@yc% - % - % Get the half width of the widest part of the kite. - % - \pgfmathtan@{\halfuppervertexangle}% - \pgf@xa\pgfmathresult\pgf@ya% - \else% - \multiply\pgf@x2\relax% - \multiply\pgf@y2\relax% - % - % Get the rotation (with rounding). - % - \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% - \afterassignment\pgfmath@gobbletilpgfmath@% - \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% - \advance\c@pgf@counta45\relax% - \divide\c@pgf@counta90\relax% - \multiply\c@pgf@counta90\relax% - \ifnum\c@pgf@counta<0\relax% - \advance\c@pgf@counta360\relax% - \fi% - \edef\rotate{\the\c@pgf@counta}% - % - % Calculate the width and height of the node - % contents, according to any border rotation. - % - \ifnum\c@pgf@counta=90\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \else% - \ifnum\c@pgf@counta=270\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \fi% - \fi% - % - % The node contents (total height y) extends a distance ya into the - % upper isosceles triangle of the kite and a distance yb into the - % lower isosceles triangle. Thus, the following relationships hold: - % - % ya/yb = tan(b/2)/tan(a/2) - % - % and y = ya + yb - % - % so ya = y * sin(a/2 + b/2) / (cos(a/2) * sin(b/2)) - % - % where: - % a = upper vertex angle. - % b = lower vertex angle. - % - \pgfmathadd@{\halfuppervertexangle}{\halflowervertexangle}% - \pgfmathsin@{\pgfmathresult}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@ya\pgfmathresult\pgf@y% - \pgfmathcos@{\halfuppervertexangle}% - \pgf@ya\pgfmathresult\pgf@ya% - \pgfmathsin@{\halflowervertexangle}% - \pgf@ya\pgfmathresult\pgf@ya% - \pgf@yb\pgf@y% - \advance\pgf@yb-\pgf@ya% - % - % The vertical offset between the center of the node, and - % the intersection of the kite diagonals is given by: - % - % yc = y/2 - ya - % - \pgf@yc.5\pgf@y% - \advance\pgf@yc-\pgf@ya% - \edef\deltay{\the\pgf@yc}% - % - % Get the half width of the widest part of the kite. - % - \pgfmathtan@{\halfuppervertexangle}% - \pgf@xa.5\pgf@x% - \advance\pgf@xa\pgfmathresult\pgf@ya% - % - % Now calculate the height of the kite... - % - \pgf@xb.5\pgf@x% - \pgfmathreciprocal@{\pgfmathresult}% - \advance\pgf@ya\pgfmathresult\pgf@xb% - % - % ...and the depth. - % - \pgfmathtan@{\halflowervertexangle}% - \pgfmathreciprocal@{\pgfmathresult}% - \advance\pgf@yb\pgfmathresult\pgf@xb% - \fi% - % - % Take into account minimum height and width. - % - % ya is the kite height. - % yb is the kite depth. - % xa is the kite (half) width. - % - \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/minimum height}}% - \pgf@y\pgf@ya% - \advance\pgf@y\pgf@yb% - \ifdim\pgf@y<\pgf@yc% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@y}}% - \pgf@yc\pgfmathresult\pgf@yc% - \pgf@xa\pgfmath@tonumber{\pgf@yc}\pgf@xa% - \pgf@ya\pgfmath@tonumber{\pgf@yc}\pgf@ya% - \pgf@yb\pgfmath@tonumber{\pgf@yc}\pgf@yb% - \fi% - \pgf@x2.0\pgf@xa% - \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}% - \ifdim\pgf@x<\pgf@xc% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}% - \pgf@xc\pgfmathresult\pgf@xc% - \pgf@xa\pgfmath@tonumber{\pgf@xc}\pgf@xa% - \pgf@ya\pgfmath@tonumber{\pgf@xc}\pgf@ya% - \pgf@yb\pgfmath@tonumber{\pgf@xc}\pgf@yb% - \fi% - \edef\kitehalfwidth{\the\pgf@xa}% - \edef\kiteheight{\the\pgf@ya}% - \edef\kitedepth{\the\pgf@yb}% - % - % Calculate the basic points on the kite (for the background path). - % - \pgfextract@process\toppoint{% - \centerpoint% - \advance\pgf@y\deltay\relax% - \advance\pgf@y\kiteheight% - }% - \pgfextract@process\bottompoint{% - \centerpoint% - \advance\pgf@y\deltay\relax% - \advance\pgf@y-\kitedepth% - }% - \pgfextract@process\leftpoint{% - \centerpoint% - \advance\pgf@y\deltay\relax% - \advance\pgf@x-\kitehalfwidth% - }% - \pgfextract@process\rightpoint{% - \centerpoint% - \advance\pgf@y\deltay\relax% - \advance\pgf@x\kitehalfwidth% - }% - % - % Now calculate the miter length. At the top... - % - \pgfmathsin@{\halfuppervertexangle}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@y\outersep\relax% - \pgf@y\pgfmathresult\pgf@y% - \edef\topmiter{\the\pgf@y}% - % - % ...at the bottom... - % - \pgfmathsin@{\halflowervertexangle}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@y\outersep\relax% - \pgf@y\pgfmathresult\pgf@y% - \edef\bottommiter{\the\pgf@y}% - % - % ...to the right... - % - \pgfmathsubtract@{180}{\halflowervertexangle}% - \pgfmathsubtract@{\pgfmathresult}{\halfuppervertexangle}% - \pgfmathdivide@{\pgfmathresult}{2}% - \pgfmathsin@{\pgfmathresult}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@xa\outersep\relax% - \pgf@xa\pgfmathresult\pgf@xa% - \pgfmathsubtract@{\halfuppervertexangle}{\halflowervertexangle}% - \pgfmathdivide@{\pgfmathresult}{2}% - \let\angle\pgfmathresult% - \pgfextract@process\rightmiter{% - \pgfqpointpolar{\angle}{\the\pgf@xa}% - }% - % - % ...and to the left. - % - \pgfmathsubtract@{180}{\angle}% - \let\angle\pgfmathresult% - \pgfextract@process\leftmiter{% - \pgfqpointpolar{\angle}{\the\pgf@xa}% - }% - % - % Create the border points. - % - \pgfextract@process\topborderpoint{% - \toppoint% - \advance\pgf@y\topmiter\relax% - }% - \pgfextract@process\bottomborderpoint{% - \bottompoint% - \advance\pgf@y-\bottommiter\relax% - }% - \pgfextract@process\leftborderpoint{% - \leftpoint% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \leftmiter% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - \pgfextract@process\rightborderpoint{% - \rightpoint% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \rightmiter% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - % - % Get the angle from the \centerpoint to the *unrotated points*. - % - \pgfmathanglebetweenpoints{\centerpoint}{\topborderpoint}% - \let\angletotoppoint\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\leftborderpoint}% - \let\angletoleftpoint\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\bottomborderpoint}% - \let\angletobottompoint\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\rightborderpoint}% - \let\angletorightpoint\pgfmathresult% - % - % ...from the *inversly rotated* \basepoint... - % - \pgfextract@process\rotatedbasepoint{% - \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\topborderpoint}% - \let\baseangletotoppoint\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\leftborderpoint}% - \let\baseangletoleftpoint\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\bottomborderpoint}% - \let\baseangletobottompoint\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\rightborderpoint}% - \let\baseangletorightpoint\pgfmathresult% - % - % ...and from the *inversely rotated* \midpoint. - % - \pgfextract@process\rotatedmidpoint{% - \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\topborderpoint}% - \let\midangletotoppoint\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\leftborderpoint}% - \let\midangletoleftpoint\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\bottomborderpoint}% - \let\midangletobottompoint\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\rightborderpoint}% - \let\midangletorightpoint\pgfmathresult% - % - % Calculate a radius guaranteed to be outside the kite. - % - \pgfextractx\pgf@xa{\pgfpointdiff{\leftborderpoint}{\rightborderpoint}}% - \ifdim\pgf@xa<0pt\relax% - \pgf@xa-\pgf@xa% - \fi% - \pgfextracty\pgf@ya{\pgfpointdiff{\topborderpoint}{\bottomborderpoint}}% - \ifdim\pgf@ya<0pt\relax% - \pgf@ya-\pgf@ya% - \fi% - \ifdim\pgf@ya>\pgf@xa% - \edef\externalradius{\the\pgf@ya}% - \else% - \edef\externalradius{\the\pgf@xa}% - \fi% - % - % Now rotate the points... - % - \pgfextract@process\toppoint{% - \pgfmathrotatepointaround{\toppoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\bottompoint{% - \pgfmathrotatepointaround{\bottompoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\leftpoint{% - \pgfmathrotatepointaround{\leftpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\rightpoint{% - \pgfmathrotatepointaround{\rightpoint}{\centerpoint}{\rotate}% - }% - % - % ...and the border points. - % - \pgfextract@process\topborderpoint{% - \pgfmathrotatepointaround{\topborderpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\bottomborderpoint{% - \pgfmathrotatepointaround{\bottomborderpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\leftborderpoint{% - \pgfmathrotatepointaround{\leftborderpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\rightborderpoint{% - \pgfmathrotatepointaround{\rightborderpoint}{\centerpoint}{\rotate}% - }% - % - % Now save it all. - % - \addtosavedmacro{\rotate}% - \addtosavedmacro{\externalradius}% - % - \addtosavedmacro\toppoint% - \addtosavedmacro\bottompoint% - \addtosavedmacro\leftpoint% - \addtosavedmacro\rightpoint% - % - \addtosavedmacro\topborderpoint% - \addtosavedmacro\bottomborderpoint% - \addtosavedmacro\leftborderpoint% - \addtosavedmacro\rightborderpoint% - % - \addtosavedmacro\angletotoppoint% - \addtosavedmacro\angletobottompoint% - \addtosavedmacro\angletoleftpoint% - \addtosavedmacro\angletorightpoint% - % - \addtosavedmacro\baseangletotoppoint% - \addtosavedmacro\baseangletobottompoint% - \addtosavedmacro\baseangletoleftpoint% - \addtosavedmacro\baseangletorightpoint% - % - \addtosavedmacro\midangletotoppoint% - \addtosavedmacro\midangletobottompoint% - \addtosavedmacro\midangletoleftpoint% - \addtosavedmacro\midangletorightpoint% - } - \savedanchor\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \savedanchor\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - \anchor{center}{\centerpoint}% - \anchor{base}{\basepoint}% - \anchor{base west}{% - \installkiteparameters% - \let\pgf@kiteanchorborderreferencepoint\basepoint% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - }% - \anchor{base east}{% - \installkiteparameters% - \let\pgf@kiteanchorborderreferencepoint\basepoint% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - }% - \anchor{mid}{\midpoint}% - \anchor{mid west}{% - \installkiteparameters% - \let\pgf@kiteanchorborderreferencepoint\midpoint% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - }% - \anchor{mid east}{% - \installkiteparameters% - \let\pgf@kiteanchorborderreferencepoint\midpoint% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - }% - \anchor{north}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{0pt}{\externalradius}}% - } - \anchor{south}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}% - } - \anchor{east}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - } - \anchor{west}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - } - \anchor{north east}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}% - } - \anchor{south west}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}% - } - \anchor{south east}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}% - } - \anchor{north west}{% - \installkiteparameters% - \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}% - } - \anchor{upper vertex}{% - \installkiteparameters% - \topborderpoint} - \anchor{lower vertex}{% - \installkiteparameters% - \bottomborderpoint} - \anchor{left vertex}{% - \installkiteparameters% - \leftborderpoint} - \anchor{right vertex}{% - \installkiteparameters% - \rightborderpoint} - \anchor{upper left side}{% - \installkiteparameters% - \pgfpointlineattime{0.5}{\topborderpoint}{\leftborderpoint}} - \anchor{lower left side}{% - \installkiteparameters% - \pgfpointlineattime{0.5}{\bottomborderpoint}{\leftborderpoint}} - \anchor{upper right side}{% - \installkiteparameters% - \pgfpointlineattime{0.5}{\topborderpoint}{\rightborderpoint}} - \anchor{lower right side}{% - \installkiteparameters% - \pgfpointlineattime{0.5}{\bottomborderpoint}{\rightborderpoint}} - \backgroundpath{% - \installkiteparameters% - \pgfpathmoveto{\toppoint}% - \pgfpathlineto{\leftpoint}% - \pgfpathlineto{\bottompoint}% - \pgfpathlineto{\rightpoint}% - \pgfpathclose% - } - \anchorborder{% - % - % Save x and y. - % - \edef\externalx{\the\pgf@x}% - \edef\externaly{\the\pgf@y}% - % - % This allows anchors base east, base west, mid east and mid west, - % to redefine the `center' of the node to correctly calculate the - % border points. - % - \pgfutil@ifundefined{pgf@kiteanchorborderreferencepoint}% - {\let\referencepoint\centerpoint}% - {\let\referencepoint\pgf@kiteanchorborderreferencepoint}% - % - % Adjust the location of the external - % point relative to the reference point. - % - \referencepoint% - \pgf@xa\externalx\relax% - \pgf@ya\externaly\relax% - \advance\pgf@xa\pgf@x% - \advance\pgf@ya\pgf@y% - \edef\externalx{\the\pgf@xa}% - \edef\externaly{\the\pgf@ya}% - % - % Install the required points and angles. - % - \installkiteparameters% - % - % Get the angle of the external point relative to \referencepoint. - % - \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - % - % *Subtract* the rotation from the external angle. - % - \pgfmathsubtract@{\pgfmathresult}{\rotate}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\externalangle\pgfmathresult% - \ifx\referencepoint\basepoint% - \let\angletotoppoint\baseangletotoppoint% - \let\angletobottompoint\baseangletobottompoint% - \let\angletoleftpoint\baseangletoleftpoint% - \let\angletorightpoint\baseangletorightpoint% - \else% - \ifx\referencepoint\midpoint% - \let\angletotoppoint\midangletotoppoint% - \let\angletobottompoint\midangletobottompoint% - \let\angletoleftpoint\midangletoleftpoint% - \let\angletorightpoint\midangletorightpoint% - \fi\fi% - % - % Depending on the rotation, the angle to \rightborderpoint - % may be smaller than the angle to \topborderpoint. - % - \ifdim\angletorightpoint pt<\angletotoppoint pt\relax% - \ifdim\externalangle pt<\angletorightpoint pt\relax% - \let\firstpoint\rightborderpoint% - \let\secondpoint\bottomborderpoint% - \else% - \ifdim\externalangle pt<\angletotoppoint pt\relax% - \let\firstpoint\rightborderpoint% - \let\secondpoint\topborderpoint% - \else% - \ifdim\externalangle pt<\angletoleftpoint pt\relax% - \let\firstpoint\topborderpoint% - \let\secondpoint\leftborderpoint% - \else% - \ifdim\externalangle pt<\angletobottompoint pt\relax% - \let\firstpoint\leftborderpoint% - \let\secondpoint\bottomborderpoint% - \else% - \let\firstpoint\rightborderpoint% - \let\secondpoint\bottomborderpoint% - \fi% - \fi% - \fi% - \fi% - \else% - \ifdim\externalangle pt<\angletotoppoint pt\relax% - \let\firstpoint\rightborderpoint% - \let\secondpoint\topborderpoint% - \else% - \ifdim\externalangle pt<\angletoleftpoint pt\relax% - \let\firstpoint\leftborderpoint% - \let\secondpoint\topborderpoint% - \else% - \ifdim\externalangle pt<\angletobottompoint pt\relax% - \let\firstpoint\bottomborderpoint% - \let\secondpoint\leftborderpoint% - \else% - \ifdim\externalangle pt<\angletorightpoint pt\relax% - \let\firstpoint\rightborderpoint% - \let\secondpoint\bottomborderpoint% - \else% - \let\firstpoint\rightborderpoint% - \let\secondpoint\topborderpoint% - \fi% - \fi% - \fi% - \fi% - \fi% - \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - {\firstpoint}{\secondpoint}% - } -} + \pgfmathcos@{\halfuppervertexangle}% + \pgf@yc\pgfmathresult\pgf@yc% + \pgf@yc-\cosechalfuppervertexangle\pgf@yc% + \advance\pgf@yc\cosechalfuppervertexangle\pgf@x% + \edef\deltay{\the\pgf@yc}% + % + % Now calculate the height of the kite... + % + \advance\pgf@ya-\pgf@yc% + % + % ...and the depth. + % + \advance\pgf@yb\pgf@yc% + % + % Get the half width of the widest part of the kite. + % + \pgfmathtan@{\halfuppervertexangle}% + \pgf@xa\pgfmathresult\pgf@ya% + \else% + \multiply\pgf@x2\relax% + \multiply\pgf@y2\relax% + % + % Get the rotation (with rounding). + % + \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% + \afterassignment\pgfmath@gobbletilpgfmath@% + \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% + \advance\c@pgf@counta45\relax% + \divide\c@pgf@counta90\relax% + \multiply\c@pgf@counta90\relax% + \ifnum\c@pgf@counta<0\relax% + \advance\c@pgf@counta360\relax% + \fi% + \edef\rotate{\the\c@pgf@counta}% + % + % Calculate the width and height of the node + % contents, according to any border rotation. + % + \ifnum\c@pgf@counta=90\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \else% + \ifnum\c@pgf@counta=270\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \fi% + \fi% + % + % The node contents (total height y) extends a distance ya into the + % upper isosceles triangle of the kite and a distance yb into the + % lower isosceles triangle. Thus, the following relationships hold: + % + % ya/yb = tan(b/2)/tan(a/2) + % + % and y = ya + yb + % + % so ya = y * sin(a/2 + b/2) / (cos(a/2) * sin(b/2)) + % + % where: + % a = upper vertex angle. + % b = lower vertex angle. + % + \pgfmathadd@{\halfuppervertexangle}{\halflowervertexangle}% + \pgfmathsin@{\pgfmathresult}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@ya\pgfmathresult\pgf@y% + \pgfmathcos@{\halfuppervertexangle}% + \pgf@ya\pgfmathresult\pgf@ya% + \pgfmathsin@{\halflowervertexangle}% + \pgf@ya\pgfmathresult\pgf@ya% + \pgf@yb\pgf@y% + \advance\pgf@yb-\pgf@ya% + % + % The vertical offset between the center of the node, and + % the intersection of the kite diagonals is given by: + % + % yc = y/2 - ya + % + \pgf@yc.5\pgf@y% + \advance\pgf@yc-\pgf@ya% + \edef\deltay{\the\pgf@yc}% + % + % Get the half width of the widest part of the kite. + % + \pgfmathtan@{\halfuppervertexangle}% + \pgf@xa.5\pgf@x% + \advance\pgf@xa\pgfmathresult\pgf@ya% + % + % Now calculate the height of the kite... + % + \pgf@xb.5\pgf@x% + \pgfmathreciprocal@{\pgfmathresult}% + \advance\pgf@ya\pgfmathresult\pgf@xb% + % + % ...and the depth. + % + \pgfmathtan@{\halflowervertexangle}% + \pgfmathreciprocal@{\pgfmathresult}% + \advance\pgf@yb\pgfmathresult\pgf@xb% + \fi% + % + % Take into account minimum height and width. + % + % ya is the kite height. + % yb is the kite depth. + % xa is the kite (half) width. + % + \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/minimum height}}% + \pgf@y\pgf@ya% + \advance\pgf@y\pgf@yb% + \ifdim\pgf@y<\pgf@yc% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@y}}% + \pgf@yc\pgfmathresult\pgf@yc% + \pgf@xa\pgfmath@tonumber{\pgf@yc}\pgf@xa% + \pgf@ya\pgfmath@tonumber{\pgf@yc}\pgf@ya% + \pgf@yb\pgfmath@tonumber{\pgf@yc}\pgf@yb% + \fi% + \pgf@x2.0\pgf@xa% + \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}% + \ifdim\pgf@x<\pgf@xc% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}% + \pgf@xc\pgfmathresult\pgf@xc% + \pgf@xa\pgfmath@tonumber{\pgf@xc}\pgf@xa% + \pgf@ya\pgfmath@tonumber{\pgf@xc}\pgf@ya% + \pgf@yb\pgfmath@tonumber{\pgf@xc}\pgf@yb% + \fi% + \edef\kitehalfwidth{\the\pgf@xa}% + \edef\kiteheight{\the\pgf@ya}% + \edef\kitedepth{\the\pgf@yb}% + % + % Calculate the basic points on the kite (for the background path). + % + \pgfextract@process\toppoint{% + \centerpoint% + \advance\pgf@y\deltay\relax% + \advance\pgf@y\kiteheight% + }% + \pgfextract@process\bottompoint{% + \centerpoint% + \advance\pgf@y\deltay\relax% + \advance\pgf@y-\kitedepth% + }% + \pgfextract@process\leftpoint{% + \centerpoint% + \advance\pgf@y\deltay\relax% + \advance\pgf@x-\kitehalfwidth% + }% + \pgfextract@process\rightpoint{% + \centerpoint% + \advance\pgf@y\deltay\relax% + \advance\pgf@x\kitehalfwidth% + }% + % + % Now calculate the miter length. At the top... + % + \pgfmathsin@{\halfuppervertexangle}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@y\outersep\relax% + \pgf@y\pgfmathresult\pgf@y% + \edef\topmiter{\the\pgf@y}% + % + % ...at the bottom... + % + \pgfmathsin@{\halflowervertexangle}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@y\outersep\relax% + \pgf@y\pgfmathresult\pgf@y% + \edef\bottommiter{\the\pgf@y}% + % + % ...to the right... + % + \pgfmathsubtract@{180}{\halflowervertexangle}% + \pgfmathsubtract@{\pgfmathresult}{\halfuppervertexangle}% + \pgfmathdivide@{\pgfmathresult}{2}% + \pgfmathsin@{\pgfmathresult}% + \pgfmathreciprocal@{\pgfmathresult}% + \pgf@xa\outersep\relax% + \pgf@xa\pgfmathresult\pgf@xa% + \pgfmathsubtract@{\halfuppervertexangle}{\halflowervertexangle}% + \pgfmathdivide@{\pgfmathresult}{2}% + \let\angle\pgfmathresult% + \pgfextract@process\rightmiter{% + \pgfqpointpolar{\angle}{\the\pgf@xa}% + }% + % + % ...and to the left. + % + \pgfmathsubtract@{180}{\angle}% + \let\angle\pgfmathresult% + \pgfextract@process\leftmiter{% + \pgfqpointpolar{\angle}{\the\pgf@xa}% + }% + % + % Create the border points. + % + \pgfextract@process\topborderpoint{% + \toppoint% + \advance\pgf@y\topmiter\relax% + }% + \pgfextract@process\bottomborderpoint{% + \bottompoint% + \advance\pgf@y-\bottommiter\relax% + }% + \pgfextract@process\leftborderpoint{% + \leftpoint% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \leftmiter% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + \pgfextract@process\rightborderpoint{% + \rightpoint% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \rightmiter% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + % + % Get the angle from the \centerpoint to the *unrotated points*. + % + \pgfmathanglebetweenpoints{\centerpoint}{\topborderpoint}% + \let\angletotoppoint\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\leftborderpoint}% + \let\angletoleftpoint\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\bottomborderpoint}% + \let\angletobottompoint\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\rightborderpoint}% + \let\angletorightpoint\pgfmathresult% + % + % ...from the *inversely rotated* \basepoint... + % + \pgfextract@process\rotatedbasepoint{% + \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\topborderpoint}% + \let\baseangletotoppoint\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\leftborderpoint}% + \let\baseangletoleftpoint\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\bottomborderpoint}% + \let\baseangletobottompoint\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\rightborderpoint}% + \let\baseangletorightpoint\pgfmathresult% + % + % ...and from the *inversely rotated* \midpoint. + % + \pgfextract@process\rotatedmidpoint{% + \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\topborderpoint}% + \let\midangletotoppoint\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\leftborderpoint}% + \let\midangletoleftpoint\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\bottomborderpoint}% + \let\midangletobottompoint\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\rightborderpoint}% + \let\midangletorightpoint\pgfmathresult% + % + % Calculate a radius guaranteed to be outside the kite. + % + \pgfextractx\pgf@xa{\pgfpointdiff{\leftborderpoint}{\rightborderpoint}}% + \ifdim\pgf@xa<0pt\relax% + \pgf@xa-\pgf@xa% + \fi% + \pgfextracty\pgf@ya{\pgfpointdiff{\topborderpoint}{\bottomborderpoint}}% + \ifdim\pgf@ya<0pt\relax% + \pgf@ya-\pgf@ya% + \fi% + \ifdim\pgf@ya>\pgf@xa% + \edef\externalradius{\the\pgf@ya}% + \else% + \edef\externalradius{\the\pgf@xa}% + \fi% + % + % Now rotate the points... + % + \pgfextract@process\toppoint{% + \pgfmathrotatepointaround{\toppoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\bottompoint{% + \pgfmathrotatepointaround{\bottompoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\leftpoint{% + \pgfmathrotatepointaround{\leftpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\rightpoint{% + \pgfmathrotatepointaround{\rightpoint}{\centerpoint}{\rotate}% + }% + % + % ...and the border points. + % + \pgfextract@process\topborderpoint{% + \pgfmathrotatepointaround{\topborderpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\bottomborderpoint{% + \pgfmathrotatepointaround{\bottomborderpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\leftborderpoint{% + \pgfmathrotatepointaround{\leftborderpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\rightborderpoint{% + \pgfmathrotatepointaround{\rightborderpoint}{\centerpoint}{\rotate}% + }% + % + % Now save it all. + % + \addtosavedmacro{\rotate}% + \addtosavedmacro{\externalradius}% + % + \addtosavedmacro\toppoint% + \addtosavedmacro\bottompoint% + \addtosavedmacro\leftpoint% + \addtosavedmacro\rightpoint% + % + \addtosavedmacro\topborderpoint% + \addtosavedmacro\bottomborderpoint% + \addtosavedmacro\leftborderpoint% + \addtosavedmacro\rightborderpoint% + % + \addtosavedmacro\angletotoppoint% + \addtosavedmacro\angletobottompoint% + \addtosavedmacro\angletoleftpoint% + \addtosavedmacro\angletorightpoint% + % + \addtosavedmacro\baseangletotoppoint% + \addtosavedmacro\baseangletobottompoint% + \addtosavedmacro\baseangletoleftpoint% + \addtosavedmacro\baseangletorightpoint% + % + \addtosavedmacro\midangletotoppoint% + \addtosavedmacro\midangletobottompoint% + \addtosavedmacro\midangletoleftpoint% + \addtosavedmacro\midangletorightpoint% + }% + \savedanchor\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \savedanchor\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + \anchor{center}{\centerpoint}% + \anchor{base}{\basepoint}% + \anchor{base west}{% + \installkiteparameters% + \let\pgf@kiteanchorborderreferencepoint\basepoint% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{base east}{% + \installkiteparameters% + \let\pgf@kiteanchorborderreferencepoint\basepoint% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{mid}{\midpoint}% + \anchor{mid west}{% + \installkiteparameters% + \let\pgf@kiteanchorborderreferencepoint\midpoint% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{mid east}{% + \installkiteparameters% + \let\pgf@kiteanchorborderreferencepoint\midpoint% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{north}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{0pt}{\externalradius}}% + }% + \anchor{south}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}% + }% + \anchor{east}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{west}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{north east}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}% + }% + \anchor{south west}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}% + }% + \anchor{south east}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}% + }% + \anchor{north west}{% + \installkiteparameters% + \csname pgf@anchor@kite@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}% + }% + \anchor{upper vertex}{% + \installkiteparameters% + \topborderpoint}% + \anchor{lower vertex}{% + \installkiteparameters% + \bottomborderpoint}% + \anchor{left vertex}{% + \installkiteparameters% + \leftborderpoint}% + \anchor{right vertex}{% + \installkiteparameters% + \rightborderpoint}% + \anchor{upper left side}{% + \installkiteparameters% + \pgfpointlineattime{0.5}{\topborderpoint}{\leftborderpoint}}% + \anchor{lower left side}{% + \installkiteparameters% + \pgfpointlineattime{0.5}{\bottomborderpoint}{\leftborderpoint}}% + \anchor{upper right side}{% + \installkiteparameters% + \pgfpointlineattime{0.5}{\topborderpoint}{\rightborderpoint}}% + \anchor{lower right side}{% + \installkiteparameters% + \pgfpointlineattime{0.5}{\bottomborderpoint}{\rightborderpoint}}% + \backgroundpath{% + \installkiteparameters% + \pgfpathmoveto{\toppoint}% + \pgfpathlineto{\leftpoint}% + \pgfpathlineto{\bottompoint}% + \pgfpathlineto{\rightpoint}% + \pgfpathclose% + }% + \anchorborder{% + % + % Save x and y. + % + \edef\externalx{\the\pgf@x}% + \edef\externaly{\the\pgf@y}% + % + % This allows anchors base east, base west, mid east and mid west, + % to redefine the `center' of the node to correctly calculate the + % border points. + % + \pgfutil@ifundefined{pgf@kiteanchorborderreferencepoint}% + {\let\referencepoint\centerpoint}% + {\let\referencepoint\pgf@kiteanchorborderreferencepoint}% + % + % Adjust the location of the external + % point relative to the reference point. + % + \referencepoint% + \pgf@xa\externalx\relax% + \pgf@ya\externaly\relax% + \advance\pgf@xa\pgf@x% + \advance\pgf@ya\pgf@y% + \edef\externalx{\the\pgf@xa}% + \edef\externaly{\the\pgf@ya}% + % + % Install the required points and angles. + % + \installkiteparameters% + % + % Get the angle of the external point relative to \referencepoint. + % + \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + % + % *Subtract* the rotation from the external angle. + % + \pgfmathsubtract@{\pgfmathresult}{\rotate}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\externalangle\pgfmathresult% + \ifx\referencepoint\basepoint% + \let\angletotoppoint\baseangletotoppoint% + \let\angletobottompoint\baseangletobottompoint% + \let\angletoleftpoint\baseangletoleftpoint% + \let\angletorightpoint\baseangletorightpoint% + \else% + \ifx\referencepoint\midpoint% + \let\angletotoppoint\midangletotoppoint% + \let\angletobottompoint\midangletobottompoint% + \let\angletoleftpoint\midangletoleftpoint% + \let\angletorightpoint\midangletorightpoint% + \fi\fi% + % + % Depending on the rotation, the angle to \rightborderpoint + % may be smaller than the angle to \topborderpoint. + % + \ifdim\angletorightpoint pt<\angletotoppoint pt\relax% + \ifdim\externalangle pt<\angletorightpoint pt\relax% + \let\firstpoint\rightborderpoint% + \let\secondpoint\bottomborderpoint% + \else% + \ifdim\externalangle pt<\angletotoppoint pt\relax% + \let\firstpoint\rightborderpoint% + \let\secondpoint\topborderpoint% + \else% + \ifdim\externalangle pt<\angletoleftpoint pt\relax% + \let\firstpoint\topborderpoint% + \let\secondpoint\leftborderpoint% + \else% + \ifdim\externalangle pt<\angletobottompoint pt\relax% + \let\firstpoint\leftborderpoint% + \let\secondpoint\bottomborderpoint% + \else% + \let\firstpoint\rightborderpoint% + \let\secondpoint\bottomborderpoint% + \fi% + \fi% + \fi% + \fi% + \else% + \ifdim\externalangle pt<\angletotoppoint pt\relax% + \let\firstpoint\rightborderpoint% + \let\secondpoint\topborderpoint% + \else% + \ifdim\externalangle pt<\angletoleftpoint pt\relax% + \let\firstpoint\leftborderpoint% + \let\secondpoint\topborderpoint% + \else% + \ifdim\externalangle pt<\angletobottompoint pt\relax% + \let\firstpoint\bottomborderpoint% + \let\secondpoint\leftborderpoint% + \else% + \ifdim\externalangle pt<\angletorightpoint pt\relax% + \let\firstpoint\rightborderpoint% + \let\secondpoint\bottomborderpoint% + \else% + \let\firstpoint\rightborderpoint% + \let\secondpoint\topborderpoint% + \fi% + \fi% + \fi% + \fi% + \fi% + \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + {\firstpoint}{\secondpoint}% + }% +}% @@ -2999,545 +2997,545 @@ % \pgfkeys{/pgf/.cd, - dart tip angle/.initial=45, - dart tail angle/.initial=135 -} + dart tip angle/.initial=45, + dart tail angle/.initial=135, +}% % Shape dart. % \pgfdeclareshape{dart}{% - \savedmacro\installdartparameters{% - % - % Get the halved angles (more useful). - % - \pgfmathdivide{\pgfkeysvalueof{/pgf/dart tip angle}}{2}% - \let\halftipangle\pgfmathresult% - \pgfmathdivide{\pgfkeysvalueof{/pgf/dart tail angle}}{2}% - \let\halftailangle\pgfmathresult% - % - % Calculate some common results. - % - \pgfmathcot@{\halftipangle}% - \let\cothalftipangle\pgfmathresult% - % - % Get the larger of the outer sep. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \edef\outersep{\the\pgf@x}% - % - % Calculate the centre, base and mid points of the node. - % - \pgfextract@process\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \pgfextract@process\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \pgfextract@process\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - % - % Get the (halved) dimension of the node. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - % - % Get the length of the dart tip. - % - \ifpgfshapeborderusesincircle% - % - % Get the (unrounded) rotation. - % - \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% - % - % Get the radius of the incircle. - % - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \pgf@x1.41421\pgf@x% - % - % Calculate the length of the dart tip. - % - \pgf@xa\cothalftipangle\pgf@x% - \advance\pgf@xa\pgf@x% - \else% - % - % Get the rotation (with rounding). - % - \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% - \afterassignment\pgfmath@gobbletilpgfmath@% - \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% - \advance\c@pgf@counta45\relax% - \divide\c@pgf@counta90\relax% - \multiply\c@pgf@counta90\relax% - \ifnum\c@pgf@counta<0\relax% - \advance\c@pgf@counta360\relax% - \fi% - \edef\rotate{\the\c@pgf@counta}% - % - % Flip the width and height of the node contents, - % according to the appropriate border rotation. - % - \ifnum\c@pgf@counta=90\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \else% - \ifnum\c@pgf@counta=270\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \fi% - \fi% - % - % Calculate the length of the dart tip. - % - \pgf@xa\cothalftipangle\pgf@y% - \advance\pgf@xa2.0\pgf@x% - \fi% - % - % Get the (half) separation of the dart tails. - % - \pgfmathsubtract@{\halftailangle}{\halftipangle}% - \pgfmathcosec@{\pgfmathresult}% - \pgf@ya\pgfmathresult\pgf@xa% - \pgfmathsin@{\halftipangle}% - \pgf@ya\pgfmathresult\pgf@ya% - \pgfmathcos@{\halftipangle}% - \pgf@ya\pgfmathresult\pgf@ya% - % - % Get the total length of the dart... - % - \pgf@xb\cothalftipangle\pgf@ya% - % - % and hence the length of the tails. - % - \pgf@xc-\pgf@xa% - \advance\pgf@xc\pgf@xb% - % - % Adjust for minimum height (length of the dart). - % - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@xb<\pgf@y% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xb}}% - \pgf@y\pgfmathresult\pgf@y% - \pgf@xa\pgfmath@tonumber{\pgf@y}\pgf@xa% - \pgf@xc\pgfmath@tonumber{\pgf@y}\pgf@xc% - \pgf@ya\pgfmath@tonumber{\pgf@y}\pgf@ya% - \pgf@x\pgfmath@tonumber{\pgf@y}\pgf@x% - \fi% - % - % Adjust for minimum width (tail separation length). - % - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum width}}% - \pgf@y.5\pgf@y% - \ifdim\pgf@ya<\pgf@y% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@ya}}% - \pgf@ya\pgf@y% - \pgf@y\pgfmathresult\pgf@y% - \pgf@xa\pgfmath@tonumber{\pgf@y}\pgf@xa% - \pgf@xc\pgfmath@tonumber{\pgf@y}\pgf@xc% - \pgf@x\pgfmath@tonumber{\pgf@y}\pgf@x% - \fi% - \edef\dartlength{\the\pgf@xa}% - \edef\deltax{\the\pgf@x}% - \edef\taillength{\the\pgf@xc}% - \edef\halftailseparation{\the\pgf@ya} - % - % Create the basic points on the dart (for the backgroundo path). - % - \pgfextract@process\tippoint{% - \centerpoint% - \advance\pgf@x\dartlength\relax% - \advance\pgf@x-\deltax\relax% - }% - \pgfextract@process\tailcenterpoint{% - \centerpoint% - \advance\pgf@x-\deltax\relax% - }% - \pgfextract@process\lefttailpoint{% - \centerpoint% - \advance\pgf@x-\deltax\relax% - \advance\pgf@x-\taillength\relax% - \advance\pgf@y\halftailseparation\relax% - }% - \pgfextract@process\righttailpoint{% - \centerpoint% - \advance\pgf@x-\deltax\relax% - \advance\pgf@x-\taillength\relax% - \advance\pgf@y-\halftailseparation\relax% - }% - % - % Calculate the miter vectors. At the dart tip... - % - \pgfextract@process\tipmiter{% - \pgfmathcosec@{\halftipangle}% - \pgf@x\outersep\relax% - \pgf@x\pgfmathresult\pgf@x% - \pgf@y0pt\relax% - }% - % - % ...at the tail center... - % - \pgfextract@process\tailcentermiter{% - \pgfmathcosec@{\halftailangle}% - \pgf@x-\outersep\relax% - \pgf@x\pgfmathresult\pgf@x% - \pgf@y0pt\relax% - }% - % - % ...at the left tail... - % - \pgfmathsubtract@{\halftailangle}{\halftipangle}% - \pgfmathdivide@{\pgfmathresult}{2}% - \let\angle\pgfmathresult% - \pgfmathcosec@{\pgfmathresult}% - \pgf@x\outersep\relax% - \pgf@x\pgfmathresult\pgf@x% - \pgfmathadd@{\angle}{90}% - \pgfmathsubtract{\pgfmathresult}{\halftailangle}% - \pgfmathsincos@{\pgfmathresult}% - \pgf@ya\pgfmathresultx\pgf@x% - \pgf@xa\pgfmathresulty\pgf@x% - \pgfextract@process\lefttailmiter{% - \pgf@x-\pgf@xa% - \pgf@y\pgf@ya% - }% - % - % ...and the right tail. - % - \pgfextract@process\righttailmiter{% - \pgf@x-\pgf@xa% - \pgf@y-\pgf@ya% - }% - % - % Create the border points. - % - \pgfextract@process\tipborderpoint{% - \pgfpointadd{\tippoint}{\tipmiter} - }% - \pgfextract@process\tailcenterborderpoint{% - \pgfpointadd{\tailcenterpoint}{\tailcentermiter}% - }% - \pgfextract@process\lefttailborderpoint{% - \pgfpointadd{\lefttailpoint}{\lefttailmiter}% - }% - \pgfextract@process\righttailborderpoint{% - \pgfpointadd{\righttailpoint}{\righttailmiter}% - }% - % - % Calculate the angles between the centerpoint - % and the *unrotated* borderpoints. - % - \pgfmathanglebetweenpoints{\centerpoint}{\tipborderpoint}% - \let\angletotip\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\tailcenterborderpoint}% - \let\angletotailcenter\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\lefttailborderpoint}% - \let\angletolefttail\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\righttailborderpoint}% - \let\angletorighttail\pgfmathresult% - % - % Calculate the angles between the *inversly rotated* - % basepoint and the *unrotated* borderpoints. - % - \pgfextract@process\rotatedbasepoint{% - \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\tipborderpoint}% - \let\baseangletotip\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\tailcenterborderpoint}% - \let\baseangletotailcenter\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lefttailborderpoint}% - \let\baseangletolefttail\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedbasepoint}{\righttailborderpoint}% - \let\baseangletorighttail\pgfmathresult% - % - % Calculate the angles between the *inversly rotated* - % midpoint and the *unrotated* borderpoints. - % - \pgfextract@process\rotatedmidpoint{% - \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% - }% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\tipborderpoint}% - \let\midangletotip\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\tailcenterborderpoint}% - \let\midangletotailcenter\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lefttailborderpoint}% - \let\midangletolefttail\pgfmathresult% - \pgfmathanglebetweenpoints{\rotatedmidpoint}{\righttailborderpoint}% - \let\midangletorighttail\pgfmathresult% - % - % Rotate the background path points. - % - \pgfextract@process\tippoint{% - \pgfmathrotatepointaround{\tippoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\tailcenterpoint{% - \pgfmathrotatepointaround{\tailcenterpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\lefttailpoint{% - \pgfmathrotatepointaround{\lefttailpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\righttailpoint{% - \pgfmathrotatepointaround{\righttailpoint}{\centerpoint}{\rotate}% - }% - % - % Calculate a radius guaranteed to be outside the dart. - % - \pgfextractx\pgf@xa{\pgfpointdiff{\lefttailborderpoint}{\tipborderpoint}}% - \pgfextracty\pgf@ya{\pgfpointdiff{\lefttailborderpoint}{\righttailborderpoint}}% - \ifdim\pgf@xa<0pt\relax% - \pgf@xa-\pgf@xa% - \fi% - \ifdim\pgf@ya<0pt\relax% - \pgf@ya-\pgf@ya% - \fi% - \ifdim\pgf@xa>\pgf@ya% - \edef\externalradius{\the\pgf@xa}% - \else% - \edef\externalradius{\the\pgf@ya}% - \fi% - % - % Rotate the border anchor points. - % - \pgfextract@process\tipborderpoint{% - \pgfmathrotatepointaround{\tipborderpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\tailcenterborderpoint{% - \pgfmathrotatepointaround{\tailcenterborderpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\lefttailborderpoint{% - \pgfmathrotatepointaround{\lefttailborderpoint}{\centerpoint}{\rotate}% - }% - \pgfextract@process\righttailborderpoint{% - \pgfmathrotatepointaround{\righttailborderpoint}{\centerpoint}{\rotate}% - }% - % - % Save everything. - % - \addtosavedmacro{\rotate}% - \addtosavedmacro{\externalradius}% - % - \addtosavedmacro{\tippoint}% - \addtosavedmacro{\tailcenterpoint}% - \addtosavedmacro{\lefttailpoint}% - \addtosavedmacro{\righttailpoint}% - % - \addtosavedmacro{\tipborderpoint}% - \addtosavedmacro{\tailcenterborderpoint}% - \addtosavedmacro{\lefttailborderpoint}% - \addtosavedmacro{\righttailborderpoint}% - % - \addtosavedmacro{\angletotip}% - \addtosavedmacro{\angletotailcenter}% - \addtosavedmacro{\angletolefttail}% - \addtosavedmacro{\angletorighttail}% - % - \addtosavedmacro{\baseangletotip}% - \addtosavedmacro{\baseangletotailcenter}% - \addtosavedmacro{\baseangletolefttail}% - \addtosavedmacro{\baseangletorighttail}% - % - \addtosavedmacro{\midangletotip}% - \addtosavedmacro{\midangletotailcenter}% - \addtosavedmacro{\midangletolefttail}% - \addtosavedmacro{\midangletorighttail}% - } - \savedanchor\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \savedanchor\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - \anchor{center}{\centerpoint}% - \anchor{base}{\basepoint}% - \anchor{base west}{% - \installdartparameters% - \let\pgf@dartanchorborderreferencepoint\basepoint% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - } - \anchor{base east}{% - \installdartparameters% - \let\pgf@dartanchorborderreferencepoint\basepoint% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - } - \anchor{mid}{\midpoint}% - \anchor{mid west}{% - \installdartparameters% - \let\pgf@dartanchorborderreferencepoint\midpoint% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - } - \anchor{mid east}{% - \installdartparameters% - \let\pgf@dartanchorborderreferencepoint\midpoint% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - } - \anchor{north}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{0pt}{\externalradius}}% - } - \anchor{south}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}% - } - \anchor{east}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% - } - \anchor{west}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% - } - \anchor{north east}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}% - } - \anchor{south west}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}% - } - \anchor{south east}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}% - } - \anchor{north west}{% - \installdartparameters% - \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}% - } - \anchor{tip}{% - \installdartparameters% - \tipborderpoint} - \anchor{left tail}{% - \installdartparameters% - \lefttailborderpoint} - \anchor{right tail}{% - \installdartparameters% - \righttailborderpoint} - \anchor{tail center}{% - \installdartparameters% - \tailcenterborderpoint} - \anchor{left side}{% - \installdartparameters% - \pgfpointlineattime{0.5}{\tipborderpoint}{\lefttailborderpoint}} - \anchor{right side}{% - \installdartparameters% - \pgfpointlineattime{0.5}{\tipborderpoint}{\righttailborderpoint}} - \backgroundpath{% - \installdartparameters% - \pgfpathmoveto{\tippoint}% - \pgfpathlineto{\lefttailpoint}% - \pgfpathlineto{\tailcenterpoint}% - \pgfpathlineto{\righttailpoint}% - \pgfpathclose% - } - \anchorborder{% - % - % Save x and y. - % - \edef\externalx{\the\pgf@x}% - \edef\externaly{\the\pgf@y}% - % - % This allows anchors base east, base west, mid east and mid west, - % to redefine the `center' of the node to correctly calculate the - % border points. - % - \pgfutil@ifundefined{pgf@dartanchorborderreferencepoint}% - {\let\referencepoint\centerpoint}% - {\let\referencepoint\pgf@dartanchorborderreferencepoint}% - % - % Adjust the location of the external - % point relative to the reference point. - % - \referencepoint% - \pgf@xa\externalx\relax% - \pgf@ya\externaly\relax% - \advance\pgf@xa\pgf@x% - \advance\pgf@ya\pgf@y% - \edef\externalx{\the\pgf@xa}% - \edef\externaly{\the\pgf@ya}% - % - % Install the required points and angles. - % - \installdartparameters% - % - % Get the angle of the external point relative to \referencepoint. - % - \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - % - % *Subtract* the rotation from the external angle. - % - \pgfmathsubtract@{\pgfmathresult}{\rotate}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\externalangle\pgfmathresult% - % - % Get the set of angles for the appropriate border point. - % - \ifx\referencepoint\basepoint% - \let\angletotip\baseangletotip% - \let\angletotailcenter\baseangletotailcenter% - \let\angletolefttail\baseangletolefttail% - \let\angletorighttail\baseangletorighttail% - \else% - \ifx\referencepoint\midpoint% - \let\angletotip\midangletotip% - \let\angletotailcenter\midangletotailcenter% - \let\angletolefttail\midangletolefttail% - \let\angletorighttail\midangletorighttail% - \fi\fi% - % - % Locate the appropriate line on the border... - % - \ifdim\externalangle pt<\angletotip pt\relax% - \let\firstpoint\tipborderpoint% - \let\secondpoint\righttailborderpoint% - \else% - \ifdim\externalangle pt<\angletolefttail pt\relax% - \let\firstpoint\lefttailborderpoint% - \let\secondpoint\tipborderpoint% - \else% - \ifdim\externalangle pt<\angletotailcenter pt\relax% - \let\firstpoint\lefttailborderpoint% - \let\secondpoint\tailcenterborderpoint% - \else% - \ifdim\externalangle pt<\angletorighttail pt\relax% - \let\firstpoint\righttailborderpoint% - \let\secondpoint\tailcenterborderpoint% - \else% - \let\firstpoint\tipborderpoint% - \let\secondpoint\righttailborderpoint% - \fi% - \fi% - \fi% - \fi% - % - % ...and thus the point on the border. - % - \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% - {\firstpoint}{\secondpoint}% - }% -} + \savedmacro\installdartparameters{% + % + % Get the halved angles (more useful). + % + \pgfmathdivide{\pgfkeysvalueof{/pgf/dart tip angle}}{2}% + \let\halftipangle\pgfmathresult% + \pgfmathdivide{\pgfkeysvalueof{/pgf/dart tail angle}}{2}% + \let\halftailangle\pgfmathresult% + % + % Calculate some common results. + % + \pgfmathcot@{\halftipangle}% + \let\cothalftipangle\pgfmathresult% + % + % Get the larger of the outer sep. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \edef\outersep{\the\pgf@x}% + % + % Calculate the centre, base and mid points of the node. + % + \pgfextract@process\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \pgfextract@process\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \pgfextract@process\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + % + % Get the (halved) dimension of the node. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + % + % Get the length of the dart tip. + % + \ifpgfshapeborderusesincircle% + % + % Get the (unrounded) rotation. + % + \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% + % + % Get the radius of the incircle. + % + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \pgf@x1.41421\pgf@x% + % + % Calculate the length of the dart tip. + % + \pgf@xa\cothalftipangle\pgf@x% + \advance\pgf@xa\pgf@x% + \else% + % + % Get the rotation (with rounding). + % + \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% + \afterassignment\pgfmath@gobbletilpgfmath@% + \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% + \advance\c@pgf@counta45\relax% + \divide\c@pgf@counta90\relax% + \multiply\c@pgf@counta90\relax% + \ifnum\c@pgf@counta<0\relax% + \advance\c@pgf@counta360\relax% + \fi% + \edef\rotate{\the\c@pgf@counta}% + % + % Flip the width and height of the node contents, + % according to the appropriate border rotation. + % + \ifnum\c@pgf@counta=90\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \else% + \ifnum\c@pgf@counta=270\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \fi% + \fi% + % + % Calculate the length of the dart tip. + % + \pgf@xa\cothalftipangle\pgf@y% + \advance\pgf@xa2.0\pgf@x% + \fi% + % + % Get the (half) separation of the dart tails. + % + \pgfmathsubtract@{\halftailangle}{\halftipangle}% + \pgfmathcosec@{\pgfmathresult}% + \pgf@ya\pgfmathresult\pgf@xa% + \pgfmathsin@{\halftipangle}% + \pgf@ya\pgfmathresult\pgf@ya% + \pgfmathcos@{\halftipangle}% + \pgf@ya\pgfmathresult\pgf@ya% + % + % Get the total length of the dart... + % + \pgf@xb\cothalftipangle\pgf@ya% + % + % and hence the length of the tails. + % + \pgf@xc-\pgf@xa% + \advance\pgf@xc\pgf@xb% + % + % Adjust for minimum height (length of the dart). + % + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@xb<\pgf@y% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@xb}}% + \pgf@y\pgfmathresult\pgf@y% + \pgf@xa\pgfmath@tonumber{\pgf@y}\pgf@xa% + \pgf@xc\pgfmath@tonumber{\pgf@y}\pgf@xc% + \pgf@ya\pgfmath@tonumber{\pgf@y}\pgf@ya% + \pgf@x\pgfmath@tonumber{\pgf@y}\pgf@x% + \fi% + % + % Adjust for minimum width (tail separation length). + % + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum width}}% + \pgf@y.5\pgf@y% + \ifdim\pgf@ya<\pgf@y% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@ya}}% + \pgf@ya\pgf@y% + \pgf@y\pgfmathresult\pgf@y% + \pgf@xa\pgfmath@tonumber{\pgf@y}\pgf@xa% + \pgf@xc\pgfmath@tonumber{\pgf@y}\pgf@xc% + \pgf@x\pgfmath@tonumber{\pgf@y}\pgf@x% + \fi% + \edef\dartlength{\the\pgf@xa}% + \edef\deltax{\the\pgf@x}% + \edef\taillength{\the\pgf@xc}% + \edef\halftailseparation{\the\pgf@ya} + % + % Create the basic points on the dart (for the background path). + % + \pgfextract@process\tippoint{% + \centerpoint% + \advance\pgf@x\dartlength\relax% + \advance\pgf@x-\deltax\relax% + }% + \pgfextract@process\tailcenterpoint{% + \centerpoint% + \advance\pgf@x-\deltax\relax% + }% + \pgfextract@process\lefttailpoint{% + \centerpoint% + \advance\pgf@x-\deltax\relax% + \advance\pgf@x-\taillength\relax% + \advance\pgf@y\halftailseparation\relax% + }% + \pgfextract@process\righttailpoint{% + \centerpoint% + \advance\pgf@x-\deltax\relax% + \advance\pgf@x-\taillength\relax% + \advance\pgf@y-\halftailseparation\relax% + }% + % + % Calculate the miter vectors. At the dart tip... + % + \pgfextract@process\tipmiter{% + \pgfmathcosec@{\halftipangle}% + \pgf@x\outersep\relax% + \pgf@x\pgfmathresult\pgf@x% + \pgf@y0pt\relax% + }% + % + % ...at the tail center... + % + \pgfextract@process\tailcentermiter{% + \pgfmathcosec@{\halftailangle}% + \pgf@x-\outersep\relax% + \pgf@x\pgfmathresult\pgf@x% + \pgf@y0pt\relax% + }% + % + % ...at the left tail... + % + \pgfmathsubtract@{\halftailangle}{\halftipangle}% + \pgfmathdivide@{\pgfmathresult}{2}% + \let\angle\pgfmathresult% + \pgfmathcosec@{\pgfmathresult}% + \pgf@x\outersep\relax% + \pgf@x\pgfmathresult\pgf@x% + \pgfmathadd@{\angle}{90}% + \pgfmathsubtract{\pgfmathresult}{\halftailangle}% + \pgfmathsincos@{\pgfmathresult}% + \pgf@ya\pgfmathresultx\pgf@x% + \pgf@xa\pgfmathresulty\pgf@x% + \pgfextract@process\lefttailmiter{% + \pgf@x-\pgf@xa% + \pgf@y\pgf@ya% + }% + % + % ...and the right tail. + % + \pgfextract@process\righttailmiter{% + \pgf@x-\pgf@xa% + \pgf@y-\pgf@ya% + }% + % + % Create the border points. + % + \pgfextract@process\tipborderpoint{% + \pgfpointadd{\tippoint}{\tipmiter} + }% + \pgfextract@process\tailcenterborderpoint{% + \pgfpointadd{\tailcenterpoint}{\tailcentermiter}% + }% + \pgfextract@process\lefttailborderpoint{% + \pgfpointadd{\lefttailpoint}{\lefttailmiter}% + }% + \pgfextract@process\righttailborderpoint{% + \pgfpointadd{\righttailpoint}{\righttailmiter}% + }% + % + % Calculate the angles between the centerpoint + % and the *unrotated* borderpoints. + % + \pgfmathanglebetweenpoints{\centerpoint}{\tipborderpoint}% + \let\angletotip\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\tailcenterborderpoint}% + \let\angletotailcenter\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\lefttailborderpoint}% + \let\angletolefttail\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\righttailborderpoint}% + \let\angletorighttail\pgfmathresult% + % + % Calculate the angles between the *inversely rotated* + % basepoint and the *unrotated* borderpoints. + % + \pgfextract@process\rotatedbasepoint{% + \pgfmathrotatepointaround{\basepoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\tipborderpoint}% + \let\baseangletotip\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\tailcenterborderpoint}% + \let\baseangletotailcenter\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\lefttailborderpoint}% + \let\baseangletolefttail\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedbasepoint}{\righttailborderpoint}% + \let\baseangletorighttail\pgfmathresult% + % + % Calculate the angles between the *inversely rotated* + % midpoint and the *unrotated* borderpoints. + % + \pgfextract@process\rotatedmidpoint{% + \pgfmathrotatepointaround{\midpoint}{\centerpoint}{-\rotate}% + }% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\tipborderpoint}% + \let\midangletotip\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\tailcenterborderpoint}% + \let\midangletotailcenter\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\lefttailborderpoint}% + \let\midangletolefttail\pgfmathresult% + \pgfmathanglebetweenpoints{\rotatedmidpoint}{\righttailborderpoint}% + \let\midangletorighttail\pgfmathresult% + % + % Rotate the background path points. + % + \pgfextract@process\tippoint{% + \pgfmathrotatepointaround{\tippoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\tailcenterpoint{% + \pgfmathrotatepointaround{\tailcenterpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\lefttailpoint{% + \pgfmathrotatepointaround{\lefttailpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\righttailpoint{% + \pgfmathrotatepointaround{\righttailpoint}{\centerpoint}{\rotate}% + }% + % + % Calculate a radius guaranteed to be outside the dart. + % + \pgfextractx\pgf@xa{\pgfpointdiff{\lefttailborderpoint}{\tipborderpoint}}% + \pgfextracty\pgf@ya{\pgfpointdiff{\lefttailborderpoint}{\righttailborderpoint}}% + \ifdim\pgf@xa<0pt\relax% + \pgf@xa-\pgf@xa% + \fi% + \ifdim\pgf@ya<0pt\relax% + \pgf@ya-\pgf@ya% + \fi% + \ifdim\pgf@xa>\pgf@ya% + \edef\externalradius{\the\pgf@xa}% + \else% + \edef\externalradius{\the\pgf@ya}% + \fi% + % + % Rotate the border anchor points. + % + \pgfextract@process\tipborderpoint{% + \pgfmathrotatepointaround{\tipborderpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\tailcenterborderpoint{% + \pgfmathrotatepointaround{\tailcenterborderpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\lefttailborderpoint{% + \pgfmathrotatepointaround{\lefttailborderpoint}{\centerpoint}{\rotate}% + }% + \pgfextract@process\righttailborderpoint{% + \pgfmathrotatepointaround{\righttailborderpoint}{\centerpoint}{\rotate}% + }% + % + % Save everything. + % + \addtosavedmacro{\rotate}% + \addtosavedmacro{\externalradius}% + % + \addtosavedmacro{\tippoint}% + \addtosavedmacro{\tailcenterpoint}% + \addtosavedmacro{\lefttailpoint}% + \addtosavedmacro{\righttailpoint}% + % + \addtosavedmacro{\tipborderpoint}% + \addtosavedmacro{\tailcenterborderpoint}% + \addtosavedmacro{\lefttailborderpoint}% + \addtosavedmacro{\righttailborderpoint}% + % + \addtosavedmacro{\angletotip}% + \addtosavedmacro{\angletotailcenter}% + \addtosavedmacro{\angletolefttail}% + \addtosavedmacro{\angletorighttail}% + % + \addtosavedmacro{\baseangletotip}% + \addtosavedmacro{\baseangletotailcenter}% + \addtosavedmacro{\baseangletolefttail}% + \addtosavedmacro{\baseangletorighttail}% + % + \addtosavedmacro{\midangletotip}% + \addtosavedmacro{\midangletotailcenter}% + \addtosavedmacro{\midangletolefttail}% + \addtosavedmacro{\midangletorighttail}% + }% + \savedanchor\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \savedanchor\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + \anchor{center}{\centerpoint}% + \anchor{base}{\basepoint}% + \anchor{base west}{% + \installdartparameters% + \let\pgf@dartanchorborderreferencepoint\basepoint% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{base east}{% + \installdartparameters% + \let\pgf@dartanchorborderreferencepoint\basepoint% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{mid}{\midpoint}% + \anchor{mid west}{% + \installdartparameters% + \let\pgf@dartanchorborderreferencepoint\midpoint% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{mid east}{% + \installdartparameters% + \let\pgf@dartanchorborderreferencepoint\midpoint% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{north}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{0pt}{\externalradius}}% + }% + \anchor{south}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}% + }% + \anchor{east}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{west}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{north east}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}% + }% + \anchor{south west}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}% + }% + \anchor{south east}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}% + }% + \anchor{north west}{% + \installdartparameters% + \csname pgf@anchor@dart@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}% + }% + \anchor{tip}{% + \installdartparameters% + \tipborderpoint}% + \anchor{left tail}{% + \installdartparameters% + \lefttailborderpoint}% + \anchor{right tail}{% + \installdartparameters% + \righttailborderpoint}% + \anchor{tail center}{% + \installdartparameters% + \tailcenterborderpoint}% + \anchor{left side}{% + \installdartparameters% + \pgfpointlineattime{0.5}{\tipborderpoint}{\lefttailborderpoint}}% + \anchor{right side}{% + \installdartparameters% + \pgfpointlineattime{0.5}{\tipborderpoint}{\righttailborderpoint}}% + \backgroundpath{% + \installdartparameters% + \pgfpathmoveto{\tippoint}% + \pgfpathlineto{\lefttailpoint}% + \pgfpathlineto{\tailcenterpoint}% + \pgfpathlineto{\righttailpoint}% + \pgfpathclose% + }% + \anchorborder{% + % + % Save x and y. + % + \edef\externalx{\the\pgf@x}% + \edef\externaly{\the\pgf@y}% + % + % This allows anchors base east, base west, mid east and mid west, + % to redefine the `center' of the node to correctly calculate the + % border points. + % + \pgfutil@ifundefined{pgf@dartanchorborderreferencepoint}% + {\let\referencepoint\centerpoint}% + {\let\referencepoint\pgf@dartanchorborderreferencepoint}% + % + % Adjust the location of the external + % point relative to the reference point. + % + \referencepoint% + \pgf@xa\externalx\relax% + \pgf@ya\externaly\relax% + \advance\pgf@xa\pgf@x% + \advance\pgf@ya\pgf@y% + \edef\externalx{\the\pgf@xa}% + \edef\externaly{\the\pgf@ya}% + % + % Install the required points and angles. + % + \installdartparameters% + % + % Get the angle of the external point relative to \referencepoint. + % + \pgfmathanglebetweenpoints{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + % + % *Subtract* the rotation from the external angle. + % + \pgfmathsubtract@{\pgfmathresult}{\rotate}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\externalangle\pgfmathresult% + % + % Get the set of angles for the appropriate border point. + % + \ifx\referencepoint\basepoint% + \let\angletotip\baseangletotip% + \let\angletotailcenter\baseangletotailcenter% + \let\angletolefttail\baseangletolefttail% + \let\angletorighttail\baseangletorighttail% + \else% + \ifx\referencepoint\midpoint% + \let\angletotip\midangletotip% + \let\angletotailcenter\midangletotailcenter% + \let\angletolefttail\midangletolefttail% + \let\angletorighttail\midangletorighttail% + \fi\fi% + % + % Locate the appropriate line on the border... + % + \ifdim\externalangle pt<\angletotip pt\relax% + \let\firstpoint\tipborderpoint% + \let\secondpoint\righttailborderpoint% + \else% + \ifdim\externalangle pt<\angletolefttail pt\relax% + \let\firstpoint\lefttailborderpoint% + \let\secondpoint\tipborderpoint% + \else% + \ifdim\externalangle pt<\angletotailcenter pt\relax% + \let\firstpoint\lefttailborderpoint% + \let\secondpoint\tailcenterborderpoint% + \else% + \ifdim\externalangle pt<\angletorighttail pt\relax% + \let\firstpoint\righttailborderpoint% + \let\secondpoint\tailcenterborderpoint% + \else% + \let\firstpoint\tipborderpoint% + \let\secondpoint\righttailborderpoint% + \fi% + \fi% + \fi% + \fi% + % + % ...and thus the point on the border. + % + \pgfpointintersectionoflines{\referencepoint}{\pgfqpoint{\externalx}{\externaly}}% + {\firstpoint}{\secondpoint}% + }% +}% @@ -3545,476 +3543,476 @@ % % /pgf/circular sector angle : the angle at the center of the sector. % -\pgfkeys{/pgf/circular sector angle/.initial=60} +\pgfkeys{/pgf/circular sector angle/.initial=60}% % Shape circular sector % \pgfdeclareshape{circular sector}{% - \savedmacro\installcircularsectorparameters{% - % - % Define a \centerpoint, \basepoint and \midpoint. - % - \pgfextract@process\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - % - % Get the larger of the outer sep. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \edef\outersep{\the\pgf@x}% - % - % Half of the sector angle is more useful. - % - \pgfmathmod{\pgfkeysvalueof{/pgf/circular sector angle}}{360}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\angle\pgfmathresult% - \pgfmathdivide@{\pgfmathresult}{2}% - \let\halfangle\pgfmathresult% - % - % Get some useful trigonometric stuff. - % - \pgfmathsin@{\halfangle}% - \let\sinehalfangle\pgfmathresult% - \pgfmathreciprocal@{\pgfmathresult}% - \let\cosechalfangle\pgfmathresult% - \pgfmathabs@{\halfangle}% - \pgfmathcos@{\pgfmathresult}% - \let\coshalfangle\pgfmathresult% - \pgf@x\pgfmathresult pt\relax% - \pgf@x\cosechalfangle\pgf@x% - \edef\cothalfangle{\pgfmath@tonumber{\pgf@x}}% - % - % Calculate the miter length at the center, - % according to the outer sep. - % - \pgf@x\outersep\relax% - \pgf@x\cosechalfangle\pgf@x% - \edef\centermiter{\the\pgf@x}% - % - % Get the start and end angles of the arc. - % - \pgfmathsubtract@{180}{\halfangle}% - \let\startangle\pgfmathresult% - \pgfmathadd@{180}{\halfangle}% - \let\endangle\pgfmathresult% - % - % Get (half) the node dimensions. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - % - % Calculate the radius of the sector and the `center offset', - % which is the distance between the center of the node and the - % center of the sector. - % - \ifpgfshapeborderusesincircle% - % - % Get the rotation. - % - \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% - % - % Calculate the incircle radius. - % - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \fi% - \pgf@x1.41421\pgf@x% - \pgf@xa\cosechalfangle\pgf@x% - % - % xa is the radius, xb the offset. - % - \pgf@xb\pgf@xa% - \advance\pgf@xa\pgf@x% - \else% - % - % Get the rotation (with rounding). - % - \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% - \afterassignment\pgfmath@gobbletilpgfmath@% - \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% - \advance\c@pgf@counta45\relax% - \divide\c@pgf@counta90\relax% - \multiply\c@pgf@counta90\relax% - \ifnum\c@pgf@counta<0\relax% - \advance\c@pgf@counta360\relax% - \fi% - \edef\rotate{\the\c@pgf@counta}% - % - % Swap the height and width for relevant angles. - % - \ifnum\c@pgf@counta=90\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \else% - \ifnum\c@pgf@counta=270\relax% - \pgf@xc\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xc% - \fi% - \fi% - % - % xa is the radius, xb the offset. - % - \pgf@xa\cosechalfangle\pgf@y% - \pgf@xa\coshalfangle\pgf@xa% - \advance\pgf@xa\pgf@x% - \pgf@xb\pgf@xa% - \advance\pgf@xa\pgf@x% - \pgfmathveclen@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@y}}% - \pgf@xa\pgfmathresult pt\relax% - \fi% - % - % Adjust for minimum height and width. - % - \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/minimum width}}% - \pgf@x.5\pgf@x% - \pgfmathsec@{\halfangle}% - \pgf@xc\pgfmathresult\pgf@xb% - \ifdim\pgf@xc<0pt\relax% - \pgf@xc-\pgf@xc% - \fi% - \ifdim\pgf@xc<\pgf@x% - \pgfmathreciprocal{\pgfmath@tonumber{\pgf@xc}}% - \pgf@xc\pgfmathresult\pgf@x% Increase by ratio. - \pgf@xa\pgfmath@tonumber{\pgf@xc}\pgf@xa% - \pgf@xb\pgfmath@tonumber{\pgf@xc}\pgf@xb% - \fi% - \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@xa<\pgf@y% - \pgfmathreciprocal{\pgfmath@tonumber{\pgf@xa}}% - \pgf@xc\pgfmathresult\pgf@y% Increase by ratio. - \pgf@xa\pgf@y% - \pgf@xb\pgfmath@tonumber{\pgf@xc}\pgf@xb% - \fi% - \edef\centeroffset{\the\pgf@xb}% - \edef\radius{\the\pgf@xa}% - % - % Calculate the radius at sector border and the arc corners. - % - \advance\pgf@xa\outersep\relax% - \edef\borderradius{\the\pgf@xa}% - \pgf@x\outersep\relax% - \pgf@x\cosechalfangle\pgf@x% - \pgf@x\coshalfangle\pgf@x% - \advance\pgf@xa\pgf@x% - \edef\cornerradius{\the\pgf@xa}% - % - % Calculate the *unrotated* points for the background path. - % - \pgfextract@process\sectorcenter{% - \centerpoint% - \advance\pgf@x\centeroffset% - }% - \pgfextract@process\arcstart{% - \pgfqpointpolar{\startangle}{\radius}% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \sectorcenter% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - % - % Calculate the *unrotated* points for the anchor border. - % - \pgfextract@process\sectorcenterborder{% - \sectorcenter% - \advance\pgf@x\centermiter\relax% - }% - \pgfextract@process\arcstartborder{% - \pgfqpointpolar{\startangle}{\borderradius}% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \sectorcenter% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - \pgfextract@process\arcendborder{% - \pgfqpointpolar{\endangle}{\borderradius}% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \sectorcenter% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - \pgfextract@process\arcstartcorner{% - \pgfqpointpolar{\startangle}{\cornerradius}% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \sectorcenterborder% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - \pgfextract@process\arcendcorner{% - \pgfqpointpolar{\endangle}{\cornerradius}% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \sectorcenterborder% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - % - % Calculate the *unrotated* corner angles to the \centerpoint. - % - \pgfmathanglebetweenpoints{\centerpoint}{\sectorcenterborder}% - \let\angletosectorcenterborder\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\arcstartborder}% - \let\angletoarcstartborder\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\arcendborder}% - \let\angletoarcendborder\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\arcstartcorner}% - \let\angletoarcstartcorner\pgfmathresult% - \pgfmathanglebetweenpoints{\centerpoint}{\arcendcorner}% - \let\angletoarcendcorner\pgfmathresult% - % - % Rotate the background path points around the note center. - % - \pgfextract@process\sectorcenter{% - \pgfmathrotatepointaround{\sectorcenter}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcstart{% - \pgfmathrotatepointaround{\arcstart}{\centerpoint}{\rotate}% - }% - % - % Rotate the border points around the note center. - % - \pgfextract@process\sectorcenterborder{% - \pgfmathrotatepointaround{\sectorcenterborder}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcstartborder{% - \pgfmathrotatepointaround{\arcstartborder}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcendborder{% - \pgfmathrotatepointaround{\arcendborder}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcstartcorner{% - \pgfmathrotatepointaround{\arcstartcorner}{\centerpoint}{\rotate}% - }% - \pgfextract@process\arcendcorner{% - \pgfmathrotatepointaround{\arcendcorner}{\centerpoint}{\rotate}% - }% - % - % Add the rotation to the start and end angles. - % - \pgfmathadd@{\startangle}{\rotate}% - \let\startangle\pgfmathresult% - \pgfmathadd@{\endangle}{\rotate}% - \let\endangle\pgfmathresult% - % - % Save everything. - % - % NB \addtosavedmacro is currently experimental. May get changed. - % - \addtosavedmacro{\rotate}% - \addtosavedmacro{\centeroffset}% - % - \addtosavedmacro{\radius}% - \addtosavedmacro{\borderradius}% - \addtosavedmacro{\cornerradius}% - % - \addtosavedmacro{\endangle}% - \addtosavedmacro{\startangle}% - % - \addtosavedmacro{\sectorcenter}% - \addtosavedmacro{\arcstart}% - % - \addtosavedmacro{\sectorcenterborder}% - \addtosavedmacro{\arcstartborder}% - \addtosavedmacro{\arcendborder}% - \addtosavedmacro{\arcstartcorner}% - \addtosavedmacro{\arcendcorner}% - % - \addtosavedmacro{\angletosectorcenterborder}% - \addtosavedmacro{\angletoarcstartborder}% - \addtosavedmacro{\angletoarcendborder}% - \addtosavedmacro{\angletoarcstartcorner}% - \addtosavedmacro{\angletoarcendcorner}% - }% - \savedanchor\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt\relax% - }% - \savedanchor\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+.5ex}% - }% - \anchor{center}{\centerpoint} - \anchor{base}{\basepoint} - \anchor{mid}{\midpoint} - \anchor{arc start}{% - \installcircularsectorparameters% - \arcstartcorner% - } - \anchor{arc end}{% - \installcircularsectorparameters% - \arcendcorner% - } - \anchor{sector center}{% - \installcircularsectorparameters% - \sectorcenterborder% - } - \anchor{arc center}{% - \installcircularsectorparameters% - \pgfmathadd@{\rotate}{180}% - \let\angle\pgfmathresult% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpointpolar{\angle}{\cornerradius}}% - } - \anchor{north}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{0pt}{\cornerradius}}% - } - \anchor{south}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{0pt}{-\cornerradius}}% - } - \anchor{east}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{0pt}}% - } - \anchor{west}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{0pt}}% - } - \anchor{north west}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{\cornerradius}}% - } - \anchor{south west}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{-\cornerradius}}% - } - \anchor{north east}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{\cornerradius}}% - } - \anchor{south east}{% - \installcircularsectorparameters% - \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{-\cornerradius}}% - } - \backgroundpath{% - \installcircularsectorparameters% - \pgfpathmoveto{\sectorcenter}% - \pgfpathlineto{\arcstart}% - \ifdim\endangle pt>360pt\relax% - \ifdim\startangle pt>360pt\relax% - \pgfpatharc{\startangle}{\endangle}{\radius}% - \else% - \pgfpatharc{\startangle}{360}{\radius}% - \pgfpatharc{0}{\endangle}{\radius}% - \fi% - \else% - \pgfpatharc{\startangle}{\endangle}{\radius}% - \fi% - \pgfpathclose% - }% - \anchorborder{% - % - % Save x and y. - % - \edef\externalx{\the\pgf@x}% - \edef\externaly{\the\pgf@y}% - % - % Adjust the location of the external point relative to \centerpoint. - % - \centerpoint% - \pgf@xa\externalx\relax% - \pgf@ya\externaly\relax% - \advance\pgf@xa\pgf@x% - \advance\pgf@ya\pgf@y% - \edef\externalx{\the\pgf@xa}% - \edef\externaly{\the\pgf@ya}% - % - % Install the required points and angles. - % - \installcircularsectorparameters% - % - % Get the angle of the external point to the \centerpoint. - % - \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% - \let\externalangle\pgfmathresult% - % - % *Subtract* the rotation from the external angle. - % - \pgfmathsubtract@{\pgfmathresult}{\rotate}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\angle\pgfmathresult% - % - % Determine if the line will cross the sector arc. - % - \ifdim\angle pt>\angletoarcendcorner pt\relax% - \let\firstpoint\arcendcorner% - \let\secondpoint\sectorcenterborder% - \else% - \ifdim\angle pt>\angletoarcendborder pt\relax% - \let\firstpoint\arcendborder% - \let\secondpoint\arcendcorner% - \else% - \ifdim\angle pt>\angletoarcstartborder pt\relax% - \let\firstpoint\pgfutil@empty% - \let\secondpoint\pgfutil@empty% - \else% - \ifdim\angle pt>\angletoarcstartcorner pt\relax% - \let\firstpoint\arcstartborder - \let\secondpoint\arcstartcorner - \else% - \let\firstpoint\sectorcenterborder% - \let\secondpoint\arcstartcorner% - \fi% - \fi% - \fi% - \fi% - \ifx\firstpoint\pgfutil@empty - % - % Calculate the angle from the centre of the semicircle to the - % point on the semicircle arc which intersects the line from - % the external point to the reference point... - % - \pgfmathanglebetweenlines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% - {\sectorcenter}{\centerpoint}% - \pgfmathsin@{\pgfmathresult}% - \let\sineangle\pgfmathresult% - \pgf@x\borderradius\relax% - \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}% - \let\reciprocalradius\pgfmathresult% - \pgf@x\centeroffset\relax% - \pgf@x\sineangle\pgf@x% - \pgf@x\reciprocalradius\pgf@x% - \pgfmathasin@{\pgfmath@tonumber{\pgf@x}}% - \pgf@x\pgfmathresult pt\relax% - \advance\pgf@x\externalangle pt\relax% - \edef\angle{\pgfmath@tonumber{\pgf@x}}% - % - % ...and thus the point on the border. - % - \pgfpointadd{\sectorcenter}{\pgfqpointpolar{\angle}{\borderradius}}% - \else% - % - % Calculate the the point where the semicircle chord intersects - % the line from the external point to the reference point. - % - \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% - {\firstpoint}{\secondpoint}% - \fi% - }% -} + \savedmacro\installcircularsectorparameters{% + % + % Define a \centerpoint, \basepoint and \midpoint. + % + \pgfextract@process\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + % + % Get the larger of the outer sep. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \edef\outersep{\the\pgf@x}% + % + % Half of the sector angle is more useful. + % + \pgfmathmod{\pgfkeysvalueof{/pgf/circular sector angle}}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\angle\pgfmathresult% + \pgfmathdivide@{\pgfmathresult}{2}% + \let\halfangle\pgfmathresult% + % + % Get some useful trigonometric stuff. + % + \pgfmathsin@{\halfangle}% + \let\sinehalfangle\pgfmathresult% + \pgfmathreciprocal@{\pgfmathresult}% + \let\cosechalfangle\pgfmathresult% + \pgfmathabs@{\halfangle}% + \pgfmathcos@{\pgfmathresult}% + \let\coshalfangle\pgfmathresult% + \pgf@x\pgfmathresult pt\relax% + \pgf@x\cosechalfangle\pgf@x% + \edef\cothalfangle{\pgfmath@tonumber{\pgf@x}}% + % + % Calculate the miter length at the center, + % according to the outer sep. + % + \pgf@x\outersep\relax% + \pgf@x\cosechalfangle\pgf@x% + \edef\centermiter{\the\pgf@x}% + % + % Get the start and end angles of the arc. + % + \pgfmathsubtract@{180}{\halfangle}% + \let\startangle\pgfmathresult% + \pgfmathadd@{180}{\halfangle}% + \let\endangle\pgfmathresult% + % + % Get (half) the node dimensions. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + % + % Calculate the radius of the sector and the `center offset', + % which is the distance between the center of the node and the + % center of the sector. + % + \ifpgfshapeborderusesincircle% + % + % Get the rotation. + % + \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% + % + % Calculate the incircle radius. + % + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \fi% + \pgf@x1.41421\pgf@x% + \pgf@xa\cosechalfangle\pgf@x% + % + % xa is the radius, xb the offset. + % + \pgf@xb\pgf@xa% + \advance\pgf@xa\pgf@x% + \else% + % + % Get the rotation (with rounding). + % + \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% + \afterassignment\pgfmath@gobbletilpgfmath@% + \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@% + \advance\c@pgf@counta45\relax% + \divide\c@pgf@counta90\relax% + \multiply\c@pgf@counta90\relax% + \ifnum\c@pgf@counta<0\relax% + \advance\c@pgf@counta360\relax% + \fi% + \edef\rotate{\the\c@pgf@counta}% + % + % Swap the height and width for relevant angles. + % + \ifnum\c@pgf@counta=90\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \else% + \ifnum\c@pgf@counta=270\relax% + \pgf@xc\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xc% + \fi% + \fi% + % + % xa is the radius, xb the offset. + % + \pgf@xa\cosechalfangle\pgf@y% + \pgf@xa\coshalfangle\pgf@xa% + \advance\pgf@xa\pgf@x% + \pgf@xb\pgf@xa% + \advance\pgf@xa\pgf@x% + \pgfmathveclen@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgf@y}}% + \pgf@xa\pgfmathresult pt\relax% + \fi% + % + % Adjust for minimum height and width. + % + \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/minimum width}}% + \pgf@x.5\pgf@x% + \pgfmathsec@{\halfangle}% + \pgf@xc\pgfmathresult\pgf@xb% + \ifdim\pgf@xc<0pt\relax% + \pgf@xc-\pgf@xc% + \fi% + \ifdim\pgf@xc<\pgf@x% + \pgfmathreciprocal{\pgfmath@tonumber{\pgf@xc}}% + \pgf@xc\pgfmathresult\pgf@x% Increase by ratio. + \pgf@xa\pgfmath@tonumber{\pgf@xc}\pgf@xa% + \pgf@xb\pgfmath@tonumber{\pgf@xc}\pgf@xb% + \fi% + \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@xa<\pgf@y% + \pgfmathreciprocal{\pgfmath@tonumber{\pgf@xa}}% + \pgf@xc\pgfmathresult\pgf@y% Increase by ratio. + \pgf@xa\pgf@y% + \pgf@xb\pgfmath@tonumber{\pgf@xc}\pgf@xb% + \fi% + \edef\centeroffset{\the\pgf@xb}% + \edef\radius{\the\pgf@xa}% + % + % Calculate the radius at sector border and the arc corners. + % + \advance\pgf@xa\outersep\relax% + \edef\borderradius{\the\pgf@xa}% + \pgf@x\outersep\relax% + \pgf@x\cosechalfangle\pgf@x% + \pgf@x\coshalfangle\pgf@x% + \advance\pgf@xa\pgf@x% + \edef\cornerradius{\the\pgf@xa}% + % + % Calculate the *unrotated* points for the background path. + % + \pgfextract@process\sectorcenter{% + \centerpoint% + \advance\pgf@x\centeroffset% + }% + \pgfextract@process\arcstart{% + \pgfqpointpolar{\startangle}{\radius}% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \sectorcenter% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + % + % Calculate the *unrotated* points for the anchor border. + % + \pgfextract@process\sectorcenterborder{% + \sectorcenter% + \advance\pgf@x\centermiter\relax% + }% + \pgfextract@process\arcstartborder{% + \pgfqpointpolar{\startangle}{\borderradius}% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \sectorcenter% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + \pgfextract@process\arcendborder{% + \pgfqpointpolar{\endangle}{\borderradius}% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \sectorcenter% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + \pgfextract@process\arcstartcorner{% + \pgfqpointpolar{\startangle}{\cornerradius}% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \sectorcenterborder% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + \pgfextract@process\arcendcorner{% + \pgfqpointpolar{\endangle}{\cornerradius}% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \sectorcenterborder% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + % + % Calculate the *unrotated* corner angles to the \centerpoint. + % + \pgfmathanglebetweenpoints{\centerpoint}{\sectorcenterborder}% + \let\angletosectorcenterborder\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\arcstartborder}% + \let\angletoarcstartborder\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\arcendborder}% + \let\angletoarcendborder\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\arcstartcorner}% + \let\angletoarcstartcorner\pgfmathresult% + \pgfmathanglebetweenpoints{\centerpoint}{\arcendcorner}% + \let\angletoarcendcorner\pgfmathresult% + % + % Rotate the background path points around the note center. + % + \pgfextract@process\sectorcenter{% + \pgfmathrotatepointaround{\sectorcenter}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcstart{% + \pgfmathrotatepointaround{\arcstart}{\centerpoint}{\rotate}% + }% + % + % Rotate the border points around the note center. + % + \pgfextract@process\sectorcenterborder{% + \pgfmathrotatepointaround{\sectorcenterborder}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcstartborder{% + \pgfmathrotatepointaround{\arcstartborder}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcendborder{% + \pgfmathrotatepointaround{\arcendborder}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcstartcorner{% + \pgfmathrotatepointaround{\arcstartcorner}{\centerpoint}{\rotate}% + }% + \pgfextract@process\arcendcorner{% + \pgfmathrotatepointaround{\arcendcorner}{\centerpoint}{\rotate}% + }% + % + % Add the rotation to the start and end angles. + % + \pgfmathadd@{\startangle}{\rotate}% + \let\startangle\pgfmathresult% + \pgfmathadd@{\endangle}{\rotate}% + \let\endangle\pgfmathresult% + % + % Save everything. + % + % NB \addtosavedmacro is currently experimental. May get changed. + % + \addtosavedmacro{\rotate}% + \addtosavedmacro{\centeroffset}% + % + \addtosavedmacro{\radius}% + \addtosavedmacro{\borderradius}% + \addtosavedmacro{\cornerradius}% + % + \addtosavedmacro{\endangle}% + \addtosavedmacro{\startangle}% + % + \addtosavedmacro{\sectorcenter}% + \addtosavedmacro{\arcstart}% + % + \addtosavedmacro{\sectorcenterborder}% + \addtosavedmacro{\arcstartborder}% + \addtosavedmacro{\arcendborder}% + \addtosavedmacro{\arcstartcorner}% + \addtosavedmacro{\arcendcorner}% + % + \addtosavedmacro{\angletosectorcenterborder}% + \addtosavedmacro{\angletoarcstartborder}% + \addtosavedmacro{\angletoarcendborder}% + \addtosavedmacro{\angletoarcstartcorner}% + \addtosavedmacro{\angletoarcendcorner}% + }% + \savedanchor\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt\relax% + }% + \savedanchor\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+.5ex}% + }% + \anchor{center}{\centerpoint}% + \anchor{base}{\basepoint}% + \anchor{mid}{\midpoint}% + \anchor{arc start}{% + \installcircularsectorparameters% + \arcstartcorner% + }% + \anchor{arc end}{% + \installcircularsectorparameters% + \arcendcorner% + }% + \anchor{sector center}{% + \installcircularsectorparameters% + \sectorcenterborder% + }% + \anchor{arc center}{% + \installcircularsectorparameters% + \pgfmathadd@{\rotate}{180}% + \let\angle\pgfmathresult% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpointpolar{\angle}{\cornerradius}}% + }% + \anchor{north}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{0pt}{\cornerradius}}% + }% + \anchor{south}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{0pt}{-\cornerradius}}% + }% + \anchor{east}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{0pt}}% + }% + \anchor{west}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{0pt}}% + }% + \anchor{north west}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{\cornerradius}}% + }% + \anchor{south west}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{-\cornerradius}{-\cornerradius}}% + }% + \anchor{north east}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{\cornerradius}}% + }% + \anchor{south east}{% + \installcircularsectorparameters% + \csname pgf@anchor@circular sector@border\endcsname{\pgfqpoint{\cornerradius}{-\cornerradius}}% + }% + \backgroundpath{% + \installcircularsectorparameters% + \pgfpathmoveto{\sectorcenter}% + \pgfpathlineto{\arcstart}% + \ifdim\endangle pt>360pt\relax% + \ifdim\startangle pt>360pt\relax% + \pgfpatharc{\startangle}{\endangle}{\radius}% + \else% + \pgfpatharc{\startangle}{360}{\radius}% + \pgfpatharc{0}{\endangle}{\radius}% + \fi% + \else% + \pgfpatharc{\startangle}{\endangle}{\radius}% + \fi% + \pgfpathclose% + }% + \anchorborder{% + % + % Save x and y. + % + \edef\externalx{\the\pgf@x}% + \edef\externaly{\the\pgf@y}% + % + % Adjust the location of the external point relative to \centerpoint. + % + \centerpoint% + \pgf@xa\externalx\relax% + \pgf@ya\externaly\relax% + \advance\pgf@xa\pgf@x% + \advance\pgf@ya\pgf@y% + \edef\externalx{\the\pgf@xa}% + \edef\externaly{\the\pgf@ya}% + % + % Install the required points and angles. + % + \installcircularsectorparameters% + % + % Get the angle of the external point to the \centerpoint. + % + \pgfmathanglebetweenpoints{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% + \let\externalangle\pgfmathresult% + % + % *Subtract* the rotation from the external angle. + % + \pgfmathsubtract@{\pgfmathresult}{\rotate}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\angle\pgfmathresult% + % + % Determine if the line will cross the sector arc. + % + \ifdim\angle pt>\angletoarcendcorner pt\relax% + \let\firstpoint\arcendcorner% + \let\secondpoint\sectorcenterborder% + \else% + \ifdim\angle pt>\angletoarcendborder pt\relax% + \let\firstpoint\arcendborder% + \let\secondpoint\arcendcorner% + \else% + \ifdim\angle pt>\angletoarcstartborder pt\relax% + \let\firstpoint\pgfutil@empty% + \let\secondpoint\pgfutil@empty% + \else% + \ifdim\angle pt>\angletoarcstartcorner pt\relax% + \let\firstpoint\arcstartborder + \let\secondpoint\arcstartcorner + \else% + \let\firstpoint\sectorcenterborder% + \let\secondpoint\arcstartcorner% + \fi% + \fi% + \fi% + \fi% + \ifx\firstpoint\pgfutil@empty + % + % Calculate the angle from the centre of the semicircle to the + % point on the semicircle arc which intersects the line from + % the external point to the reference point... + % + \pgfmathanglebetweenlines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% + {\sectorcenter}{\centerpoint}% + \pgfmathsin@{\pgfmathresult}% + \let\sineangle\pgfmathresult% + \pgf@x\borderradius\relax% + \pgfmathreciprocal@{\pgfmath@tonumber{\pgf@x}}% + \let\reciprocalradius\pgfmathresult% + \pgf@x\centeroffset\relax% + \pgf@x\sineangle\pgf@x% + \pgf@x\reciprocalradius\pgf@x% + \pgfmathasin@{\pgfmath@tonumber{\pgf@x}}% + \pgf@x\pgfmathresult pt\relax% + \advance\pgf@x\externalangle pt\relax% + \edef\angle{\pgfmath@tonumber{\pgf@x}}% + % + % ...and thus the point on the border. + % + \pgfpointadd{\sectorcenter}{\pgfqpointpolar{\angle}{\borderradius}}% + \else% + % + % Calculate the the point where the semicircle chord intersects + % the line from the external point to the reference point. + % + \pgfpointintersectionoflines{\centerpoint}{\pgfqpoint{\externalx}{\externaly}}% + {\firstpoint}{\secondpoint}% + \fi% + }% +}% @@ -4023,397 +4021,397 @@ % /pgf/shape aspect : Ratio between the x and y radii of the cylinder end. % /pgf/cylinder uses custom fill : Use a custom fill for the cylinder. % /pgf/cylinder end fill : Custom color for the cylinder end. -% /pgf/cylinder body fill : Custom color for the cylinderbody. +% /pgf/cylinder body fill : Custom color for the cylinder body. % \newif\ifpgfcylinderusescustomfill \pgfkeys{/pgf/.cd, - cylinder uses custom fill/.is if=pgfcylinderusescustomfill, - cylinder end fill/.initial=white, - cylinder body fill/.initial=white -} + cylinder uses custom fill/.is if=pgfcylinderusescustomfill, + cylinder end fill/.initial=white, + cylinder body fill/.initial=white, +}% \pgfdeclareshape{cylinder}{% - \savedmacro\getcylinderpoints{% - \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}% - \pgf@x\pgf@xc% - \advance\pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}% - \pgf@y\pgf@yc% - \advance\pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y.5\dp\pgfnodeparttextbox% - \ifpgfshapeborderusesincircle% - \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% - \ifdim\pgf@x<\pgf@y% - \pgf@x\pgf@y% - \else% - \pgf@y\pgf@x% - \fi% - \pgf@x1.414213\pgf@x% - \pgf@y1.414213\pgf@y% - \else% - \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \pgfmathsetcount\c@pgf@counta{+\pgfmathresult}% - \advance\c@pgf@counta45\relax% - \divide\c@pgf@counta90\relax% - \multiply\c@pgf@counta90\relax% - \edef\rotate{\the\c@pgf@counta}% - \ifnum\c@pgf@counta=90\relax% - \pgf@xa\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xa% - \pgf@yc\pgf@xc% - \else% - \ifnum\c@pgf@counta=270\relax% - \pgf@xa\pgf@x% - \pgf@x\pgf@y% - \pgf@y\pgf@xa% - \pgf@yc\pgf@xc% - \fi% - \fi% - \fi% - \addtosavedmacro\rotate% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \pgfutil@tempdima\pgfshapeaspect\pgf@ya% - \pgfutil@tempdimb\pgf@ya% - % - % Adjust for minimum height. - % - \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}% - \ifdim\pgfutil@tempdimb<.5\pgf@xc\relax% - \pgfutil@tempdimb.5\pgf@xc% - \pgf@ya\pgfutil@tempdimb% - \fi% - % - % Calculate how far the node contents can extend into the cylinder bottom. - % - \pgf@yb\pgfutil@tempdimb% - \advance\pgf@yb-\pgf@yc% - \pgfmathdivide@{\pgfmath@tonumber{\pgf@yb}}{\pgfmath@tonumber{\pgfutil@tempdimb}}% - \pgfmathasin@{\pgfmathresult}% - \pgfmathcos@{\pgfmathresult}% - \let\angle\pgfmathresult% - \pgf@xb\pgfmathresult\pgfutil@tempdima% - % - % Adjust for minimum width. - % - \pgf@x.5\pgflinewidth% - \advance\pgf@x2.0\pgf@xa% - \advance\pgf@x3.0\pgfutil@tempdima% - \advance\pgf@x-\pgf@xb% - \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum height}}% - \ifdim\pgf@x<\pgf@xc% - \advance\pgf@xc-\pgf@x% - \advance\pgf@xa.5\pgf@xc% - \fi% - % - % Add the larger of the outer sep to the radii. - % - \pgf@x\pgfutil@tempdima\relax% - \pgf@y\pgfutil@tempdimb\relax% - \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/outer xsep}}% - \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/outer ysep}}% - \ifdim\pgf@xc>\pgf@yc% - \advance\pgf@x\pgf@xc% - \advance\pgf@y\pgf@xc% - \edef\outersep{\the\pgf@xc}% - \else% - \advance\pgf@x\pgf@yc% - \advance\pgf@y\pgf@yc% - \edef\outersep{\the\pgf@yc}% - \fi% - \edef\xradius{\the\pgf@x}% - \edef\yradius{\the\pgf@y}% - \addtosavedmacro\xradius% - \addtosavedmacro\yradius% - \addtosavedmacro\outersep% - % - \pgfextract@process\cylindercenter{% - \pgf@x\pgfutil@tempdima% - \advance\pgf@x.5\pgflinewidth% - \advance\pgf@x\pgf@xb% - \pgf@x.5\pgf@x% - \pgf@y0pt% - }% - \addtosavedmacro\cylindercenter% - % - \pgfextract@process\beforetop{% - \pgf@x\pgf@xa% - \advance\pgf@x\pgfutil@tempdima% - \advance\pgf@x.5\pgflinewidth% - \pgf@y\pgf@ya% - }% - \pgfextract@process\afterbottom{% - \pgf@x-\pgf@xa% - \advance\pgf@x\pgf@xb% - \pgf@y\pgf@ya% - }% - \addtosavedmacro\beforetop% - \addtosavedmacro\afterbottom% - \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/outer ysep}}% - \pgfextract@process\beforetopanchor{% - \beforetop% - \advance\pgf@y\pgf@yc% - }% - \pgfextract@process\afterbottomanchor{% - \afterbottom% - \advance\pgf@y\pgf@yc% - }% - \addtosavedmacro\beforetopanchor% - \addtosavedmacro\afterbottomanchor% - % - \beforetopanchor% - \advance\pgf@x\xradius\relax% - \ifdim\pgf@x>\pgf@y% - \edef\externalradius{\the\pgf@x}% - \else% - \edef\externalradius{\the\pgf@y}% - \fi% - \addtosavedmacro\externalradius% - } - \savedanchor\centerpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y.5\ht\pgfnodeparttextbox% - \advance\pgf@y-.5\dp\pgfnodeparttextbox% - }% - \savedanchor\midpoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgfmathsetlength\pgf@y{+0.5ex}% - }% - \savedanchor\basepoint{% - \pgf@x.5\wd\pgfnodeparttextbox% - \pgf@y0pt% - }% - \anchor{center}{\centerpoint} - \anchor{shape center}{% - \getcylinderpoints% - \pgfmathrotatepointaround{\pgfpointadd{\cylindercenter}{\centerpoint}}% - {\centerpoint}{\rotate}% - }% - \anchor{mid}{\midpoint}% - \anchor{mid east}{% - \getcylinderpoints% - \let\pgf@cylinder@referencepoint\midpoint% - \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}% - }% - \anchor{mid west}{% - \getcylinderpoints% - \let\pgf@cylinder@referencepoint\midpoint% - \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}% - }% - \anchor{base}{\basepoint}% - \anchor{base east}{% - \getcylinderpoints% - \let\pgf@cylinder@referencepoint\basepoint% - \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}% - }% - \anchor{base west}{% - \getcylinderpoints% - \let\pgf@cylinder@referencepoint\basepoint% - \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}% - }% - \anchor{north}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{0pt}{\externalradius}}% - }% - \anchor{south}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{0pt}{-\externalradius}}% - }% - \anchor{east}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}% - }% - \anchor{west}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}% - }% - \anchor{north east}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{\externalradius}}% - }% - \anchor{south west}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{-\externalradius}}% - }% - \anchor{south east}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{-\externalradius}}% - }% - \anchor{north west}{% - \getcylinderpoints% - \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{\externalradius}}% - }% - \anchor{before top}{% - \getcylinderpoints% - \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor}{\centerpoint}}{\centerpoint}{\rotate}% - } - \anchor{top}{% - \getcylinderpoints% - \pgfmathrotatepointaround{% - \pgfpointadd{% - \beforetop% - \pgf@y0pt\relax% - \advance\pgf@x\xradius\relax% - }{\centerpoint}}{\centerpoint}{\rotate}% - } - \anchor{after top}{% - \getcylinderpoints% - \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}{\centerpoint}{\rotate}% - } - \anchor{before bottom}{% - \getcylinderpoints% - \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}{\centerpoint}{\rotate}% - } - \anchor{bottom}{% - \getcylinderpoints% - \pgfmathrotatepointaround{% - \pgfpointadd{% - \afterbottom% - \pgf@y0pt\relax% - \advance\pgf@x-\xradius\relax% - }{\centerpoint}}{\centerpoint}{\rotate}% - } - \anchor{after bottom}{% - \getcylinderpoints% - \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor}{\centerpoint}}{\centerpoint}{\rotate}% - } - \backgroundpath{% - \getcylinderpoints% - {% - \pgf@x\xradius\relax% - \advance\pgf@x-\outersep\relax% - \edef\xradius{\the\pgf@x}% - \pgf@y\yradius\relax% - \advance\pgf@y-\outersep\relax% - \edef\yradius{\the\pgf@y}% - \pgftransformshift{\centerpoint}% - \pgftransformrotate{\rotate}% - \pgfpathmoveto{\afterbottom}% - \pgfpatharc{90}{270}{\xradius and \yradius}% - \pgfpathlineto{\beforetop\pgf@y-\pgf@y}% - \pgfpatharc{-90}{90}{\xradius and \yradius}% - \pgfpathclose% - \pgfpathmoveto{\beforetop}% - \pgfpatharc{90}{270}{\xradius and \yradius}% - }% - }% - \behindbackgroundpath{% - \ifpgfcylinderusescustomfill% - \getcylinderpoints% - \pgf@x\xradius\relax% - \advance\pgf@x-\outersep\relax% - \edef\xradius{\the\pgf@x}% - \pgf@y\yradius\relax% - \advance\pgf@y-\outersep\relax% - \edef\yradius{\the\pgf@y}% - {% - \pgftransformshift{\centerpoint}% - \pgftransformrotate{\rotate}% - \pgfpathmoveto{\afterbottom}% - \pgfpatharc{90}{270}{\xradius and \yradius}% - \pgfpathlineto{\beforetop\pgf@y-\pgf@y}% - \pgfpatharc{270}{90}{\xradius and \yradius}% - \pgfpathclose% - \expandafter\pgfsetfillcolor\expandafter{\pgfkeysvalueof{/pgf/cylinder body fill}}% - \pgfusepath{fill}% - % - \pgfpathmoveto{\beforetop}% - \pgfpatharc{90}{-270}{\xradius and \yradius}% - \pgfpathclose - \expandafter\pgfsetfillcolor\expandafter{\pgfkeysvalueof{/pgf/cylinder end fill}}% - \pgfusepath{fill}% - }% - \fi% - }% - \anchorborder{% - \pgfextract@process\externalpoint{}% - \getcylinderpoints% - \pgfutil@ifundefined{pgf@cylinder@referencepoint}{\let\referencepoint\centerpoint}{% - \let\referencepoint\pgf@cylinder@referencepoint}% - \pgfextract@process\externalpoint{% - \externalpoint% - \pgf@xa\pgf@x% - \pgf@ya\pgf@y% - \referencepoint% - \advance\pgf@x\pgf@xa% - \advance\pgf@y\pgf@ya% - }% - \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}% - \pgfmathsubtract@{\pgfmathresult}{\rotate}% - \ifdim\pgfmathresult pt<0pt\relax% - \pgfmathadd@{\pgfmathresult}{360}% - \fi% - \let\externalangle\pgfmathresult% - % - \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\afterbottomanchor}{\centerpoint}}% - \ifdim\externalangle pt<\pgfmathresult pt\relax% - \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\beforetopanchor}{\centerpoint}}% - \ifdim\externalangle pt<\pgfmathresult pt\relax% - \pgfmathrotatepointaround{% - \pgfmathpointintersectionoflineandarc% - {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}% - {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}% - {% - \beforetop% - \pgf@xa\pgf@x% - \centerpoint% - \advance\pgf@x\pgf@xa% - }% - {0}{90}{\xradius and \yradius}% - }{\centerpoint}{\rotate}% - \else% - \pgfpointintersectionoflines{% - \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor}{\centerpoint}}% - {\centerpoint}{\rotate}}{% - \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor}{\centerpoint}}% - {\centerpoint}{\rotate}}% - {\referencepoint}{\externalpoint}% - \fi% - \else% - \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}% - \ifdim\externalangle pt>\pgfmathresult pt\relax% - \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}% - \ifdim\externalangle pt>\pgfmathresult pt\relax% - \pgfmathrotatepointaround{% - \pgfmathpointintersectionoflineandarc% - {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}% - {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}% - {% - \beforetop% - \pgf@xa\pgf@x% - \centerpoint - \advance\pgf@x\pgf@xa% - }% - {270}{360}{\xradius and \yradius}% - }{\centerpoint}{\rotate}% - \else% - \pgfpointintersectionoflines{% - \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}% - {\centerpoint}{\rotate}}{% - \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}% - {\centerpoint}{\rotate}}% - {\referencepoint}{\externalpoint}% - \fi% - \else% - \pgfmathrotatepointaround{% - \pgfmathpointintersectionoflineandarc% - {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}% - {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}% - {% - \afterbottom% - \pgf@xa\pgf@x% - \centerpoint - \advance\pgf@x\pgf@xa% - }% - {90}{270}{\xradius and \yradius}% - }{\centerpoint}{\rotate}% - \fi% - \fi% - } -} + \savedmacro\getcylinderpoints{% + \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}% + \pgf@x\pgf@xc% + \advance\pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}% + \pgf@y\pgf@yc% + \advance\pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y.5\dp\pgfnodeparttextbox% + \ifpgfshapeborderusesincircle% + \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}% + \ifdim\pgf@x<\pgf@y% + \pgf@x\pgf@y% + \else% + \pgf@y\pgf@x% + \fi% + \pgf@x1.414213\pgf@x% + \pgf@y1.414213\pgf@y% + \else% + \pgfmathmod{\pgfkeysvalueof{/pgf/shape border rotate}}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \pgfmathsetcount\c@pgf@counta{+\pgfmathresult}% + \advance\c@pgf@counta45\relax% + \divide\c@pgf@counta90\relax% + \multiply\c@pgf@counta90\relax% + \edef\rotate{\the\c@pgf@counta}% + \ifnum\c@pgf@counta=90\relax% + \pgf@xa\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xa% + \pgf@yc\pgf@xc% + \else% + \ifnum\c@pgf@counta=270\relax% + \pgf@xa\pgf@x% + \pgf@x\pgf@y% + \pgf@y\pgf@xa% + \pgf@yc\pgf@xc% + \fi% + \fi% + \fi% + \addtosavedmacro\rotate% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \pgfutil@tempdima\pgfshapeaspect\pgf@ya% + \pgfutil@tempdimb\pgf@ya% + % + % Adjust for minimum height. + % + \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum width}}% + \ifdim\pgfutil@tempdimb<.5\pgf@xc\relax% + \pgfutil@tempdimb.5\pgf@xc% + \pgf@ya\pgfutil@tempdimb% + \fi% + % + % Calculate how far the node contents can extend into the cylinder bottom. + % + \pgf@yb\pgfutil@tempdimb% + \advance\pgf@yb-\pgf@yc% + \pgfmathdivide@{\pgfmath@tonumber{\pgf@yb}}{\pgfmath@tonumber{\pgfutil@tempdimb}}% + \pgfmathasin@{\pgfmathresult}% + \pgfmathcos@{\pgfmathresult}% + \let\angle\pgfmathresult% + \pgf@xb\pgfmathresult\pgfutil@tempdima% + % + % Adjust for minimum width. + % + \pgf@x.5\pgflinewidth% + \advance\pgf@x2.0\pgf@xa% + \advance\pgf@x3.0\pgfutil@tempdima% + \advance\pgf@x-\pgf@xb% + \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/minimum height}}% + \ifdim\pgf@x<\pgf@xc% + \advance\pgf@xc-\pgf@x% + \advance\pgf@xa.5\pgf@xc% + \fi% + % + % Add the larger of the outer sep to the radii. + % + \pgf@x\pgfutil@tempdima\relax% + \pgf@y\pgfutil@tempdimb\relax% + \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/outer xsep}}% + \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/outer ysep}}% + \ifdim\pgf@xc>\pgf@yc% + \advance\pgf@x\pgf@xc% + \advance\pgf@y\pgf@xc% + \edef\outersep{\the\pgf@xc}% + \else% + \advance\pgf@x\pgf@yc% + \advance\pgf@y\pgf@yc% + \edef\outersep{\the\pgf@yc}% + \fi% + \edef\xradius{\the\pgf@x}% + \edef\yradius{\the\pgf@y}% + \addtosavedmacro\xradius% + \addtosavedmacro\yradius% + \addtosavedmacro\outersep% + % + \pgfextract@process\cylindercenter{% + \pgf@x\pgfutil@tempdima% + \advance\pgf@x.5\pgflinewidth% + \advance\pgf@x\pgf@xb% + \pgf@x.5\pgf@x% + \pgf@y0pt% + }% + \addtosavedmacro\cylindercenter% + % + \pgfextract@process\beforetop{% + \pgf@x\pgf@xa% + \advance\pgf@x\pgfutil@tempdima% + \advance\pgf@x.5\pgflinewidth% + \pgf@y\pgf@ya% + }% + \pgfextract@process\afterbottom{% + \pgf@x-\pgf@xa% + \advance\pgf@x\pgf@xb% + \pgf@y\pgf@ya% + }% + \addtosavedmacro\beforetop% + \addtosavedmacro\afterbottom% + \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/outer ysep}}% + \pgfextract@process\beforetopanchor{% + \beforetop% + \advance\pgf@y\pgf@yc% + }% + \pgfextract@process\afterbottomanchor{% + \afterbottom% + \advance\pgf@y\pgf@yc% + }% + \addtosavedmacro\beforetopanchor% + \addtosavedmacro\afterbottomanchor% + % + \beforetopanchor% + \advance\pgf@x\xradius\relax% + \ifdim\pgf@x>\pgf@y% + \edef\externalradius{\the\pgf@x}% + \else% + \edef\externalradius{\the\pgf@y}% + \fi% + \addtosavedmacro\externalradius% + }% + \savedanchor\centerpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y.5\ht\pgfnodeparttextbox% + \advance\pgf@y-.5\dp\pgfnodeparttextbox% + }% + \savedanchor\midpoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgfmathsetlength\pgf@y{+0.5ex}% + }% + \savedanchor\basepoint{% + \pgf@x.5\wd\pgfnodeparttextbox% + \pgf@y0pt% + }% + \anchor{center}{\centerpoint}% + \anchor{shape center}{% + \getcylinderpoints% + \pgfmathrotatepointaround{\pgfpointadd{\cylindercenter}{\centerpoint}}% + {\centerpoint}{\rotate}% + }% + \anchor{mid}{\midpoint}% + \anchor{mid east}{% + \getcylinderpoints% + \let\pgf@cylinder@referencepoint\midpoint% + \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{mid west}{% + \getcylinderpoints% + \let\pgf@cylinder@referencepoint\midpoint% + \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{base}{\basepoint}% + \anchor{base east}{% + \getcylinderpoints% + \let\pgf@cylinder@referencepoint\basepoint% + \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{base west}{% + \getcylinderpoints% + \let\pgf@cylinder@referencepoint\basepoint% + \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{north}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{0pt}{\externalradius}}% + }% + \anchor{south}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{0pt}{-\externalradius}}% + }% + \anchor{east}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{0pt}}% + }% + \anchor{west}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{0pt}}% + }% + \anchor{north east}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{\externalradius}}% + }% + \anchor{south west}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{-\externalradius}}% + }% + \anchor{south east}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{\externalradius}{-\externalradius}}% + }% + \anchor{north west}{% + \getcylinderpoints% + \pgf@anchor@cylinder@border{\pgfqpoint{-\externalradius}{\externalradius}}% + }% + \anchor{before top}{% + \getcylinderpoints% + \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor}{\centerpoint}}{\centerpoint}{\rotate}% + }% + \anchor{top}{% + \getcylinderpoints% + \pgfmathrotatepointaround{% + \pgfpointadd{% + \beforetop% + \pgf@y0pt\relax% + \advance\pgf@x\xradius\relax% + }{\centerpoint}}{\centerpoint}{\rotate}% + }% + \anchor{after top}{% + \getcylinderpoints% + \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}{\centerpoint}{\rotate}% + }% + \anchor{before bottom}{% + \getcylinderpoints% + \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}{\centerpoint}{\rotate}% + }% + \anchor{bottom}{% + \getcylinderpoints% + \pgfmathrotatepointaround{% + \pgfpointadd{% + \afterbottom% + \pgf@y0pt\relax% + \advance\pgf@x-\xradius\relax% + }{\centerpoint}}{\centerpoint}{\rotate}% + }% + \anchor{after bottom}{% + \getcylinderpoints% + \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor}{\centerpoint}}{\centerpoint}{\rotate}% + }% + \backgroundpath{% + \getcylinderpoints% + {% + \pgf@x\xradius\relax% + \advance\pgf@x-\outersep\relax% + \edef\xradius{\the\pgf@x}% + \pgf@y\yradius\relax% + \advance\pgf@y-\outersep\relax% + \edef\yradius{\the\pgf@y}% + \pgftransformshift{\centerpoint}% + \pgftransformrotate{\rotate}% + \pgfpathmoveto{\afterbottom}% + \pgfpatharc{90}{270}{\xradius and \yradius}% + \pgfpathlineto{\beforetop\pgf@y-\pgf@y}% + \pgfpatharc{-90}{90}{\xradius and \yradius}% + \pgfpathclose% + \pgfpathmoveto{\beforetop}% + \pgfpatharc{90}{270}{\xradius and \yradius}% + }% + }% + \behindbackgroundpath{% + \ifpgfcylinderusescustomfill% + \getcylinderpoints% + \pgf@x\xradius\relax% + \advance\pgf@x-\outersep\relax% + \edef\xradius{\the\pgf@x}% + \pgf@y\yradius\relax% + \advance\pgf@y-\outersep\relax% + \edef\yradius{\the\pgf@y}% + {% + \pgftransformshift{\centerpoint}% + \pgftransformrotate{\rotate}% + \pgfpathmoveto{\afterbottom}% + \pgfpatharc{90}{270}{\xradius and \yradius}% + \pgfpathlineto{\beforetop\pgf@y-\pgf@y}% + \pgfpatharc{270}{90}{\xradius and \yradius}% + \pgfpathclose% + \expandafter\pgfsetfillcolor\expandafter{\pgfkeysvalueof{/pgf/cylinder body fill}}% + \pgfusepath{fill}% + % + \pgfpathmoveto{\beforetop}% + \pgfpatharc{90}{-270}{\xradius and \yradius}% + \pgfpathclose + \expandafter\pgfsetfillcolor\expandafter{\pgfkeysvalueof{/pgf/cylinder end fill}}% + \pgfusepath{fill}% + }% + \fi% + }% + \anchorborder{% + \pgfextract@process\externalpoint{}% + \getcylinderpoints% + \pgfutil@ifundefined{pgf@cylinder@referencepoint}{\let\referencepoint\centerpoint}{% + \let\referencepoint\pgf@cylinder@referencepoint}% + \pgfextract@process\externalpoint{% + \externalpoint% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \referencepoint% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% + \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}% + \pgfmathsubtract@{\pgfmathresult}{\rotate}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi% + \let\externalangle\pgfmathresult% + % + \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\afterbottomanchor}{\centerpoint}}% + \ifdim\externalangle pt<\pgfmathresult pt\relax% + \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\beforetopanchor}{\centerpoint}}% + \ifdim\externalangle pt<\pgfmathresult pt\relax% + \pgfmathrotatepointaround{% + \pgfmathpointintersectionoflineandarc% + {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}% + {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}% + {% + \beforetop% + \pgf@xa\pgf@x% + \centerpoint% + \advance\pgf@x\pgf@xa% + }% + {0}{90}{\xradius and \yradius}% + }{\centerpoint}{\rotate}% + \else% + \pgfpointintersectionoflines{% + \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor}{\centerpoint}}% + {\centerpoint}{\rotate}}{% + \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor}{\centerpoint}}% + {\centerpoint}{\rotate}}% + {\referencepoint}{\externalpoint}% + \fi% + \else% + \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}% + \ifdim\externalangle pt>\pgfmathresult pt\relax% + \pgfmathanglebetweenpoints{\referencepoint}{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}% + \ifdim\externalangle pt>\pgfmathresult pt\relax% + \pgfmathrotatepointaround{% + \pgfmathpointintersectionoflineandarc% + {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}% + {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}% + {% + \beforetop% + \pgf@xa\pgf@x% + \centerpoint + \advance\pgf@x\pgf@xa% + }% + {270}{360}{\xradius and \yradius}% + }{\centerpoint}{\rotate}% + \else% + \pgfpointintersectionoflines{% + \pgfmathrotatepointaround{\pgfpointadd{\afterbottomanchor\pgf@y-\pgf@y}{\centerpoint}}% + {\centerpoint}{\rotate}}{% + \pgfmathrotatepointaround{\pgfpointadd{\beforetopanchor\pgf@y-\pgf@y}{\centerpoint}}% + {\centerpoint}{\rotate}}% + {\referencepoint}{\externalpoint}% + \fi% + \else% + \pgfmathrotatepointaround{% + \pgfmathpointintersectionoflineandarc% + {\pgfmathrotatepointaround{\externalpoint}{\centerpoint}{-\rotate}}% + {\pgfmathrotatepointaround{\referencepoint}{\centerpoint}{-\rotate}}% + {% + \afterbottom% + \pgf@xa\pgf@x% + \centerpoint + \advance\pgf@x\pgf@xa% + }% + {90}{270}{\xradius and \yradius}% + }{\centerpoint}{\rotate}% + \fi% + \fi% + }% +}% |