%% $Id: pst-fractal.tex 1162 2020-03-16 19:18:15Z herbert $
%%
%% This is file `pst-fractal.tex',
%%
%% IMPORTANT NOTICE:
%%
%% Package `pst-fractal.tex'
%%
%% Herbert Voss <hvoss _at_ tug.org>
%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN archives
%% in directory macros/latex/base/lppl.txt.
%%
%% DESCRIPTION:
%%   `pst-fractal' is a PSTricks package to draw Julia and
%%       Mandelbrot sets as well as Sierpinski, ...
%%
\csname PSTfractalLoaded\endcsname
\let\PSTfractalLoaded\endinput
\ifx\PSTricksLoaded\endinput\else   \input pstricks.tex\fi
\ifx\PSTfuncLoaded\endinput \else   \input pst-func.tex\fi
\ifx\PSTricksAddLoaded\endinput\else\input pstricks-add.tex\fi
\ifx\PSTXKeyLoaded\endinput\else    \input pst-xkey \fi
%
\def\fileversion{0.12}
\def\filedate{2022/10/13}
\message{`PST-fractal' v\fileversion, \filedate\space (hv)}
%
\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
\pst@addfams{pst-fractal}
\pstheader{pst-fractal.pro}
%\SpecialCoor
%
\newdimen\pst@fractal@xWidth
\define@key[psset]{pst-fractal}{xWidth}[1cm]{\pssetlength\pst@fractal@xWidth{#1}}
\newdimen\pst@fractal@yWidth
\define@key[psset]{pst-fractal}{yWidth}[1cm]{\pssetlength\pst@fractal@yWidth{#1}}
\psset[pst-fractal]{xWidth=1cm,yWidth=1cm}
\define@key[psset]{pst-fractal}{type}[Julia]{\def\pst@fractal@type{#1}}
\psset[pst-fractal]{type=Julia}% or type=Mandel
\def\pst@fractal@Julia{Julia}\def\pst@fractal@Mandel{Mandel}
\define@key[psset]{pst-fractal}{baseColor}[white]{\pst@getcolor{#1}\pst@fractal@baseColor}
\psset[pst-fractal]{baseColor=white}
\define@key[psset]{pst-fractal}{function}[z z cxmul c cxadd ]{\def\pst@fractal@function{#1 }}
\psset{function=z z cxmul c cxadd}

%
\define@key[psset]{pst-fractal}{cx}[0]{\def\pst@fractal@cx{#1 }}
\define@key[psset]{pst-fractal}{cy}[0]{\def\pst@fractal@cy{#1 }}
\define@key[psset]{pst-fractal}{dIter}[1]{\def\pst@fractal@dIter{#1 }}
\psset[pst-fractal]{cx=0,cy=0,dIter=1}
\define@key[psset]{pst-fractal}{maxIter}[255]{\pst@checknum{#1}\pst@fractal@maxIter}
\define@key[psset]{pst-fractal}{maxRadius}[100]{\pst@checknum{#1}\pst@fractal@maxRadius}
\psset[pst-fractal]{maxIter=255,maxRadius=100}
\define@key[psset]{pst-fractal}{plotpoints}[2000]{\pst@checknum{#1}\pst@fractal@plotpoints}
\psset[pst-fractal]{plotpoints=2000}
%
\define@key[psset]{pst-fractal}{angle}[0]{\pst@getangle{#1}\pst@fractal@angle}
\define@key[psset]{pst-fractal}{c}[5]{\pst@checknum{#1}\pst@fractal@c}
\newdimen\pst@fractal@minWidth
\define@key[psset]{pst-fractal}{minWidth}[1pt]{\pssetlength\pst@fractal@minWidth{#1}}
\psset[pst-fractal]{angle=0,c=5,minWidth=1pt}
%
\define@key[psset]{pst-fractal}{scale}[1]{\pst@getscale{#1}{\pst@fractal@scale}%
    \let\pst@fractal@Xscale\pst@tempg}
\psset[pst-fractal]{scale=1}
%
\def\pst@fractal@radius{0.001 }
%
\newdimen\pst@fractal@Radius
\define@key[psset]{pst-fractal}{Radius}[5cm]{\pssetlength\pst@fractal@Radius{#1}}
\define@boolkey[psset]{pst-fractal}[Pst@fractal@]{Color}[true]{}
\psset[pst-fractal]{Radius=5cm,Color=false}
%
\define@key[psset]{pst-fractal}{n}{\def\pst@fractal@n{#1 }} 
\define@key[psset]{pst-fractal}{dotcolor}{\pst@getcolor{#1}\psdotcolor}
\define@key[psset]{pst-fractal}{N}{\def\pst@fractal@N{#1}}  
\psset[pst-fractal]{n=3,N=all,dotcolor=red}

\define@key[psset]{pst-fractal}{i}{\def\pst@fractal@i{#1 }} % i-Fibonacci
\define@key[psset]{pst-fractal}{morphism}{\def\pst@fractal@morphism{#1}} % les substitutions
\define@boolkey[psset]{pst-fractal}[Pst@]{juxtaposition}[true]{} %
\define@key[psset]{pst-fractal}{colorF}{\pst@getcolor{#1}\pscolorF}
\psset[pst-fractal]{morphism=(0) (1) (2),juxtaposition=false,colorF=red,i=6}
%
%===========================================================
%
\def\psCantor{\pst@object{psCantor}}
\def\psCantor@i{%
  \addbefore@par{n=5,xWidth=10cm,yWidth=5mm,linewidth=2mm}
  \begin@SpecialObj
  \addto@pscode{
    /N@ \pst@fractal@n def
%    \pst@number\psunit dup scale
    /v 0 def
    /deltaV \pst@number\pst@fractal@yWidth def
    0 0 moveto
    /cantor_set { %  x0 x1 v n
      4 dict begin
      /n exch def
      /v exch def
      /x1 exch def
      /x0 exch def 
      x0 v moveto 
      x1 v lineto \pst@usecolor\pslinecolor \pst@number\pslinewidth stroke
      n 1 gt { 
        x0 dup dup add x1 add 3 div v deltaV sub n 1 sub cantor_set
        x0 x1 dup add add 3 div x1 v deltaV sub n 1 sub cantor_set
      } if
      end
    } def 
    0 \pst@number\pst@fractal@xWidth 0 N@ cantor_set
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces} 
%
\def\psHilbert{\pst@object{psHilbert}}
\def\psHilbert@i{%
  \addbefore@par{n=4,N=all,dotcolor=red}
  \begin@SpecialObj
  \addto@pscode{
    /N@ \pst@fractal@n def
    /NbrePts (\pst@fractal@N) def
    NbrePts (all) eq {/Npts 4 N@ 1 add exp cvi def}{/Npts NbrePts cvi def Npts 4 N@ 1 add exp gt {/Npts 4 N@ 1 add exp cvi def} if } ifelse
    /dotcolor {\pst@usecolor\psdotcolor } def
    /cmunit {\pst@number\psunit mul} bind def 
    tx@fractalDict begin HilbertFractal 
    \psls@solid
    \ifshowpoints
      0 2 HilbertCurve length 2 sub {
	/i exch def
        i 2 div Npts ge {exit} if
        HilbertCurve i get
        HilbertCurve i 1 add get
        \psk@dotsize DS
        0 360 arc dotcolor fill
      } for
    \fi
    end 
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces} 
%
\def\psFibonacci{\pst@object{psFibonacci}}
\def\psFibonacci@i{%
  \addbefore@par{n=10, angle=90}%
  \begin@SpecialObj
  \addto@pscode{
    /cmunit {\pst@number\psunit mul} bind def % mise à l'échelle
    /angle \pst@fractal@angle def
    /n@ \pst@fractal@n def
    n@ 3 le {/n@ 3 def} if
    /ColorF { \pst@usecolor\pscolorF } def
    /setLineColor { \pst@usecolor\pslinecolor } def
    /Pst@juxtaposition \ifPst@juxtaposition true \else false \fi def
    /F1 (1) def
    /F2 (0) def
    /tx { x1 x0 sub } def
    /ty { y1 y0 sub } def
    /x0 0 def /y0 0 def
    x0 y0 moveto
    /x1 0 def /y1 1 cmunit def
    x1 y1 lineto
    tx@fractalDict begin FibonacciFractal end
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}
%
%
\def\psNewFibonacci{\def\pst@par{}\pst@object{psNewFibonacci}}
\def\psNewFibonacci@i{%
  \addbefore@par{n=10, angle=90}%
  \begin@SpecialObj
  \addto@pscode{
    /cmunit {\pst@number\psunit mul} bind def % mise � l'�chelle
    /angle \pst@fractal@angle def
    /n@ \pst@fractal@n def
    n@ 3 le {/n@ 3 def} if
    /morhism [\pst@fractal@morphism] def
    /setLineColor { \pst@usecolor\pslinecolor } def
    /m@0 morhism 0 get def
    /m@1 morhism 1 get def
    /m@2 morhism 2 get def
    /F1 (1) def
    /F2 (0) def
    /tx {x1 x0 sub} def
    /ty {y1 y0 sub} def
    /x0 0 def /y0 0 def
    x0 y0 moveto
    /x1 0 def /y1 1 cmunit def
    x1 y1 lineto
    tx@fractalDict begin newFibonacciFractal end
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}
%
% i-Fibonacci
\def\psiFibonacci{\def\pst@par{}\pst@object{psiFibonacci}}
\def\psiFibonacci@i{%
  \addbefore@par{angle=90}%
  \begin@SpecialObj
  \addto@pscode{
    /cmunit {\pst@number\psunit mul} def 
    /angle \pst@fractal@angle def
    /n@ \pst@fractal@n def
    n@ 3 le {/n@ 3 def} if
    /i@ \pst@fractal@i def
    /setLineColor { \pst@usecolor\pslinecolor } bind def
    tx@fractalDict begin i-FibonacciFractal end
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}
%
% 30 septembre 2017
% k-Fibonacci
\define@key[psset]{pst-fractal}{k}{\def\pst@fractal@k{#1 }} % k
\psset[pst-fractal]{k=5}
%
\def\pskFibonacci{\def\pst@par{}\pst@object{pskFibonacci}}
\def\pskFibonacci@i{\@ifnextchar({\pskFibonacci@ii}{\pskFibonacci@ii(0,0)}}
\def\pskFibonacci@ii(#1){%
  \addbefore@par{k=5,angle=90}%
  \begin@SpecialObj
  \pst@@getcoor{#1}%
  \addto@pscode{
     \pst@coor /t@y ED /t@x ED
    /cmunit {\pst@number\psunit mul} bind def % mise � l'�chelle
    /cmunit_1 {\pst@number\psunit div} bind def % mise � l'�chelle
    /angle \pst@fractal@angle def
    /n@ \pst@fractal@n def
    /k@ \pst@fractal@k def
    /setLineColor { \pst@usecolor\pslinecolor } def
    tx@fractalDict begin k-FibonacciFractal end
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}
%
% 1 octobre 2017
% Biperiodic-Fibonacci-Words
\define@key[psset]{pst-fractal}{a}{\def\pst@fractal@a{#1 }} % k
\psset[pst-fractal]{a=5}
\define@key[psset]{pst-fractal}{b}{\def\pst@fractal@b{#1 }} % k
\psset[pst-fractal]{b=5}
%
\def\psBiperiodicFibonacci{\def\pst@par{}\pst@object{psBiperiodicFibonacci}}
\def\psBiperiodicFibonacci@i{\@ifnextchar({\psBiperiodicFibonacci@ii}{\psBiperiodicFibonacci@ii(0,0)}}
\def\psBiperiodicFibonacci@ii(#1){%
  \addbefore@par{a=5,b=5,angle=90,n=3,k=5}
  \begin@SpecialObj
  \pst@@getcoor{#1}%
  \addto@pscode{
    \pst@coor /t@y ED /t@x ED
    /cmunit {\pst@number\psunit mul} bind def 
    /cmunit_1 {\pst@number\psunit div} bind def 
    /a@ \pst@fractal@a def
    /b@ \pst@fractal@b def
    /angle \pst@fractal@angle def
    /n@ \pst@fractal@n def
    /k@ \pst@fractal@k def
    /setLineColor { \pst@usecolor\pslinecolor } def
    tx@fractalDict begin Biperiodic-FibonacciWords end
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}
%
% 3 octobre 2017
%
\def\psFibonacciPolyominoes{\pst@object{psFibonacciPolyominoes}}
\def\psFibonacciPolyominoes@i{\@ifnextchar({\psFibonacciPolyominoes@ii}{\psFibonacciPolyominoes@ii(0,0)}}
\def\psFibonacciPolyominoes@ii(#1){%
  \addbefore@par{n=3}
  \begin@SpecialObj
  \pst@@getcoor{#1}%
  \addto@pscode{
     \pst@coor /t@y ED /t@x ED
    /cmunit {\pst@number\psunit mul} bind def % mise � l'�chelle
    /n@ \pst@fractal@n def
    /setFillColor {
      \ifx\psk@fillstyle\relax\else
        gsave \pst@usecolor\psfillcolor fill grestore
      \fi } def    
    /setLineColor{ \ifx\pslinestyle\@none\else stroke \fi } def
    tx@fractalDict begin FibonacciPolyominoes end
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}
%
% type de fonte et taille
\define@boolkey[psset]{pst-fractal}[Pst@]{DFW}[true]{} %
\define@boolkey[psset]{pst-fractal}[Pst@]{iFibonacci}[true]{} %
\psset[pst-fractal]{DFW=false,iFibonacci=false} %
%
\def\psFibonacciWord{\pst@object{psFibonacciWord}}
\def\psFibonacciWord@i{\@ifnextchar({\psFibonacciWord@ii}{\psFibonacciWord@ii(0,0)}}
\def\psFibonacciWord@ii(#1,#2){%
  \addbefore@par{%PSfont=Times-Roman,
  fontscale=8}
  \begin@SpecialObj
  \addto@pscode{
    /n@ \pst@fractal@n def
    /i@ \pst@fractal@i def
    n@ 3 le {/n@ 3 def} if
    /cmunit {\pst@number\psunit mul} bind def % mise � l'�chelle
    /PSfont {\psk@PSfont} def
    PSfont findfont \psk@fontscale scalefont setfont
    /F1 (1) def
    /F2 (0) def
    n@ 2 sub{
      /Fi F2 F1 concatstrings def
      /F1 F2 def
      /F2 Fi def
    } repeat
    \ifPst@DFW
      /Fi () def
      0 2 F2 length 2 sub {/i exch def
        /I F2 i 2 getinterval def
        I (00) eq {Fi (0) concatstrings /Fi exch def} if
        I (01) eq {Fi (1) concatstrings /Fi exch def} if
        I (10) eq {Fi (2) concatstrings /Fi exch def} if
      } for
    \fi
    \ifPst@iFibonacci
      /F0 (0) def
      /Fi () def
      i@ 1 sub {
	Fi (0) concatstrings /Fi exch def
      } repeat
      Fi (1) concatstrings
      /F1 exch def
      n@ {
        F1 F0 concatstrings
	/Fi exch def
	/F0 F1 def
	/F1 Fi def
      } repeat
    \fi
    #1 cmunit #2 cmunit moveto Fi show
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}

%
\def\psfractal{\pst@object{psfractal}}
\def\psfractal@i{\@ifnextchar({\psfractal@ii}{\psfractal@ii(-1,-1)}}%
\def\psfractal@ii(#1){\@ifnextchar({\psfractal@iii(#1)}{\psfractal@iii(#1)(1,1)}}% 
\def\psfractal@iii(#1)(#2){%
  \begin@SpecialObj
  \psset{unit=1pt}%
  \pst@getcoor{#1}\pst@temp@A
  \pst@getcoor{#2}\pst@temp@B
  \pspicture(\pst@fractal@xWidth,\pst@fractal@yWidth)%
  \addto@pscode{
    \pst@temp@A 
    \pst@temp@B 
    \pst@number\pst@fractal@xWidth
    \pst@number\pst@fractal@yWidth
    \pst@fractal@cx 
    \pst@fractal@cy  
    \pst@fractal@maxIter
    \pst@fractal@dIter
    \pst@fractal@maxRadius    
    { \pst@usecolor\pst@fractal@baseColor } 
    \ifx\pst@fractal@type\pst@fractal@Julia true \else false \fi
    \ifPst@CMYK true \else false \fi ^^J
    tx@fractalDict begin 
    /FractalFunc { /z ED \pst@fractal@function } def 
    tx@Fractal end 
    ^^J
  }% end add@pscode
  \endpspicture
  \end@SpecialObj
  \ignorespaces}
%
\def\psSier{\pst@object{psSier}}
\def\psSier@i{\@ifnextchar({\psSier@v}{\psSier@vi}}
%
\def\psSier@v(#1){\@ifnextchar({\psSier@ii(#1)}{\psSier@iii(#1)}}
\def\psSier@ii(#1)(#2)(#3){{%
  \pst@getcoor{#1}\pst@temp@A
  \pst@getcoor{#2}\pst@temp@B
  \pst@getcoor{#3}\pst@temp@C
  \begin@SpecialObj%
  \addto@pscode{
    [ \pst@temp@A \pst@temp@B \pst@temp@C ]  ^^J%
    { \pst@usecolor\pslinecolor } ^^J%
    \pst@fractal@plotpoints ^^J%
    tx@fractalDict begin tx@Sierpinski end ^^J%
  }% end add@pscode
  \end@SpecialObj%
}}
\def\psSier@iii(#1)#2#3{%
  \pst@getcoor{#1}\pst@tempA
  \pst@getlength{#2}\pst@tempB
  \begin@OpenObj%
  \addto@pscode{
    /sierpy { 
      dup 1 ge 
       { 1 sub gsave 0.5 dup scale dup sierpy
         1 0 translate dup sierpy
        -0.5 0.8660254 translate dup sierpy grestore
       }{newpath 
         0 0 moveto 
         1 0 lineto 0.5 0.8660254 lineto closepath 
         gsave \pst@usecolor\pslinecolor 
         fill grestore } ifelse pop
    } def
    \pst@tempA\space translate
    \pst@tempB\space dup scale
    0 setlinewidth
    0 0 moveto 1 0 lineto 0.5 0.8660254 lineto 0 setlinewidth closepath 
    gsave #3 0 gt { \pst@usecolor\psfillcolor }{ \pst@usecolor\pslinecolor } ifelse
      fill grestore stroke
    #3 dup 0 gt { sierpy } if }%
  \end@OpenObj%
}
%
\def\psSier@vi{%  Sierpinski curve
  \addbefore@par{n=3,N=all,dotcolor=red}%
  \begin@SpecialObj
  \addto@pscode{
    /useFill \ifx\psk@fillstylename\@none false \else true \fi def
    /fillColor { \pst@usecolor\psfillcolor } def
%      \else 
%    /useFillColor { 
%      \ifx\psk@fillstylename\@none 
%      \else 
%        gsave \pst@usecolor\psfillcolor fill grestore 
%      \fi
%    } def
    /useLineStyle { \ifx\pslinestyle\@none\else \psls@solid stroke \fi } def
    /n@ \pst@fractal@n def
    /NbrePts (\pst@fractal@N) def
    /dotcolor { \pst@usecolor\psdotcolor } def
    /cmunit { \pst@number\psunit mul }  def 
    NbrePts (all) eq {/Npts 4 n@ 1 add exp cvi def}{/Npts NbrePts cvi def Npts 4 n@ 1 add exp gt {/Npts 4 n@ 1 add exp cvi def} if } ifelse
    tx@fractalDict begin 
    tx@SierpinskiCurve
    \ifshowpoints
      0 2 Sierpinsky length 2 sub {
        /i exch def
        i 2 div Npts ge {exit} if
        Sierpinsky i get
        Sierpinsky i 1 add get
        \psk@dotsize DS
        0 360 arc dotcolor fill
      } for
    \fi
    end
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}     
%
\def\psSierCarpet{\pst@object{psSierCarpet}}
\def\psSierCarpet@i{\@ifnextchar({\psSierCarpet@ii}{\psSierCarpet@ii(0,0)}}
%
\def\psSierCarpet@ii(#1){{%
  \pst@getcoor{#1}\pst@temp@A
  \begin@SpecialObj
  \addto@pscode{
    \pst@fractal@scale
  	\pst@temp@A\space translate
	/r { moveto 0 -1 1 0 0 1 3 { rlineto } repeat closepath fill } def
	/serp { gsave
        3 1 roll translate
        1 3 div dup scale
        1 1 r
        dup 1 sub dup 0 eq not {
                0 0 0 1 0 2 1 0 1 2 2 0 2 1 2 2 17 -1 roll 8 { serp } repeat
        } if pop
        grestore
	} def
	300 300 scale 0 0 r 1 setgray
	0 0 \pst@fractal@n serp 
  }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces
}}
%
%
\def\psPhyllotaxis{\pst@object{psPhyllotaxis}}
\def\psPhyllotaxis@i{\@ifnextchar({\psPhyllotaxis@ii}{\psPhyllotaxis@ii(0,0)}}
\def\psPhyllotaxis@ii(#1){{%
  \pst@getcoor{#1}\pst@tempA
  \begin@SpecialObj%
  \addto@pscode{
    \pst@tempA
    \pst@fractal@c
    \pst@fractal@angle
    \pst@fractal@maxIter
    \ifPst@CMYK true \else false \fi ^^J%
    tx@fractalDict begin tx@Phyllotaxis end ^^J%
  }% end add@pscode
  \end@SpecialObj%
}}
%
\def\pst@fractal@radius{0.001 }
\def\psFern{\pst@object{psFern}}
\def\psFern@i{\@ifnextchar({\psFern@ii}{\psFern@ii(0,0)}}
\def\psFern@ii(#1){{%
  \addbefore@par{scale=10,linewidth=0.001pt,maxIter=20000,radius=0.001pt}%
  \pst@getcoor{#1}\pst@tempA%
  \begin@SpecialObj%
  \addto@pscode{
    \pst@fractal@Xscale 
    \pst@tempA 
    \pst@fractal@maxIter
    \pst@fractal@radius
    \pst@number\pslinewidth
    { \pst@usecolor\pslinecolor }
    tx@fractalDict begin tx@Fern end 
  }% end add@pscode
  \end@SpecialObj%
}}
%
\def\psHugo{\pst@object{psHugo}}
\def\psHugo@i{\@ifnextchar({\psHugo@ii}{\psHugo@ii(0,0)}}
\def\psHugo@ii(#1){{%
  \addbefore@par{scale=0.1,linewidth=0.001pt,maxIter=5}%
  \pst@getcoor{#1}\pst@tempA%
  \begin@SpecialObj%
  \addto@pscode{
    \pst@fractal@Xscale 
    \pst@tempA 
    \pst@fractal@maxIter
    \pst@number\pslinewidth
    { \pst@usecolor\pslinecolor }
    tx@fractalDict begin tx@Hugo end 
  }% end add@pscode
  \end@SpecialObj%
}}
%
\def\psKochflake{\pst@object{psKochflake}}
\def\psKochflake@i{\@ifnextchar({\psKochflake@ii}{\psKochflake@ii(0,0)}}
\def\psKochflake@ii(#1){{%
  \addbefore@par{radius=0.25cm,maxIter=5}%
  \pst@getcoor{#1}\pst@tempA
  \begin@SpecialObj
  \addto@pscode{
    gsave ^^J
    \pst@tempA translate
    \pst@usecolor\pslinecolor 
    \pst@fractal@angle rotate ^^J
    \pst@number\pslinewidth 10 div \pst@fractal@Xscale div SLW ^^J
    \pst@fractal@maxIter ^^J
    tx@fractalDict begin ^^J
      \pst@fractal@scale ^^J
      tx@Kochflake end ^^J
  }% end add@pscode
  \psk@fillstyle
  \addto@pscode{stroke grestore }%
  \end@SpecialObj
}}
%
\def\psAppolonius{\pst@object{psAppolonius}}
\def\psAppolonius@i{\@ifnextchar({\psAppolonius@ii}{\psAppolonius@ii(0,0)}}
\def\psAppolonius@ii(#1){{%
  \addbefore@par{Radius=5cm,dIter=1,linewidth=0.1pt}%
  \pst@getcoor{#1}\pst@tempA%
  \begin@SpecialObj%
  \addto@pscode{
    \pst@fractal@dIter
    \pst@number\pst@fractal@Radius
    \ifPst@fractal@Color true \else false \fi
    \ifPst@CMYK true \else false \fi ^^J
      gsave ^^J
      \pst@tempA translate ^^J
      \pst@usecolor\pslinecolor
      \pst@fractal@scale
      \pst@number\pslinewidth SLW ^^J
      tx@fractalDict begin tx@Appolonius end ^^J 
  }% end add@pscode
  \psk@fillstyle%
  \addto@pscode{stroke grestore  ^^J }%
  \end@SpecialObj%
}}
%
\def\psPTree{\pst@object{psPTree}}
\def\psPTree@i{\@ifnextchar({\psPTree@ii}{\psPTree@ii(0,0)}}
\def\psPTree@ii(#1){{%
  \addbefore@par{xWidth=1cm,Color=false,c=0.5}%
  \pst@getcoor{#1}\pst@tempA%
  \begin@SpecialObj%
  \addto@pscode{
  gsave ^^J%
  \pst@tempA exch \pst@number\pst@fractal@xWidth 2 div sub exch translate ^^J%
  \pst@usecolor\pslinecolor
  \pst@fractal@scale
  \pst@number\pslinewidth \pst@fractal@Xscale div SLW ^^J%
  /sqrt2 1.41421356237310 def ^^J%
  /minWidth \pst@number\pst@fractal@minWidth def 
  /r 1 def /g 0 def /b 0 def 
  /icount 380 def 
  /setWaveColor { 
    /icount icount dup 780 gt { pop 380 }{ \pst@fractal@dIter add } ifelse def ^^J%
    tx@addDict begin icount ^^J%
    \ifPst@CMYK wavelengthToCMYK Cyan Magenta Yellow Black end setcmykcolor  ^^J%
    \else wavelengthToRGB Red Green Blue end setrgbcolor \fi ^^J%
  } def ^^J%
  /Alpha1 { .5 1 \pst@fractal@c sub atan } bind def 
  /Alpha2 { .5 \pst@fractal@c atan } bind def 
  /box { \@percentchar stacksize ^^J 	%  width on stack
    /w ED
    newpath  				%
    0 0 moveto 				%   
    w 0 rlineto 			% w 0 move right
    0 w rlineto 			% 0 w move up
    w neg \pst@fractal@c mul w 0.5 mul % -c*w 0.5*w
    rlineto 				% move left up
    w \pst@fractal@c 1 sub mul   	% -(1-c)*w
    w -0.5 mul rlineto			% -(1-c)*w -0.5w move left down	
    closepath 				% close
    \ifPst@fractal@Color
    setWaveColor fill  ^^J%
%      r g b setrgbcolor fill r g b /g exch def /r exch def /b exch def 
    \else stroke \fi  %
    w minWidth gt { 			% w w limit gt
      gsave %
        0 w translate 
	Alpha1 rotate 
	w dup 0.5 mul 1 \pst@fractal@c sub w mul Pyth box % one w to leave on stack
      grestore 
      gsave 
        dup dup dup 			% w w w w
        1 \pst@fractal@c sub mul 	% w w w w*(1-c)
	exch 1.5 mul 			% w w w*(1-c) w*1.5
	translate			% w w 
	360 Alpha2 sub rotate 
	0.5 mul exch \pst@fractal@c mul Pyth box 
      grestore 
    } if
  } def 
  \pst@number\pst@fractal@xWidth box ^^J%
  }% end add@pscode
  \end@SpecialObj%
}}
%
\def\psFArrow{\pst@object{psFArrow}}
\def\psFArrow@i{\@ifnextchar({\psFArrow@ii}{\psFArrow@ii(0,0)}}
\def\psFArrow@ii(#1)#2{{%
  \addbefore@par{linewidth=10pt,yWidth=5cm,maxIter=10,Color=false,scale=1,dIter=1}%
  \pst@getcoor{#1}\pst@tempA%
  \begin@SpecialObj%
  \addto@pscode{
  gsave ^^J%
  \pst@tempA translate 0 0 moveto ^^J%
  \pst@usecolor\pslinecolor ^^J%
  \pst@fractal@scale ^^J%
  /depth 0 def ^^J%
  /depth++ { /depth depth 1 add def } def ^^J%
  /depth-- { /depth depth 1 sub def } def ^^J%
  /icount 380 def ^^J%
  /setWaveColor { ^^J%
    /icount icount dup 780 gt { pop 380 }{ \pst@fractal@dIter add } ifelse def ^^J%
    tx@addDict begin icount  ^^J%
    \ifPst@CMYK wavelengthToCMYK Cyan Magenta Yellow Black end setcmykcolor   ^^J%
    \else wavelengthToRGB Red Green Blue end setrgbcolor \fi ^^J%
  } def ^^J%
  /DoLine {		\@percentchar print a vert. line ^^J%
    0 \pst@number\pst@fractal@yWidth rlineto currentpoint   ^^J%
    \ifPst@fractal@Color setWaveColor \fi ^^J%
    stroke  ^^J%
    translate 0 0 moveto  ^^J%
  } def ^^J%
  /FractArrow {  ^^J%
    /sc exch def ^^J% 
    gsave  ^^J%
    sc dup scale ^^J%
    \pst@number\pslinewidth SLW ^^J%
    depth++ DoLine ^^J%
    depth \pst@fractal@maxIter le {  ^^J%
      135 rotate sc FractArrow ^^J%
      -270 rotate sc FractArrow ^^J% 
    } if ^^J%
    depth--  ^^J%
    grestore ^^J%
  } def ^^J%
  \pst@fractal@angle rotate ^^J%
  #2 FractArrow  ^^J%
%  180 rotate #2 FractArrow
%  stroke
  }% end add@pscode
  \end@SpecialObj%
}}
%
\define@key[psset]{pst-fractal}{NbrIter}{\def\pst@fractal@NbrIter{#1 }} % nombre d'itérations
\define@key[psset]{pst-fractal}{tabPts}{\def\pst@fractal@tabPts{#1 }} % tableau de points
\define@key[psset]{pst-fractal}{angleH}{\def\pst@fractal@angleH{#1 }} % angle en radians
\define@key[psset]{pst-fractal}{zoom}{\def\pst@fractal@zoom{#1 }} % grossissement
\psset[pst-fractal]{NbrIter=500,angleH=1.32837,zoom=5,tabPts=0.05 0.05
0.1 0.1
0.2 0.2
0.3 0.2
0.3 0.3
0.4 0.3
0.4 0.324
0.4 0.326
0.4 0.5
0.5 0.3
0.5 0.5
0.6 0.5
0.6 0.6
0.57 0.575
0.7 0.7
0.7 0.9}
\define@boolkey[psset]{pst-fractal}[Pst@]{pixelscolor}[true]{}
\psset[pst-fractal]{pixelscolor=true} % pixels en couleurs

\def\psHenon{\pst@object{psHenon}}
\def\psHenon@i{%
  \addbefore@par{dotsize=0.75pt}%
  \begin@SpecialObj
  \addto@pscode{
% �chelle 2=> 10 cm pour zoom=5
    /zoom \pst@fractal@zoom def
    /cm {\pst@number\psunit mul zoom mul} bind def
    /NbreIter \pst@fractal@NbrIter def
    /Angle 	\pst@fractal@angleH RadtoDeg def	
    /CosA Angle cos def
    /SinA Angle sin def
    /TabPts [\pst@fractal@tabPts] def
    \ifPst@pixelscolor /pixelscolor true def \else /pixelscolor false def \fi
    /AttracteurHenon {
      5 dict begin
      /Y exch def /X exch def /Aux X def
      NbreIter {
        /Aux X def
        /X X CosA mul Y X X mul sub SinA mul sub def
        /Y Aux SinA mul Y Aux Aux mul sub CosA mul add def
        X abs 1e12 ge Y abs 1e10 ge or { exit }{
          newpath
          X cm \psk@@dotsize sub Y cm \psk@@dotsize sub moveto
          \psk@@dotsize 0 rlineto		%  bottom of square
          0 \psk@@dotsize rlineto		%  right side of square
          -\psk@@dotsize  0 rlineto		%  top of square
          closepath	
          fill	
        }ifelse
      } repeat
      end
    } def
    /Hsb 0 def
    0 2 TabPts length 2 sub {
      /i exch def
      % 0 setgray
      %TabPts i get TabPts i 1 add get 2 copy
      %exch 200 mul exch 200 mul 2 0 360 arc fill
      pixelscolor {Hsb 1 1 sethsbcolor}{0 setgray}ifelse
      TabPts i get TabPts i 1 add get
      AttracteurHenon
      /Hsb i TabPts length div def
     } for
   }%
  \showpointsfalse
  \end@SpecialObj
  \ignorespaces}
%
\catcode`\@=\PstAtCode\relax
%
%% END: pst-fractal.tex
\endinput

