diff options
Diffstat (limited to 'graphics/pstricks/contrib/pst-lsystem')
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/Changes | 11 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/README.md | 25 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib | 119 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdf | bin | 0 -> 2936125 bytes | |||
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex | 396 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro | 26 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty | 8 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex | 140 |
8 files changed, 725 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/pst-lsystem/Changes b/graphics/pstricks/contrib/pst-lsystem/Changes new file mode 100644 index 0000000000..52e9359b1f --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/Changes @@ -0,0 +1,11 @@ +..... pst-lsystem.tex +0.02 2018-12-31 some code cleanup +0.01 2018-09-23 first CTAN version + + +..... pst-lsystem.sty +0.01 2018-09-23 first CTAN version + + +..... pst-lsystem.pro +0.01 2018-09-23 first CTAN version diff --git a/graphics/pstricks/contrib/pst-lsystem/README.md b/graphics/pstricks/contrib/pst-lsystem/README.md new file mode 100644 index 0000000000..14c6160d4b --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/README.md @@ -0,0 +1,25 @@ +# pst-lsystem: creating images defined by a L-system: +A L-system or Lindenmayer system is a parallel rewriting system and a type of +formal grammar. An L-system consists of an alphabet of symbols that can be used +to make strings, a collection of production rules that expand each symbol into +some larger string of symbols, an initial »axiom« string from which to begin construction, +and a mechanism for translating the generated strings into geometric structures. + +Save the files pst-lsystem.sty|pro|tex in a directory, which is part of your +local TeX tree. The pro file should go into $TEXMF/dvips/pstricks/ +Then do not forget to run texhash to update this tree. + +pst-lsystem needs pstricks, which should +be part of your local TeX installation, otherwise get it from a +CTAN server, http://mirror.ctan.org + +PSTricks is PostScript Tricks, the documentation cannot be run +with pdftex, use the sequence latex->dvips->ps2pdf or +pdflatex with package auto-pst-pdf or xelatex. + +%% 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. + + +%% $Id: README.md 819 2018-09-26 06:40:48Z herbert $ diff --git a/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib new file mode 100644 index 0000000000..ba627e29bb --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.bib @@ -0,0 +1,119 @@ +%% -*-bibtex-*- +@STRING{tugboat = {TUGboat} } +@STRING{beiprogramm = {{\TeX}-Beiprogramm} } +@STRING{bretter = {Bretter, die die Welt bedeuten} } +@STRING{dtk = {{D}ie {\TeX}nische {K}om{\"o}die} } +@STRING{editorial = {Editorial} } +@STRING{fremdebuehne = {Von fremden B{\"u}hnen} } +@STRING{fundus = {Aus dem Fundus} } +@STRING{hinterbuehne = {Hinter der B{\"u}hne} } +@STRING{leserbrief = {Leserbrief(e)} } +@STRING{magazin = {Magazin} } +@STRING{rezension = {Rezensionen} } +@STRING{schonimmer = {Was Sie schon immer {\"u}ber {\TeX} wissen wollten \dots} } +@STRING{theaterkasse = {Von der Theaterkasse} } +@STRING{theatertage = {{\TeX}-Theatertage} } + + +@online{wikipedia, + author = {family={\WikipediA},family-i=W}, + sortlabel = {Wikipedia}, + sortname = {Wikipedia}, + title = {L-system}, + date = {2018-09-08}, + urldate = {2018-09-22}, + url = {https://en.wikipedia.org/wiki/L-system}, +} + + +@Book{companion, + author = {Michel Goosens and Frank Mittelbach and Sebastian Rahtz and Denis Roegel and Herbert Voß}, + title = {The {\LaTeX} {G}raphics {C}ompanion}, + publisher = {{Addison-Wesley Publishing Company}}, + edition = 2, + year = {2007}, + address = {Reading, Mass. (USA)} +} + +@Book{PSTricks2, + author = {Herbert Voß}, + title = {\texttt{PSTricks} -- {G}rafik f\"ur \TeX{} und \LaTeX}, + edition = {7}, + publisher = {DANTE and Lehmanns Media}, + year = {2017}, + address = {Heidelberg and Berlin} +} + + +@Book{PSTricksE, + author = {Herbert Voß}, + title = {\texttt{PSTricks} -- {G}raphics and {P}ost{S}cript for \LaTeX}, + edition = {1}, + publisher = {UIT}, + date = {2011}, + location = {Cambridge -- UK} +} + + + +@Book{LaTeXRef, + author = {Herbert Voß}, + title = {\LaTeX\ Referenz}, + edition = {3}, + publisher = {DANTE and Lehmanns Media}, + year = {2012}, + address = {Heidelberg and Berlin} +} +@Book{PostScript, + Author = {Kollock, Nikolai G.}, + Title = {Post{S}cript richtig eingesetzt: vom {K}onzept zum + praktischen {E}insatz}, + Publisher = {IWT}, + Address = {Vaterstetten}, + year = 1989, +} + +@online{pstricks, + Title = {PSTricks - {\PS} macros for generic {\TeX}}, + Author = {{Timothy van} Zandt}, + url = {http://www.tug.org/application/PSTricks}, + year = 1993 +} + +@online{charp, + author= {Michel Charpentier}, + title = {Dragon Curve in PostScript}, + url = {http://www.cs.unh.edu/~charpov/Programming/L-systems/simple-dragon.ps}, + urldate={2018-09-24}, +} + +@online{charp2, + author= {Michel Charpentier}, + title = {L-systems in PostScript}, + url = {http://www.cs.unh.edu/~charpov/Programming/L-systems/plant2.ps}, + urldate={2018-09-24}, +} + +@book{Linde, +author={Przemyslaw Prusinkiewicz and Aristid Lindenmayer}, +title={The Algorithmic Beauty of Plants}, +publisher= {Springer-Verlag}, +date={1990}, +} + +@article{charp3, + author= {Michel Charpentier}, + title={Programming L-Systems in PostScript}, + journal = {Zpravodaj Československého sdružení uživatelů \TeX u}, + organisation = {CSTUG: Czech and Slovak \TeX\ Users Group}, + date = {2012}, + doi={10.5300/2012-1/9}, +number = 1, +pages={9--19}, +url={http://bulletin.cstug.cz/pdf/bul_0013.pdf}, +urldate = {2018-09-25}, +} + + + + diff --git a/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdf b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdf Binary files differnew file mode 100644 index 0000000000..ff9180091a --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.pdf diff --git a/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex new file mode 100644 index 0000000000..073ac3c699 --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/doc/pst-lsystem-doc.tex @@ -0,0 +1,396 @@ +%% $Id: pst-lsystem-doc.tex 820 2018-09-26 09:52:39Z herbert $ +\documentclass[fontsize=11pt,english,BCOR=10mm,DIV=12,bibliography=totoc,parskip=false, + headings=small, headinclude=false,footinclude=false,oneside,abstract=on]{pst-doc} +\usepackage{pst-lsystem} +\let\pstFV\fileversion +\usepackage{dtk-logos} +\usepackage{xltabular} +\renewcommand\bgImage{% +\begin{pspicture}(-2,-0.5)(3,6) +\pslsystem[ + Start=Y, + X={X[-FFF][+FFF]FX}, + Y={YFX[+Y][-Y]}, + Angle=25, + N=6, + Ftype=1, + BaseLength=2.5pt, + usecolor=2](0,0) +\psdot(0,0) +\end{pspicture} +} + +\addbibresource{\jobname.bib} + + +\lstset{language=PSTricks, + morekeywords={pslsystem},basicstyle=\footnotesize\ttfamily, + literate=% + {Ö}{{\"O}}1 + {Ä}{{\"A}}1 + {Ü}{{\"U}}1 + {ß}{{\ss}}1 + {ü}{{\"u}}1 + {ä}{{\"a}}1 + {ö}{{\"o}}1 + {~}{{\textasciitilde}}1 +} +\begin{document} + +\title{\texttt{pst-lsystem}} +\subtitle{Creating images, based on the Lindenmayer-system; v.\pstFV} +\author{Herbert Voß} +\docauthor{} +\date{\today} +\maketitle + +\tableofcontents + +\begin{abstract} +\noindent +\LPack{pst-lsystem} loads by default the following packages: \LPack{pst-xkey}, and, of course \LPack{pstricks}. +All should be already part of your local \TeX\ installation. If not, or in case +of having older versions, go to \url{http://www.CTAN.org/} and load the newest version. + + + +\vfill\noindent +Thanks to \\ +Michel Charpentier, +and last but not least + \url{http://mathworld.wolfram.com}. + +\end{abstract} + + +\clearpage + + +\section{Introduction} +A L-system or Lindenmayer system is a parallel rewriting system and a type of +formal grammar. An L-system consists of an alphabet of symbols that can be used +to make strings, a collection of production rules that expand each symbol into +some larger string of symbols, an initial »axiom« string from which to begin construction, +and a mechanism for translating the generated strings into geometric structures. +L-systems were introduced and developed in 1968 by Aristid Lindenmayer, +a Hungarian theoretical biologist and botanist at the University of Utrecht.~\cite{wikipedia} + + +\section{Usage} +There are no optional arguments for the package: +\begin{verbatim} +\usepackage{pst-lsystem} +\end{verbatim} + +There is only one command: + +\begin{BDef} +\Lcs{pslsystem}\OptArgs\Largr{x,y} +\end{BDef} + +If the coordinates for the origin are missing, then $(0,0)$ is assumed. The L-System ist +defined by the three functions $F$, $X$, and $Y$. At least one function must be given. + +\subsection{Optional arguments} + +The following optional arguments for the macro are possible: + +\begin{xltabular}{\linewidth}{@{} l l X @{}}\toprule +\emph{name} & \emph{default} & \emph{menaing}\\\midrule +\Lkeyword{F} & & Rule $F\rightarrow(F)$\\ +\Lkeyword{X} & & Rule $X\rightarrow(F,X,Y)$\\ +\Lkeyword{Y} & & Rule $Y\rightarrow(F,X,Y)$\\ +\Lkeyword{Start} & & Startrule $S\rightarrow(F,X,Y)$\\ +\Lkeyword{Angle} & 45 & Angle for the drection change\\ +\Lkeyword{N} & 5 & Number of the recursive calls\\ +\Lkeyword{Ftype} & 4 & How the F-rule should be handled\\ +\Lkeyword{BaseLength} & 1mm & The length of a base line, created by the ruke F (Forward)\\ +\Lkeyword{usecolor} & 0 & Which color should be used for the lines.\\ +%\define@key[psset]{pst-lsystem}{order}[5]{\pst@getint{#1}\psk@lsystem@order} +%\define@key[psset]{pst-lsystem}{factor}[2]{\pst@checknum{#1}\psk@lsystem@factor} +% Size (the smaller, the bigger), no need to be changed, normally +%\define@key[psset]{pst-lsystem}{size}[4]{\pst@getint{#1}\psk@lsystem@size} +%\define@key[psset]{pst-lsystem}{type}[0]{\pst@getint{#1}\psk@lsystem@type} +\bottomrule +\end{xltabular} + +\bigskip +If the rules contain square brackets then it must be enclosed by braces: +\verb|X=F[-X]| is wrong and \verb|X={F[-X]}| is correct. + +\subsection{Different types for the F-rule} + +It depends to the given rule(s) what kind of the F-type must be used. +There are five possibilities: + +\begin{xltabular}{\linewidth}{@{} >{\ttfamily}l X @{}} +0 & $F\rightarrow \textrm{draw line element}$ \\ + & in PostScript: \verb|/F { D } def|\\ +1 & $F\rightarrow \textrm{If loop variable }=0 \textrm{ then draw line element}$\\ + & in PostScript: \verb|/F { 0 eq { D } if } def|\\ +2 & $F\rightarrow \textrm{If loop variable }=0 \textrm{ then draw line element and keep variable}$\\ + & in PostScript: \verb|/F { dup 0 eq { D } if } def|\\ +3 & $F\rightarrow \textrm{draw line element and delete current loop variable}$\\ + & in PostScript: \verb|/F { pop D } def|\\ +4 & $F\rightarrow \textrm{If loop variable }=0 $ then draw line element! If not $=0$ decrease loop variable, duplicate it + $n-1$ times (n is the number of functions in $F$) and put F-rule on stack\\ + & in PostScript: \verb|/F { dup 0 eq { D }{ 1 sub N 1 sub {dup} repeat F-rule } ifelse pop } def| +\end{xltabular} + +\iffalse +\begin{verbatim} +\ifcase\psk@lsystem@Ftype + /F { D } def % type 0 +\or % 1 + /F { 0 eq { D } if } def +\or % 2 + /F { dup 0 eq { D } if } def +\or % 3 + /F { pop D } def +\else % 4 + /F { dup 0 eq { D }{ 1 sub \psk@lsystem@Fnumber {dup} repeat \psk@lsystem@F } ifelse pop } def +\fi +\end{verbatim} +\fi + +The function D does nothing else than drawing a line in the current direction. +Its length is given by the optional parameter BaseLength. + +\subsection{Color} +There are four predefined color modes, where mode=0 is no color. + + +\psset{linewidth=0.1pt} + +\section{Examples} +\subsection{Dragon} +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-2,-1.5)(4,6) +\pslsystem[ + X=-FX++FY-, + Y=+FX--FY+, + Ftype=1, + Start=X, + Angle=45, + N=9, + BaseLength=2mm](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + +\subsection{Hilbert} +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-1,-0.5)(4,4) +\pslsystem[ + X=-YF+XFX+FY-, + Y=+XF-YFY-FX+, + Ftype=3, + Start=X, + Angle=90](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + + + +\clearpage +\subsection{Kochflake} + +If the rule for \Lkeyword{Start} has more than one function name, one has to repeat +the number of iterations, which is \Lkeyword{N}, before every following function, but not +for the first one. That is done already internally: + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-2,-.5)(5,6) +\pslsystem[ + Start=F--NF--NF,% repeat number of iterations N + F=F+F--F+F, + Angle=60, + N=4, + BaseLength=2pt, + linecolor=red](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + + + +\subsection{Plant 1} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-2,-2.3)(4,6) +\pslsystem[ + Start=F, + F={FF-[-F+F+F]+[+F-F-F]}, + Angle=22.5, + BaseLength=2pt, + usecolor=4](0,-2) +\psdot(0,-2) +\end{pspicture} +\end{LTXexample} + + +\clearpage + +\subsection{Plant 2} + + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-3,-2.3)(2,6) +\pslsystem[ + Start=X, + X={F-[[X]+X]+F[+FX]-X}, + F=FF, + Angle=22.5, + N=6, + BaseLength=1.25pt, + usecolor=3](0,-2) +\psdot(0,-2) +\end{pspicture} +\end{LTXexample} + + + +\subsection{Plant 3} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-2,-2.5)(2,5) +\psset{xunit=3} +\pslsystem[ + Start=F, + F={F[+F]F[-F][F]}, + Angle=20, + usecolor=3](0,-2) +\psdot(0,-2) +\end{pspicture} +\end{LTXexample} + +\clearpage + + +\clearpage + +\subsection{Plant 4} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-2,-0.5)(3,6) +\pslsystem[ + Start=Y, + X={X[-FFF][+FFF]FX}, + Y={YFX[+Y][-Y]}, + Angle=25, + N=6, + Ftype=1, + BaseLength=2.5pt, + usecolor=2](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + + + +\subsection{Plant 5} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-3,-.5)(3,9) +\pslsystem[ + Start=X, + X={F[+X][-X]FX}, + F={FF}, + Angle=25, + N=7, + BaseLength=1pt, + usecolor=2](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + +\clearpage + +\clearpage + +\subsection{Plant 6} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-3,-.5)(3,9) +\pslsystem[ + Start=X, + X={F[+X]F[-X]+X}, + F={FF}, + Angle=20, + N=7, + BaseLength=1pt, + usecolor=2](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + +\subsection{Plant 7} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-3,-.5)(3,9) +\pslsystem[ + Start=F, + F={F[+F]F[-F]F}, + Angle=25, + BaseLength=1pt, + usecolor=2](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + +\clearpage + + +\subsection{Plant 8} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-4,-.5)(5,9) +\pslsystem[ + Start=F, + F={F[+F[+F][-F]F][-F[+F][-F]F]F[+F][-F]F}, + Angle=30, + BaseLength=1pt, + usecolor=4](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + +\subsection{Special case} + +\begin{LTXexample}[pos=r] +\begin{pspicture}[showgrid=true](-2,-0.5)(1,4) +\pslsystem[ + Start=X, + F=FF, + X=F+X-F-X+F, + Angle=90, + N=6, + BaseLength=1pt](0,0) +\psdot(0,0) +\end{pspicture} +\end{LTXexample} + + + +\clearpage +\section{List of all optional arguments for \nxLPack{pst-lsystem}} + +\xkvview{family=pst-lsystem,columns={key,type,default}} + + +\bgroup +\raggedright +\nocite{*} +\printbibliography +\egroup + +\printindex + + + +\end{document} + + + +% F=F+FF-FF-F-F+F+FF-F-F+F+FF+FF-F, diff --git a/graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro b/graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro new file mode 100644 index 0000000000..b4b047722e --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/dvips/pst-lsystem.pro @@ -0,0 +1,26 @@ +%% pst-lsystem.pro (c) sep 22, 2018 Herbert Voss +%% version 0.01 2018/09/22 +% +% based on the work of Michel Charpentier +% +/tx@lsystemDict 6 dict def +tx@lsystemDict begin + +/fast? true def % choice between faster or nicer + +/D { Element 0 rlineto } bind def + +/B [ % quite dirty, but it works... + fast? { {currentpoint stroke moveto} aload pop } if + {gsave} aload pop + { dup color } aload pop +] cvx bind def + +%/B { currentpoint stroke moveto gsave } bind def +/E { stroke grestore } bind def +/- { angle neg rotate } def % rotation to the right +/+ { angle rotate } def % rotation to the left +% + +end + diff --git a/graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty b/graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty new file mode 100644 index 0000000000..bf8a6f1e96 --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/latex/pst-lsystem.sty @@ -0,0 +1,8 @@ +\RequirePackage{pstricks} +\ProvidesPackage{pst-lsystem}[2009/11/07 package wrapper for + pst-lsystem.tex (hv)] +\input{pst-lsystem.tex} +\ProvidesFile{pst-lsystem.tex} + [\filedate\space v\fileversion\space `PST-lsystem' (hv)] +\IfFileExists{pst-psm.pro}{\@addtofilelist{pst-lsystem.pro}}{}% +\endinput diff --git a/graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex b/graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex new file mode 100644 index 0000000000..68e19e086c --- /dev/null +++ b/graphics/pstricks/contrib/pst-lsystem/tex/pst-lsystem.tex @@ -0,0 +1,140 @@ +%% +%% This is file `pst-lsystem.tex', +%% +%% IMPORTANT NOTICE: +%% +%% Package `pst-lsystem.tex' +%% +%% Herbert Voss <herbert -> dante.de> +%% +%% 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-lsystem' is a PSTricks package for lsystem macros +%% +%% +\csname PSTlsystemLoaded\endcsname +\let\PSTlsystemLoaded\endinput +% Requires PSTricks +\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi +\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey.tex \fi +% +\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax +% interface to the `xkeyval' package +\pst@addfams{pst-lsystem} + +\def\fileversion{0.02} +\def\filedate{2018/12/31} +\message{`PST-lsystem' v\fileversion, \filedate\space (hv)} +% +\pstheader{pst-lsystem.pro} +% +\def\pst@lsystem@checkRule#1#2{% + \def\pst@tempg{}% + \pst@cntm=0 + \ifx\relax#2\relax\else\pst@lsystem@@checkRule#2;\fi +% \let#1\pst@tempg +% \@namedef{\expandafter\@gobble\detokenize\expandafter{\string#1number}}{\the\pst@cntm}% + \expandafter\let\csname#1\endcsname\pst@tempg + \global\expandafter\edef\csname#1number\endcsname{\the\pst@cntm}% +} +\def\pst@lsystem@@checkRule#1#2;{%[A + \ifx#1[ \edef\pst@tempg{\pst@tempg\space B}% + \else + \ifx#1] \edef\pst@tempg{\pst@tempg\space E}% + \else + \edef\pst@tempg{\pst@tempg\space #1}% + \ifcat A#1\global\advance\pst@cntm by 1\fi + \fi + \fi + \ifx\relax#2\relax \else\pst@lsystem@@checkRule#2;\fi +} +% +\define@key[psset]{pst-lsystem}{F}[]{\pst@lsystem@checkRule{psk@lsystem@F}{#1}} +\define@key[psset]{pst-lsystem}{X}[]{\pst@lsystem@checkRule{psk@lsystem@X}{#1}} +\define@key[psset]{pst-lsystem}{Y}[]{\pst@lsystem@checkRule{psk@lsystem@Y}{#1}} +\define@key[psset]{pst-lsystem}{Start}[]{\pst@lsystem@checkRule{psk@lsystem@Start}{#1}} +\define@key[psset]{pst-lsystem}{Angle}[45]{\def\psk@lsystem@Angle{#1 }} +\define@key[psset]{pst-lsystem}{N}[5]{\def\psk@lsystem@N{#1 }} +\define@key[psset]{pst-lsystem}{Ftype}[4]{\def\psk@lsystem@Ftype{#1 }} +\define@key[psset]{pst-lsystem}{N2}[4]{\def\psk@lsystem@Nii{#1 }} +\define@key[psset]{pst-lsystem}{BaseLength}[1mm]{\pst@getlength{#1}\psk@lsystem@BaseLength} +\psset[pst-lsystem]{F={},X={},Y={},Start={},Angle=45,N=5,Ftype=4,BaseLength=1mm} +% +\define@key[psset]{pst-lsystem}{usecolor}[0]{\def\psk@lsystem@color{#1}}% 0 is no color +% +\define@key[psset]{pst-lsystem}{order}[5]{\pst@getint{#1}\psk@lsystem@order} +\psset[pst-lsystem]{order=5,usecolor=0} +% +\def\pslsystem{\def\pst@par{}\pst@object{pslsystem}} +\def\pslsystem@i{\@ifnextchar(\pslsystem@ii{\pslsystem@ii(0,0)}}% +\def\pslsystem@ii(#1){% #1: origin of starting point + \begin@SpecialObj + \pst@getcolor{\pslinecolor}\psk@linecolor + \pst@getcoor{#1}\pst@tempA + \addto@pscode{ + \pst@tempA\space /yOrig ED /xOrig ED + tx@lsystemDict begin + /order \psk@lsystem@order\space def + /N \psk@lsystem@N def + /Ftype \psk@lsystem@Ftype def + /angle \psk@lsystem@Angle def + /START {\psk@lsystem@Start } bind def + /Element { \psk@lsystem@BaseLength } def + \ifcase\psk@lsystem@Ftype + /F { D } def + \or %1 + /F { 0 eq { D } if } def + \or %2 + /F { dup 0 eq { D } if } def + \or %3 + /F { pop D } def + \else %4 + /F { dup 0 eq { D }{ 1 sub \psk@lsystem@Fnumber {dup} repeat \psk@lsystem@F } ifelse pop } def + \fi + /X { dup 0 ne { 1 sub \psk@lsystem@Xnumber { dup } repeat \psk@lsystem@X } if pop } def + /Y { dup 0 ne { 1 sub \psk@lsystem@Ynumber { dup } repeat \psk@lsystem@Y } if pop } def + /START {\psk@lsystem@Start } def + 1 setlinejoin + 1 setlinecap +% define a color procedure. Parameter is depth. BW used if no color defined + \ifcase\psk@lsystem@color + /color { pop \pst@usecolor\psk@linecolor } def + \or + /color { % random branches + pop 3 {rand 100 mod 100 div} repeat setrgbcolor + } def + \or + /color { % random subtrees + 2 eq {3 {rand 100 mod 100 div} repeat setrgbcolor} if + } def + \or + /color { % lighter green towards leaves, linear + order exch sub order 2 mul div 1 3 div exch .7 exch sethsbcolor + } def + \or + /color { % lighter green towards leaves, exponential + neg 1.5 exch exp 2 div 1 3 div exch .7 exch sethsbcolor + } def + \else + /color { pop \pst@usecolor\psk@linecolor } def + \fi + xOrig yOrig moveto + 90 rotate + N START + end + \pst@number\pslinewidth SLW + \pst@usecolor\psk@linecolor + }% + \pst@stroke + \end@SpecialObj} +% +% +\catcode`\@=\PstAtCode\relax +% +%% END: pst-lsystem.tex +\endinput +% + |