% TeX Mandelbrot Program % % My entry for the contest ``The most useless TeX program ever written''. % Can anyone top that? (Don't mention MusicTeX in this context. That's not % meant to be a joke.) % Also welcome: Improvements of this saving on TeX's resources. This takes % more than five minutes on my NeXT 486/66. % % Seb, 6.7.94 % % (seb@balu.afp.ruhr-uni-bochum.de) % % % parameters that you can modify: % % \x, \y, \xmax, \ymax in units of 10000 \newcount\x \x=-20000 % means -2.000 for real part of start value \newcount\y \y=-20000 % imaginary part \newcount\xmax \xmax=20000 % end value, real \newcount\ymax \ymax=20000 % end value, imaginary % % calculation depth \newcount\mandeldepth \mandeldepth=100 % % % recursation depth = number of pixels. \newcount\xsize % (Don't go wild, tail recursion \xsize=100 % uses loads of TeX memory!) \newcount\ysize \ysize=100 % % picture size \newdimen\height \newdimen\width \height=10cm \width=10cm % % that was all the parameters! % % % pixel size: \newdimen\xgrid \xgrid=\height \divide\xgrid by\xsize \newdimen\ygrid \ygrid=\width \divide\ygrid by\ysize % \nopagenumbers % \newcount\stepX % work out step sizes \stepX=\xmax \advance\stepX by -\x \divide\stepX by\xsize \newcount\stepY \stepY=\ymax \advance\stepY by -\y \divide\stepY by\ysize % \def\cout#1{\immediate\write16{#1}} % type out debug message % \def\yes{Y} % some stupid logical macros \def\no{N} \def\notyet{x} % \newcount\u % variables for calculation \newcount\v \newcount\newV \newcount\newU \newcount\d \newcount\h \def\runmandel{% % recursive Mandelbrot macro \newU=\u% \multiply\newU by \u% % newU := u^2 \h=\v% \multiply\h by \v% % h := v^2 \advance\newU by -\h% % newU := u^2 - v^2 \h=\x% \multiply\h by 10000% % h := x * 10000 (normalize) \advance\newU by \h% % newU := newU + h \divide\newU by 10000% % renormalize u \newV=\u% \multiply\newV by \v% \multiply\newV by 2% % newV := 2 *u * v \h=\y% \multiply\h by 10000% % h := y * 10000 \advance\newV by \h% % newV := newV + h \divide\newV by 10000% % renormalize v \u=\newU% % newU = u^2 - v^2 + x \v=\newV% % newV = 2 * u * v + y \advance\d by 1% % \cout{d: \the\d, u: \the\u, v: \the\v}% \ifnum\d>\mandeldepth% % member ofthe Mandelbrot set \def\result{\yes}% \fi% \ifnum\u<-20000% \def\result{\no}% % real part exceeded -2 \fi% \ifnum\u>20000% \def\result{\no}% % real part exceeded 2 \fi% \ifnum\v<-20000% \def\result{\no}% % imaginary part exceeded -2 \fi% \ifnum\v>20000% \def\result{\no}% % real part exceeded 2 \fi% \if\notyet\result\runmandel\fi% % play it again... }% \def\result{\yes}% \def\makeline{\advance\x by \stepX% %\cout{testing \the\x = i * \the\y}% \u=0% \v=0% \d=0% \def\result{\notyet}% \runmandel% result expands to either yes or no now \if\result\yes% \vrule height \xgrid depth 0pt width \ygrid% \else% \vrule height \xgrid depth 0pt width 0pt\hskip\xgrid% \fi% \ifnum\x<\xmax% \makeline% \else\fi}% \def\makepicture{\advance\y by \stepY% \hbox{\makeline}% %\cout{y in makepicture: \the\y}% \ifnum\y<\ymax% \makepicture% \else\fi}% \vbox{\offinterlineskip\makepicture} % now, let's go tail \bye % recursive!