%% %% FMP Tutorial (English) %% Copyright (C) 1998 Joachim Korittky %% Copyright (C) 2002 Meik Hellmund %% %% This file is part of Functional MetaPost. %% %% Functional MetaPost is free software; you can redistribute it %% and/or modify it under the terms of the GNU General Public License %% as published by the Free Software Foundation; either version 2 of %% the License, or (at your option) any later version. %% %% Functional MetaPost is distributed in the hope that it will be %% useful, but WITHOUT ANY WARRANTY; without even the implied warranty %% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with Functional MetaPost; if not, write to the %% Free Software Foundation, Inc., 59 Temple Place, Suite 330, %% Boston, MA 02111-1307 USA %% \documentclass[fleqn]{article} %options hugs -h1m -P:/home/wferi/FuncMP-1.2 %align 33 \usepackage{a4wide} %\usepackage[german,english]{babel} \usepackage{latexsym} %\usepackage{moreverb} %\usepackage{boxedminipage} \usepackage{mflogo} \usepackage{color} \usepackage{float} \usepackage{wrapfig} \usepackage{floatflt} \makeatletter \usepackage{amstext} \usepackage{amssymb} \usepackage{epsfig} \usepackage{ulem}\normalem \usepackage{fancyheadings} \newsavebox{\POv} \newsavebox{\PSOv} \newsavebox{\PBe} \newsavebox{\PSBe} \newlength{\lboxh} \newlength{\lboxhh} \newlength{\lboxw} \settowidth{\lboxw}{$\scriptstyle\Box$} \settoheight{\lboxh}{$\scriptstyle\Box$} \setlength{\lboxhh}{\lboxh} \addtolength{\lboxhh}{.2em} \addtolength{\lboxh}{.05em} \savebox{\POv}{$\scriptstyle\Box$\hskip-\lboxw\raisebox{\lboxh} {$\scriptstyle\Box$}} \savebox{\PSOv}{$\scriptstyle\Box$\hskip-\lboxw\raisebox{\lboxhh} {$\scriptstyle\Box$}} \savebox{\PBe}{$\scriptstyle\Box\hskip-.2em\Box$} \savebox{\PSBe}{$\scriptstyle\Box\hskip-.05em\Box$} \newcommand{\POver}{\raisebox{-.15em}{\usebox{\POv}}} \newcommand{\PSOver}{\raisebox{-.25em}{\usebox{\PSOv}}} \newcommand{\PBeside}{\usebox{\PBe}} \newcommand{\PSBeside}{\usebox{\PSBe}} \pagestyle{fancyplain} %\renewcommand{\sectionmark}[1]{\markright{#1}{\thesection\ #1}} \lhead[\fancyplain{}{\bfseries\thepage}] {\fancyplain{}{\itshape\rightmark}} \rhead[\fancyplain{}{\itshape\leftmark}] {\fancyplain{}{\bfseries\thepage}} \cfoot{} \setlength{\headheight}{13pt} \DeclareFontFamily{OT1}{cmtex}{} \DeclareFontShape{OT1}{cmtex}{m}{n} {<5><6><7><8>cmtex8 <9>cmtex9 <10><10.95><12><14.4><17.28><20.74><24.88>cmtex10}{} \DeclareFontShape{OT1}{cmtex}{m}{it} {<-> ssub * cmtt/m/it}{} \newcommand{\texfamily}{\fontfamily{cmtex}\selectfont} \DeclareFontShape{OT1}{cmtt}{bx}{n} {<5><6><7><8>cmtt8 <9>cmbtt9 <10><10.95><12><14.4><17.28><20.74><24.88>cmbtt10}{} \DeclareFontShape{OT1}{cmtex}{bx}{n} {<-> ssub * cmtt/bx/n}{} \newcommand{\tex}[1]{\text{\texfamily#1}} % NEU \newcommand{\Sp}{\hskip.33334em\relax} \usepackage{times}\renewcommand{\ttdefault}{cmtt} \SetMathAlphabet{\mathrm}{normal}{OT1}{ptm}{m}{n} \SetMathAlphabet{\mathbf}{normal}{OT1}{ptm}{bx}{n} \SetMathAlphabet{\mathit}{normal}{OT1}{ptm}{m}{it} \newlength{\lwidht}\setlength{\lwidht}{4.5cm} \newlength{\cwidth}\setlength{\cwidth}{8mm} % 3mm \newcommand{\Conid}[1]{\mathit{#1}} \newcommand{\Varid}[1]{\mathit{#1}} \newcommand{\anonymous}{\kern0.06em \vbox{\hrule\@@width.5em}} \newcommand{\plus}{\mathbin{+\!\!\!+}} \newcommand{\bind}{\mathbin{>\!\!\!>\mkern-6.7mu=}} \newcommand{\sequ}{\mathbin{>\!\!\!>}} \renewcommand{\leq}{\leqslant} \renewcommand{\geq}{\geqslant} \newcommand{\NB}{\textbf{NB~}} \newcommand{\Todo}[1]{$\langle$\textbf{To do:}~#1$\rangle$} \newcommand{\Key}[1]{\uline{#1}} \newcommand{\FMP}{\textrm{\textit{functional}} \MP } \newcommand{\Registered}{\Pisymbol{psy}{210}} \newcommand{\beside}[2]{\parbox[c]{#1\linewidth}{#2}} %\newcommand{\beside}[2]{\parbox[c]{#1\linewidth}{\begin{center}#2\end{center}}} \newcommand{\HRule}{\rule{\linewidth}{0.5pt}\vspace{10pt}} \newcommand{\VRule}[1]{\hspace{10pt}\beside{0.01}{\rule{0.5pt}{#1}}} \definecolor{lightGrey}{gray}{.9} \newfloat{tabelle}{tbhp}{lop}[subsection] \floatname{tabelle}{Tabelle} \floatplacement{tabelle}{H} \newcommand{\Tabelle}[2]{\begin{tabelle}\caption{#1}\begin{center} \label{#1} \colorbox{lightGrey}{#2}\end{center}\end{tabelle}} %\floatstyle{boxed} \newfloat{abbildung}{tbhp}{lop}[subsection] \floatname{abbildung}{Figure} \floatplacement{abbildung}{H} \newcommand{\Abbildung}[2]{\begin{abbildung}\caption{#1}\begin{center} %\label{#1} \setlength{\fboxsep}{16pt} \fbox{#2}\end{center}\end{abbildung}} \newfloat{beispiel}{tbhp}{lop}[subsection] \floatname{beispiel}{Example} \floatplacement{beispiel}{H} \newcommand{\Beispiel}[2]{\begin{beispiel}\caption{#1}\begin{center} %\label{#1} \setlength{\fboxsep}{16pt} \fbox{\small #2}\end{center}\end{beispiel}} \newcommand{\BeispielWrap}[2]{% \begin{floatingfigure}[r]{#1} \setlength{\fboxsep}{0pt} \fbox{\small #2} \end{floatingfigure}} %\newfont{\Pretty}{pretty10} %\newcommand{\addtoprog}[2]{\newcommand{#1}{\protect #2}\addcontentsline{prg}{program}{\protect#1}} %\newcommand{\l@@program}[2]{\par\noindent#1 {\itshape #2}} %\newcommand{\listofprog}{\@@starttoc{prg}} \parindent0cm \begin{document} \makeatother \title{\texttt{\FMP} \\ Tutorial} \author{Joachim Korittky} %\selectlanguage{german} \begin{hide} > module Tutorial where > import FMPTurtle > import FMPTree > import FMPCanvas > import FMPMatrix > import FMPFrames \end{hide} \maketitle \tableofcontents \newpage \enlargethispage{3cm} > dbs = draw [arrow ("Information"<+C) ("Query"<+C), > arrow ("Spec"<+C) ("Query"<+C), > arrow ("Proc"<+C) ("Querying"<+C), > arrow ("Output"<+C) ("Querying"<+C), > arrow ("Querying"<+C) ("Bib"<+C), > arrow ("Query"<+C) (xy (ref("Servers"<+C))(ref("Query"<+C))) > #setEndCut"Servers", > line (xy (ref ("Center"<+W)-vec(10,0)) (ref ("Information" <+N))) > (xy (ref ("Center"<+W)-vec(10,0)) (ref ("Warehouse"<+S))) > # setPattern dotted, > line (xy (ref ("Center"<+E)+vec(10,0)) (ref ("Information" <+N))) > (xy (ref ("Center"<+E)+vec(10,0)) (ref ("Warehouse"<+S))) > # setPattern dotted > ] > (cdrop (0,0) frontEnd & cdrop (200,0) backEnd > & cdrop (440,30) servers) > where > frontEnd = (oval (texCol "specification\\\\Component") # setName "Spec") > |=|(oval (texCol "Data Processing\\\\Component") # setName "Proc") > |=|(oval (texCol "Output\\\\Component") # setName "Output") > backEnd = setTrueBoundingBox(drum (texCol "Information\\\\Servers\\\\Descriptions") > # setName "Information") > |=|(box ((box ("\\parbox{150pt}{\\begin{itemize}\\item Query Generation" ++ > "\\item Information Server Selection\\item Query Translation" ++ > "\\item$\\ldots$\\end{itemize}}") #setName "Query") > |=| (box ("\\parbox{95pt}{\\begin{itemize}\\item Querying\\item Browsing" ++ > "\\item Reorganization\\item Ranking\\item$\\ldots$\\end{itemize}}") > # setName "Querying"))#setName"Center" # setDX 16 # setDY 16) > |=|(setTrueBoundingBox(drum (texCol "Bibliographic\\\\Data\\\\Records") > # setName"Bib") > |=|"Warehouse" #setBGColor 0.9#setName"Warehouse") > servers = fuzzy 1 2 (tex "Library Catalogues" |=| vspace 30 > |=| tex "Electronic Journals" |=| vspace 30 > |=| tex "FTP Servers") # setName "Servers" > texCol c = tex ("\\begin{tabular}{c}"++c++"\\end{tabular}") \begin{center} %if recalc \perform{ generate "DataBases" 1 dbs } %else \epsfig{file=DataBases.1,width=12cm} %endif \end{center} \newpage \subsection{Introduction} > conc259 = draw [arrow ("1" <+ C) (dk!!0,0), > arrow ("2" <+ C) (dk!!1,-5), > arrow ("n" <+ C) (dk!!8,-40)] > (cards > & cdraw (darrow (100+dk!!1,-20) (0,-20) "d_2") > & cdraw (darrow (100+dk!!2,-30) (0,-30) "d_3") > & cdraw (darrow (100-100*d 11,-55) (0,-55) "d_{n+1}") > & cdraw ((-330,-45).-.(100-100*d 11,-45) > .-.(100-100*d 11,-70)) > & cdrop (-230,-60) "table" > & cdrop (-120,20) (tex "card $1$" # setName "1") > & cdrop (-175,15) (tex "card $2$" # setName "2") > & cdrop (-310,-20) (tex "card $n$"# setName "n")) > where > cards = foldl (&) relax [cdraw ((x,y).-.(x+100,y) > .-.(x+100,y-5).-.(x,y-5).-.cycle') > |(x,y)<-zip dk [0,-5..]] > dk = [-100*d i|i<-[2..10]] > d 1 = 0 > d n = (n-1+sum [d i|i<-[1..(n-1)]])/(n-1) > darrow a b s = a .-. b # setArrowHead (arrowHeadSize 4 180) > # setStartArrowHead (arrowHeadSize 4 180) > # setLabel 0.5 C (math s # setBGColor white) \begin{center} %if recalc \perform{ generate "Concrete" 259 conc259 } %else \epsfig{file=Concrete.259} %endif \end{center} \newpage > conc66 = box (0,0) (50,100) (\i->(0,200-i*1.5)) > (\i->(i*1.5,200)) > & box(50,0) (100,33.3) (\i->(0,i)) (\i->(i,-50)) > & box(75,33.3) (100,66.6) (\i->(0,100-i)) (\i->(i,100)) > & box(50,33.3) (75,53.3) (\i->(0,i)) (\i->(i,0)) > & cdraw (vec(50,100).-.vec(100,100).-.vec(100,50)) > & frac (-10,50) 1 > & frac (25,-12) 2 > & frac (75,-12) 2 > & frac (110,17) 3 > & frac (110,50) 3 > & frac (62,65) 4 > & frac (88,78) 4 > & frac (40,42) 5 > & cdrop (65,90) "etc." > where > frac p n = cdrop p (math ("\\frac{\\textstyle 1}{\\textstyle " > ++show n ++"}") # setBGColor white) > box (ax,ay)(bx,by)fa fb = cdrop (0.5*(ax+bx),0.5*(ay+by)) > (cdraws [fa i.-.fb i|i<-[-50,-40..200]] > & cclip p > & cdraw p) > where > p = vec(ax,ay) .-.vec(bx,ay) .-.vec(bx,by) > .-.vec(ax,by) .-. cycle' \begin{center} %if recalc \perform{ generate "Concrete" 66 conc66 } %else \epsfig{file=Concrete.66} %endif \end{center} \newpage > hamilton = arrows (matrix [[empty,empty,k 1,empty,k 4], > [i ||| hspace 20,empty,empty,empty, > empty,empty,hspace 20|||ip1], > [empty,k 2,empty,k 5,empty, > k 6 # setName "6"]]) > where > i = circle (math "i") # setName "i" > ip1 = oval (math "i+1") # setName "ip1" > k s = boxArrows s (box (math ("K_"++show s)) > # setDX 8 > # setDY 8) > arrows = draw [("i"<+C) ... (2<*1<*C) # setEndAngle 0, > ("i"<+C) ... (1<*2<*C) # setEndAngle 0, > curve (1<*5<*C) 0 0 (4<*3<*C), > curve (2<*4<*C) 0 0 (5<*3<*C), > curve (5<*6<*C) 0 0 (6<*2<*C), > arrow (4<*6<*C) ("ip1"<+C) # setStartAngle 0, > arrow (6<*5<*C) ("ip1"<+C) # setStartAngle 0] > curve x a1 a2 y = x ... y # setStartAngle a1 # setEndAngle a2 > boxArrows :: Int -> Frame -> Picture > boxArrows s = setName s . draw [ out 4 0.2, out 5 0.5, out 6 0.8, > to 1 0.2, to 2 0.5, to 3 0.8] > where > out m n = arrow (med n (ref NE) (ref SE)) > (med n (ref NE) (ref SE)+vec(10,0)) > # setLabel 1 C (empty # setName (m::Int)) > to m n = arrow (med n (ref NW) (ref SW)-vec(10,0)) > (med n (ref NW) (ref SW)) > # setLabel 0 C (empty # setName (m::Int)) \begin{center} %if recalc \perform{ generate "Schoening" 165 hamilton } %else \epsfig{file=Schoening.165} %endif \end{center} \newpage > torte = cake [(30,blue),(15,red),(10,green),(10,yellow)] > where > cake as = drawBack (toAngles as) > & drawCake (toAngles as) > toAngles as = ad (map (\(a,c)-> (a/(sum (map fst as)/360),c)) as) > ad [] = [(0,black)] > ad ((a,c):as) = (a+fst (head (ad as)),c):ad as > drawBack [] = relax > drawBack [_] = relax > drawBack ((a,c):(b,c2):as) > = cfill (toArea (carc' (vec(0,-10)) 100 60 a b .-. carc' (vec(0,0)) 100 40 b a .-. cycle') > #setColor (c-grey 0.3)) & drawBack ((b,c2):as) > drawCake [] = relax > drawCake [_] = relax > drawCake ((a,c):(b,c2):as) > = cfill (toArea (vec (0,0) .-. carc' (vec(0,0)) 100 60 a b .-. cycle') > #setColor c) & drawCake ((b,c2):as) > carc' :: Point -> Numeric -> Numeric -> Numeric -> Numeric -> Path > carc' p rx ry w1 w2 = (p + vec (rx*cos a1, - ry*sin a1) > ... p + vec (rx*cos a2, - ry*sin a2) > ... p + vec (rx*cos a2b, - ry*sin a2b) > ... p + vec (rx*cos a3, - ry*sin a3) > ... p + vec (rx*cos a4b, - ry*sin a4b) > ... p + vec (rx*cos a4, - ry*sin a4) > ... p + vec (rx*cos a5, - ry*sin a5)) > where > a1 = w1 > a2 = w1 + 0.05*(w2 - w1) > a2b = w1 + 0.25*(w2 - w1) > a3 = w1 + 0.5 *(w2 - w1) > a4b = w1 + 0.75*(w2 - w1) > a4 = w1 + 0.95*(w2 - w1) > a5 = w2 \begin{center} %if recalc \perform{ generate "Torte" 1 torte } %else \epsfig{file=Torte.1} %endif \end{center} \newpage \subsection{Atomic pictures} The basic data type of the \FMP\ language is |Picture| or shorter, |Pic|. Expressions of this type describe pictures, which can be copiled to \MP--code or combined to new more complex pictures. Atomic pictures are those not generated by combination or modification of other pictures. Two such atomic expressions are the embedding of arbitrary \LaTeX\ expressions and the generation of an empty rectangle of given size: < tex :: String -> Picture < space :: Numeric -> Numeric -> Picture Every picture in \FMP\ has a surrounding bounding box.\footnote{A bounding box in \FMP\ is not necessarily rectangular. Triangular and circular bounding boxes are also possible.} Bounding boxes allow the combination of pictures without accidental overlaps. The two atomar functions |tex| and |space| can be extended easily. The following function allows the use of the \TeX\ math mode < math :: String -> Picture < math p = tex ("$" ++ p ++ "$") Also defined are functions for horizontal or vertical space (with names borrowed from \LaTeX) < hspace, vspace :: Numeric -> Picture < hspace n = space n 0 < vspace n = space 0 n This will be useful, too: < empty :: Picture < empty = space 0 0 \subsection{Colors} Every visible object in \FMP\ has a color. The default is |black|. Colors are described by their RGB values, i.e. by additive mixing of the basic colors red, green and blue: < color :: Double -> Double -> Double -> Color Some colors are predefined: < white = color 1 1 1 < black = color 0 0 0 < red = color 1 0 0 < green = color 0 1 0 < blue = color 0 0 1 < yellow = color 1 1 0 < cyan = color 0 1 1 < magenta = color 1 0 1 < grey n = color n n n The type |Color| is an instance of |Num| and |Fractional|. We can add, subtract and multiply colors. This happens componentwise. Therefore, |red + green| gives |yellow| and |cyan - blue| denotes the color |green|. The function |fromRational| is implemented, too: |0.5 * magenta| is interpreted as |grey 0.5 * magenta|, giving |color 0.5 0 0.5|. The color of a picture is changed by < setColor :: Color -> Picture -> Picture Properties of pictures, like |Color|, are called attributes and modified by attribute functions. One such attribute function, setting the background color, is < setBGColor :: Color -> Picture -> Picture Attribute functions are more readable using a postfix notation and the |#| operator. < (#) :: a -> (a -> b) -> b < a # f = f a \Abbildung{Color attribute functions}{ \beside{0.75}{ > color1 = tex "colors" > # setColor green > # setBGColor 0.2 } \VRule{30pt} \beside{0.16}{ \begin{center} %if recalc \perform{ generate "TutColor" 1 color1 } %else \epsfig{file=TutColor.1} %endif \end{center} }} \subsection{Frames} < box, circle, oval :: Picture -> Picture %if recalc \perform{ generate "TutDrum" 1 newshapes } %else \epsfig{file=TutDrum.1} %endif > newshapes = shape (setDX 10.triangle) > |||| shape (triangle) > |||| cloud 345 67 (tex "joe") > shape :: (IsPicture a, HasBGColor a) > => (Picture -> a) -> Picture > shape f = setTrueBoundingBox > (draw [ ref C .-. ref C + 60 .* dir a > | a <- [0, 10.. 360] ] > (f (tex "joe") # setBGColor 0.7)) %erw"ahne automatische Gr"o"senanpassung %Attributierung; dx %Boxen fester Gr"o"se \subsection{Combination of pictures} Up to now, we created atomic pictures and added frames. Let us now combine two pictures to a new one. The most common combinators set two pictures side by side or on top of the other. < (|||) :: Picture -> Picture -> Picture < (|-|) :: Picture -> Picture -> Picture Sometimes we want a small distance between the pictures: < (||||) :: Picture -> Picture -> Picture < a |||| b = a ||| hspace 8 ||| b < (|=|) :: Picture -> Picture -> Picture < a |=| b = a |-| vspace 8 |-| b Now it is time to discuss units. \MP\ uses as basic unit PostScript points which correspond to $1/72$ inch. We use them in \FMP, too. |hspace 8| defines a horizontal distance of $1/9$ inch or approximately $2.82$ mm. Some predefined constants allow the use of other units < mm, pt, bp, cm, pc, cc, inch :: Numeric < mm = 2.83464 < pt = 0.99626 < dd = 1.06601 < bp = 1 < cm = 28.34645 < pc = 11.95517 < cc = 12.79213 < inch = 72 |hspace (2*cm)| generates a distance of two centimeters. \Abbildung{Placements}{ \beside{0.9}{ > bsp30 = tree1 > |||| hspace 10 > |||| ("$\\Longrightarrow$" |=| "right rotation") > |||| hspace 10 > |||| tree2 \begin{hide} > tree1 = node (circle "y" # label E "-1") [enode (circle "x" # label E "-1") [ > enode tri1 [], > enode tri2 []], > enode tri3 []] # setDistH 16 > tree2 = node (circle "x" # label E "0") [enode tri1 [],edge (node (circle "y" # label E "0") [ > edge (node tri2 [] # setDistV (distCenter 30)), > edge (node tri3 [] # setDistV (distCenter 30))] # setDistH 20)] # setDistH 26 > tri1 = triangle "1" # setDY 1 # setHeight 60 # setWidth 20 # label S (math "h") > tri2 = triangle "2" # setDY 1 # setHeight 30 # setWidth 10 # label S (math "h-1") > tri3 = triangle "3" # setDY 1 # setHeight 30 # setWidth 10 # label S (math "h-1") \end{hide} \HRule \begin{center} %if recalc \perform{ generate "TutArrange" 30 bsp30 } %else \epsfig{file=TutArrange.30} %endif \end{center} }} \Abbildung{Combinations of frames and placements}{ \beside{0.9}{ > bsp40 = box2 (tex "set of all languages" > |=| box2 (tex"rec. enum. languages or typ 0" > |=| box2 (tex "decideable languages" > |=| box2 (tex "contextsensitive or typ 1" > |=| box2 (tex "contextfree or typ 2" > |=| box2 "regular or typ 3--languages"))))) > where > box2 a = rbox 20 a > # setDX 8 > # setDY 8 \HRule \begin{center} %if recalc \perform{ generate "TutArrange" 40 bsp40 } %else \epsfig{file=TutArrange.40} %endif \end{center} }} The combinators have generalizations for more than two pictures: < row :: [Picture] -> Picture < column :: [Picture] -> Picture Fig.~\ref{fig:traffic} shows a variant with additional space between the pictures < rowSepBy :: Numeric -> [Picture] -> Picture < columnSepBy :: Numeric -> [Picture] -> Picture \Abbildung{\label{fig:traffic}A traffic light}{ \beside{0.75}{ > bsp60 = box ( columnSepBy 10 > [circle "R" > # setDX 10 > # setBGColor red, > circle "O" > # setDX 10 > # setBGColor yellow, > circle "G" > # setDX 10 > # setBGColor green ] ) > # setBGColor black > # setDX 10 > # setDY 10 }\VRule{150pt} \beside{0.16}{ \begin{center} %if recalc \perform{ generate "TutArrange" 60 bsp60 } %else \epsfig{file=TutArrange.60} %endif \end{center} }} Sometimes we need a two dimensional alignment of pictures, as in Fig.~\ref{fig:matrix1}. < matrix :: [[Picture]] -> Picture The function |matrix| generates columns and rows. Every column has the width of the picture with the largest width in it. Analogously, every row has the height of the highest picture in it. Then the pictures are centered in the so-defined rectangular cells. There is also a variant with additional space: < matrixSepBy :: Numeric -> Numeric -> [[Picture]] -> Picture \Abbildung{Alignment with the |matrix| function\label{fig:matrix1}}{ \beside{0.75}{ > matrix1 = matrix [ [tex "a", tex "b" ], > [empty, tex "c", tex "d"]] }\VRule{40pt} \beside{0.16}{ \begin{center} %if recalc \perform{ generate "TutMatrix" 1 matrix1 } %else \epsfig{file=TutMatrix.1} %endif \end{center} }} \subsection{Paths} type Point, < vec :: (Numeric, Numeric) -> Point < med :: Numeric -> Point -> Point -> Point type Numeric < xpart :: Point -> Numeric < ypart :: Point -> Numeric < angle :: Point -> Numeric < dist :: Point -> Point -> Numeric < med :: Numeric -> Numeric -> Numeric -> Numeric composite functions: < dir :: Numeric -> Point < dir a = vec (cos a, sin a) < xy :: Point -> Point -> Point < xy p1 p2 = vec (xpart p1, ypart p2) < xdist :: Point -> Point -> Numeric < xdist p1 p2 = xpart p1 - xpart p2 < ydist :: Point -> Point -> Numeric < ydist p1 p2 = ypart p1 - ypart p2 Syntax for paths: < (.-.) :: (IsPath a, IsPath b) => a -> b -> Path < (...) :: (IsPath a, IsPath b) => a -> b -> Path < (.--.) :: (IsPath a, IsPath b) => a -> b -> Path < (....) :: (IsPath a, IsPath b) => a -> b -> Path < (.&.) :: (IsPath a, IsPath b) => a -> b -> Path < cycle' :: Path \Abbildung{A simple path of line segments}{ \beside{0.9}{ > path1 = vec (20,20) .-. vec (0,0) .-. vec (0,30) > .-.vec (30,0) .-. vec (0,0) \begin{hide} > dot' = toPicture bullet > path1' = path1 > # setLabel 0 C dot' > # setLabel 0.25 C dot' > # setLabel 0.5 C dot' > # setLabel 0.75 C dot' > # setLabel 1 C dot' \end{hide} \HRule \begin{center} %if recalc \perform{ generate "TutPath" 1 path1' } %else \epsfig{file=TutPath.1} %endif \end{center} }} \begin{hide} > mark5 :: (IsPicture a) => a -> Picture > mark5 p = overlay' [ > ref ((0::Int) <+ C) .= ref (global "z0"), > ref ((1::Int) <+ C) .= ref (global "z1"), > ref ((2::Int) <+ C) .= ref (global "z2"), > ref ((3::Int) <+ C) .= ref (global "z3"), > ref ((4::Int) <+ C) .= ref (global "z4")] > (Just 1) [dot', dot', dot', dot', > dot', toPicture p] > fig4a = define [ ref "z0" .= vec (0,0), > ref "z1" .= vec (60,40), > ref "z2" .= vec (40,90), > ref "z3" .= vec (10,70), > ref "z4" .= vec (30,50)] > (column [ > setTrueBoundingBox (mark5 ("z0" ... "z1" ... "z2" ... "z3" ... "z4")) > ]) > fig4b = define [ ref "z0" .= vec (0,0), > ref "z1" .= vec (60,40), > ref "z2" .= vec (40,90), > ref "z3" .= vec (10,70), > ref "z4" .= vec (30,50)] > (column [ > setTrueBoundingBox (mark5 ("z0" ... "z1" ... "z2" ... "z3" ... "z4" ... cycle')) > ]) > fig4c = define [ ref "z0" .= vec (0,0), > ref "z1" .= vec (60,40), > ref "z2" .= vec (40,90), > ref "z3" .= vec (10,70), > ref "z4" .= vec (30,50)] > (column [ > setTrueBoundingBox (mark5 ("z0" ... "z1" ... "z2" ... "z3" .-. "z4" .-. cycle')) > ]) \end{hide} \Abbildung{Different path connectors}{ \begin{tabular}{ccc} |z0 ... z1 ... z2 ... z3 ... z4| & |z0 ... z1 ... z2 ... z3 ... z4 ... cycle'| & |z0 ... z1 ... z2 ... z3 .-. z4 .-. cycle'| \\[2em] \hline\\[1em] %if recalc \perform{ generate "TutFigureA" 4 fig4a } %else \epsfig{file=TutFigureA.4} %endif & %if recalc \perform{ generate "TutFigureB" 4 fig4b } %else \epsfig{file=TutFigureB.4} %endif & %if recalc \perform{ generate "TutFigureC" 4 fig4c } %else \epsfig{file=TutFigureC.4} %endif \end{tabular} } \Abbildung{Start and end angle of path segments can be set}{ \beside{0.70}{ \beside{0.5}{ > fig7 = [ vec (0, 0) ... vec (3*cm, 0) > # setStartAngle 45 > # setEndAngle (-10*a) > | a <- [0..9] ] }\VRule{60pt} \beside{0.35}{ %if recalc \perform{ generate "TutPath" 7 fig7 } %else \epsfig{file=TutPath.7} %endif }\\ \beside{0.5}{ > fig8 = [ vec (0, 0) ... vec (3*cm, 0) > # setStartAngle 45 > # setEndAngle (10*a) > | a <- [0..7] ] }\VRule{60pt} \beside{0.35}{ %if recalc \perform{ generate "TutPath" 8 fig8 } %else \epsfig{file=TutPath.8} %endif }}} \Abbildung{The difference between the path connectors |(...)| and |(....)|.}{ \beside{0.9}{ > fig9 = rowSepBy 20 [ (z0...z1 > # setStartVector up > # setEndVector right)...z2 > # setEndVector down, > (z0....z1 > # setStartVector up > # setEndVector right)....z2 > # setEndVector down ] \begin{hide} > where > z0 = vec(-50,0) > z1 = vec( 0,8) > z2 = vec( 50,0) > fig9' = rowSepBy 20 [ mark3 ((z0...z1 > # setStartVector up > # setEndVector right)...z2 > # setEndVector down), > mark3 ((z0....z1 > # setStartVector up > # setEndVector right)....z2 > # setEndVector down) ] > where > mark3 :: (IsPicture a) => a -> Picture > mark3 p = setTrueBoundingBox (overlay' [ > ref ((0::Int) <+ C) .= z0, > ref ((1::Int) <+ C) .= z1, > ref ((2::Int) <+ C) .= z2] > (Just 1) [dot', dot', > dot', toPicture p]) > z0 = vec(-50,0) > z1 = vec( 0,8) > z2 = vec( 50,0) \end{hide} \HRule \begin{center} %if recalc \perform{ generate "TutPath" 9 fig9' } %else \epsfig{file=TutPath.9} %endif \end{center} }} \Abbildung{The tension ``pulling'' a path segments can be set}{ \beside{0.9}{ > fig10 = rowSepBy 20 [ > z0...( z1...z2 > # setJoin (joinTension (tension 1)) ) > ...z3, > z0...( z1...z2 > # setJoin (joinTension (tension 2.3)) ) > ...z3, > z0...( z1...z2 > # setJoin (joinTensions (tension 2.5) > (tension 0.8)) ) > ...z3 ] \begin{hide} > where > z0 = vec( 0,0) > z1 = vec( 15,15) > z2 = vec( 75,15) > z3 = vec( 90,0) > fig10' = rowSepBy 20 [ > mark4 (z0...(z1...z2 > # setJoin (joinTension (tension 1))) > ...z3), > mark4 (z0...( z1...z2 > # setJoin (joinTension (tension 2.3))) > ...z3), > mark4 (z0...( z1...z2 > # setJoin (joinTensions (tension 2.5) > (tension 0.8))) > ...z3) ] > where > mark4 :: (IsPicture a) => a -> Picture > mark4 p = setTrueBoundingBox (overlay' [ > ref ((0::Int) <+ C) .= z0, > ref ((1::Int) <+ C) .= z1, > ref ((2::Int) <+ C) .= z2, > ref ((3::Int) <+ C) .= z3] > (Just 1) [dot', dot', dot', > dot', toPicture p]) > z0 = vec( 0,0) > z1 = vec( 15,15) > z2 = vec( 75,15) > z3 = vec( 90,0) \end{hide} \HRule \begin{center} %if recalc \perform{ generate "TutPath" 10 fig10' } %else \epsfig{file=TutPath.10} %endif \end{center} }} < draw :: [Path] -> Picture -> Picture \subsection{Dash patterns} < dashPattern :: [Double] -> Pattern derived functions: < dashed :: Pattern < dashed = dashPattern [3, 3] < dotted :: Pattern < dotted = dashPattern [-1, 2.5, 0, 2.5] \subsection{Pencils} < penSquare :: (Numeric, Numeric) -> Numeric -> Pen < penCircle :: (Numeric, Numeric) -> Numeric -> Pen \Abbildung{Calligraphic effects}{ \beside{0.9}{ > calligraphic = (transformPath (scaled 40) fullcircle > # setPen (penCircle (0.1, 5) 20)) > |||| (transformPath (scaled 40) halfcircle > # setPen (penSquare (5, 5) 45)) > |||| (transformPath (scaled 40) quartercircle > # setPen 5) \HRule \begin{center} %if recalc \perform{ generate "TutPen" 1 calligraphic } %else \epsfig{file=TutPen.1} %endif \end{center} }} \Abbildung{A horizontal bracket}{ \beside{0.9}{ > hBrack = hBracket (vec(0,0)) (vec(100,0)) > where > hBracket pl pr = pl > .... pl + vec(5, 5) > .--. med 0.5 pl pr + vec(-5, 5) > .... med 0.5 pl pr + vec( 0, 10) > .&. med 0.5 pl pr + vec( 0, 10) > .... med 0.5 pl pr + vec( 5, 5) > .--. pr + vec(-5, 5) > .... pr > # setPen (penCircle (0.001, 1) 0) \HRule \begin{center} %if recalc \perform{ generate "TutPen" 2 hBrack } %else \epsfig{file=TutPen.2} %endif \end{center} }} \subsection{Arrows} < defaultArrowHead :: PathArrowHead < arrowHeadSize :: Double -> Double -> PathArrowHead derived functions: < arrowHeadBig :: PathArrowHead < arrowHeadBig = pathArrowHeadSize 8 4 < default' = defaultArrowHead different arrow styles < ahFilled, ahLine :: ArrowHeadStyle < ahFilled = AHFilled < ahLine = AHLine < setArrowHeadStyle :: ArrowHeadStyle -> ArrowHead -> ArrowHead < getArrowHeadStyle :: ArrowHead -> ArrowHeadStyle \Abbildung{A linked list}{ \beside{0.9}{ > bsp50 = pointerChain 25 ["12", "2", "2", "103"] > where > pointerChain dx ps = draw (backarrow :chainarrows) > (rowSepBy dx [ b # setName (i::Int) > | (b, i) <- zip (map recBox ps) [0..]]) > where > n = length ps > backarrow = arrow (ref (n-1 <* "bullet" <+ C)) > (ref (n-1 <* "bullet" <+ C) + vec(0,20)) > .--. arrow (ref (0 <* W) + vec(0,20)) > (ref (0 <* W)) > chainarrows = [ arrow (ref (i <* "bullet" <+ C)) > (ref (i+1 <* W)) > | i <- [0..n-2] ] > recBox a = (box a # setHeight (16*pt)) > ||| (box (toPicture bullet # setName "bullet") > # setHeight (16*pt) # setWidth (16*pt)) \HRule \begin{center} %if recalc \perform{ generate "TutArrow" 50 bsp50 } %else \epsfig{file=TutArrow.50} %endif \end{center} }} %------------------------------- \subsection{Names} < data Dir = C | N | NE | E | SE | S | SW | W | NW Reference points: C,S,N,W,E.., ref < setName :: Name -> Picture -> Picture < (<+) :: Name -> Name -> Name < (<*) :: Int -> Name -> Name %type Name + Operationen %---------------------- \subsection{Areas} type Area < fill :: [Area] -> Picture -> Picture \Abbildung{Arbitrary cyclic paths can be filled.}{ \beside{0.6}{ > bsp4 = let p = vec(-1*cm, 0) > ... vec(0, -1*cm) > ... vec(1*cm, 0) > # setStartVector down > # setEndVector up > in > fill [ (p ...vec(0, 0) > # setEndVector (vec(-1, -2))) > ...cycle' > # setEndVector up ] > (p ... vec(0, 1*cm) ... cycle') }\VRule{140pt} \beside{0.15}{ %if recalc \perform{generate "TutArea" 4 bsp4} %else \epsfig{file=TutArea.4} %endif }} \Abbildung{Another Example}{ \beside{0.9}{ > bsp5 = box ( math "U" > ||| ooalign > [ toPicture [ toArea a # setColor 0.7, > toArea b # setColor 0.7, > toArea ab # setColor 0.4 ], > aOverB ] ) > where > aOverB = column [ math "B" # setBGColor white, > vspace 50, > math "A" # setBGColor white ] > a = transformPath (scaled 30) fullcircle > aa = transformPath (scaled 30) halfcircle > b = transformPath (scaled 30 & shifted (0,-30)) > fullcircle > ab = buildCycle aa b \HRule \begin{center} %if recalc \perform{generate "TutArea" 5 bsp5} %else \epsfig{file=TutArea.5} %endif \end{center} }} \subsection{Clipping} < clip :: Path -> Picture -> Picture \subsection{Symbolic equations} < define :: [Equations] -> Picture -> Picture < define :: [Equations] -> Path -> Path < define :: [Equations] -> Area -> Area type Equation < (.=) :: a -> a -> Equation < equal :: [a] -> Equation < (.==) :: a -> a -> Boolean < (./=) :: a -> a -> Boolean < (.<) :: a -> a -> Boolean < (.<=) :: a -> a -> Boolean < whatever :: Point < whatever :: Numeric \Abbildung{Unknown values are derived automatically by equation solving.}{ \beside{0.65}{\small > bsp3 = define [ > equal [ref "z1", -ref "z2", vec(0.2*inch,0)], > equal [ xpart (ref "z3"), - xpart (ref "z6"), 0.3*inch ], > equal [ xpart (ref "z3")+ypart (ref "z3"), > xpart (ref "z6")+ypart (ref "z6"), 1.1*inch], > ref "z4" .= med (1/3) (ref "z3") (ref "z6"), > ref "z5" .= med (2/3) (ref "z3") (ref "z6"), > equal [ ref "z20", > med whatever (ref "z1") (ref "z3"), > med whatever (ref "z2") (ref "z4")], > equal [ ref "z30", > med whatever (ref "z1") (ref "z4"), > med whatever (ref "z2") (ref "z5")], > equal [ ref "z40", > med whatever (ref "z1") (ref "z5"), > med whatever (ref "z2") (ref "z6")]] > (toPicture ["z1" .-. "z20" > .-. "z2" .-. "z30" > .-. "z1" .-. "z40" > .-. "z2", > "z1" .-. "z2" > # setPen 1, > "z3" .-. "z6" > # setPen 1]) } \VRule{280pt} \beside{0.15}{ %if recalc \perform{ generate "TutDefine" 1 bsp3 } %else \epsfig{file=TutDefine.1} %endif }} \Beispiel{Brackets}{ \beside{0.9}{ > brack = [ bracket ((5+x/14) .* dir x, (10+x/8) .* dir x) > | x <- [0, 23 .. 720] ] > bracket :: (Point, Point) -> Path > bracket (pl, pr) = define [ > ref "start" .= pl, > ref "end" .= pr, > var "ang" .= angle (ref "start"-ref "end"), > var "d" .= cond (dist (ref "start") (ref "end") .< 20) > (dist (ref "start") (ref "end")/4) > 5, > ref "vecl" .= var "d" .* dir (var "ang"-135), > ref "vecr" .= var "d" .* dir (var "ang"-45), > ref "start2" .= ref "start" + ref "vecl", > ref "end2" .= ref "end" + ref "vecr", > ref "mid" .= med 0.5 (ref "start") (ref "end") > + (1.41 * var "d") > .* dir (var "ang"-90), > ref "midl" .= ref "mid" - ref "vecl", > ref "midr" .= ref "mid" - ref "vecr" ] > (pl .... ref "start2" .--. ref "midl" .... ref "mid" > .&. ref "mid" .... ref "midr" .--. ref "end2" .... pr > # setPen (penCircle (0.001, var "d"/5) (var "ang"))) \HRule \begin{center} %if recalc \perform{ generate "TutDefine" 2 brack } %else \epsfig{file=TutDefine.2} %endif \end{center} }} < overlay :: [Equations] -> [Picture] -> Picture \Beispiel{Brackets with ``intelligent'' labels}{ \beside{0.9}{ > brackLabel = [ bracket' x > ((5+x/14) .* dir x, (10+x/8) .* dir x) > | x <- [0, 67 .. 720] ] > bracket' :: IsPicture a => a -> (Point, Point) -> Path > bracket' l (pl, pr) = bracket (pl, pr) > # setLabel 0.5 C label > where > label = overlay' [ > var "ang" .= angle (pl-pr), > ref (0 <* C) .= cond (var "ang" .< (-175.5) > + 175.5 .< var "ang") > (ref (1 <* S)) > (cond (var "ang" .< (-112.5)) (ref (1 <* SE)) > (cond (var "ang" .< (-67.5)) (ref (1 <* E)) > (cond (var "ang" .< (-22.5)) (ref (1 <* NE)) > (cond (var "ang" .< 22.5) (ref (1 <* N)) > (cond (var "ang" .< 67.5) (ref (1 <* NW)) > (cond (var "ang" .< 112.5)(ref (1 <* W)) > (ref (1 <* SW)) > ))))))] (Just 0) > [empty, toPicture l] \HRule \begin{center} %if recalc \perform{ generate "TutDefine" 3 brackLabel } %else \epsfig{file=TutDefine.3} %endif \end{center} }} %------- \subsection{Transformations} < scale :: Double -> Picture -> Picture < rotate :: Double -> Picture -> Picture \Abbildung{A recursive picture.}{ \beside{0.9}{ > fig28 = rek 4 empty > where > rek 0 pic = pic > rek n pic = ooalign [draw [p] [ toArea a # setColor 0.6, > toArea p # setColor white ], > rotate 90 (scale (1/3) (rek (n-1) pic)) ] > p = transformPath (scaled 30) fullcircle > a = (vec(90, 0) ... vec(0, 30) ... vec(-90, 0) > # setEndCurl 1) > ... vec(0, -30) ... cycle' > # setEndCurl 1 \HRule \begin{center} %if recalc \perform{ generate "TutTransform" 1 fig28 } %else \epsfig{file=TutTransform.1} %endif \end{center} }} \Abbildung{Another recursive picture.}{ \beside{0.9}{ > inverse [] = [] > inverse (b:bs) = inv b:inverse bs > where > inv '0' = 'f' > inv '1' = 'e' > inv '2' = 'd' > inv '3' = 'c' > inv '4' = 'b' > inv '5' = 'a' > inv '6' = '9' > inv '7' = '8' > inv '8' = '7' > inv '9' = '6' > inv 'a' = '5' > inv 'b' = '4' > inv 'c' = '3' > inv 'd' = '2' > inv 'e' = '1' > inv 'f' = '0' > inv _ = '0' > > figBit0 = image Depth1 figBit' > figBit1 = image Depth1 (map inverse figBit') > -- The image is defined as an array of hex strings: > -- figBit' = [ > -- "00000000000000000000000000000000000000000000000000000000000000", > -- "00001000000000000200000000000000000000000000000000000000000000", > -- ... 300 more such lines ... ] > > figBitc = image Depth24 colorBit > -- colorBit =[ > -- "edcfb1ffe2bbf7e2b1ffe2bbffedcfe2c59effe2bbffe2bbffedcfedcfb1f", > -- "fa7ffe2bbf7d9b1edcfa7e2c59ee2c59eedcfb1a79e80bba7899e89769380", > -- ... etc. ... ] \begin{hide} > figBit2 = image Depth1 (map inverse figBit'') > figBit'' = [ > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffff9fffffffffffffffffffffffffffff", > "ffffffffffbfffffffffffffffffffffffffffff", "ffffffffffbfffffffffffffffffffffffffffff", > "ffffffffffbfffffffffffffffffffffffffffff", "ffffffffff0fffffffffffffffffffffffffffff", > "ffffffffffafffffffffffffffffffffffffffff", "ffffffffff0fffffffffffffffffffffffffffff", > "ffffffffff2fffffffffffffffffffffffffffff", "fffffffffb0fffffffffffffffffffffffffffff", > "fffffffffa17ffffffffffffffffffffffffffff", "fffffffffecfffffffffffffffffffffffffffff", > "fffffffff907ffffffffffffffffffffffffffff", "fffffffffd13ffffffffffffffffffffffffffff", > "fffffffffd11ffffffffffffffffffffffffffff", "fffffffff843ffffffffffffffffffffffffffff", > "fffffffffc10ffffffffffffffffffffffffffff", "fffffffff8c2ffffffffffffffffffffffffffff", > "fffffffff880ffffffffffffffffffffffffffff", "fffffffffa883fffffffffffffffffffffffffff", > "fffffffff8463fffffffffffffffffffffffffff", "fffffffff9053fffffffffffffffffffffffffff", > "fffffffff88407ffffffffffffffffffffffffff", "fffffffffb246fffffffffffffffffffffffffff", > "fffffffff00807ffffffffffffffffffffffffff", "fffffffff00927ffffffffffffffffffffffffff", > "ffffffffd10057ffffffffffffffffffffffffff", "ffffffffe44811ffffffffffffffffffffffffff", > "ffffffffe820500fffffffffffffffffffffffff", "fffffffff21000801e0c3fffffffffffffffffff", > "ffffffffd4c2009480fe50f3ffffffffffffffff", "fffffffff5d400c009f4ff8007ffffffffffffff", > "ffffffffdbeb49e010c0421fa3ffffffffffffff", "ffffffffff0383f08130120087ffffffffffffff", > "fffffffffef913fe0005e57609ffffffffffffff", "fffffffffc0647bd043d9fd7faffffffffffffff", > "fffffffffc00cbfe40f68723ad7fffffffffffff", "fffffffff8017f9f847303c0e05fffffffffffff", > "fffffffff8007f7ca80c1806019fffffffffffff", "fffffffff800757c0001f9fec74fffffffffffff", > "fffffffff1e07da0204361743033ffffffffffff", "fffffffff3f861101001a1a006d9ffffffffffff", > "fffffffff7fc7fb00000620146e6ffffffffffff", "fffffffff7fe6bf0040008d853137fffffffffff", > "fffffffff7fe1e800000101e194ebfffffffffff", "fffffffff64f1f2002000a02ace47fffffffffff", > "fffffffff637c730000003a1e309dfffffffffff", "fffffffff607fe3c10000178118ecfffffffffff", > "fffffffffe07fe790000001e9c664bffffffffff", "fffffffffa07ff7c0400003786a199ffffffffff", > "fffffffffc07fffe8000000c529ccdffffffffff", "fffffffffe0e3ffe00000007c8666bffffffffff", > "fffffffffffd9bff40000003793218ffffffffff", "fffffffffff38fffe0000000de44c27fffffffff", > "ffffffffffea47fff00000007da66b3fffffffff", "ffffffffffd983fff00000081ed199afffffffff", > "ffffffffff0b2bfff800002283ba4667ffffffff", "fffffffffe9503fffc00000052f15333ffffffff", > "ffffffffffaf2bfffe00004aa9de1aadffffffff", "ffffffffff1503ffff0001015e77c277ffffffff", > "ffffffffff8b23ffff800015492e2931ffffffff", "ffffffffff9e4bffffc002426f9dc084ffffffff", > "ffffffffff3503ffffe0100adac7f8aeffffffff", "ffffffffffab2bfffff004a57781ee11ffffffff", > "ffffffffff1d47fffff00012db60f884ffffffff", "ffffffffff9683fffff82106dec07f127fffffff", > "ffffffffffaa97fffffc042b57a03ff23fffffff", "fffffffffff687fffffe014a81508f50ffffffff", > "ffffffffffad97ffffff282be0e045ebffffffff", "ffffffffffea87bfffff80885000631cffffffff", > "ffffffffffdb47ffffffd260780848f7ffffffff", "ffffffffffb697ffffffe0021a00567fffffffff", > "ffffffffffd5477ffffff4000680171f7fffffff", "fffffffffff4c77ffffff80000002c0dffffffff", > "ffffffffffe94fffffffff8000001e87bfffffff", "ffffffffffd557fffffffffc00001da0ffffffff", > "ffffffffffed47fffffffffe00000580ffffffff", "ffffffffffdaceffffffffff008003a07fffffff", > "fffffffffff587ffffffffff80fc03f83bffffff", "ffffffffffd6afffffefffffc0ffe25a1effffff", > "fffffffffffa87ffffefffffe0fff9f5047fffff", "ffffffffffeaaffffffffff0803ffcb3421fffff", > "fffffffffff687ffffffffd4248ffcfb204fffff", "ffffffffffed97fffffffe28401ffe3a9001ffff", > "fffffffffffa87fffffff092954fff3ee8007fff", "fffffffffff697ffffffd2442bd7ff8b6c000fff", > "fffffffffffaaffffffe20bffff7ffc6fb0003bf", "fffffffffff525f7fffebfffffffffeafd1000ff", > "ffffffffffff95effffffffffffffff9760001ff", "fffffffffffa45fffffffffffffffffc3844003f", > "ffffeffffff597efffffffffffffffff1e08400f", "fffffffffffb57ffffffffffffffffffef81c1ff", > "fffffffffffecdffffffffffffffffffffe07fff", "fffffffffffd43fffff7fffffffffffffff83fff", > "fdfffffffffdd7fbefefffffffffffffffffdfff", "fffffffffffb4793ffdfffffff7fffffffffffff", > "ffffffffdffed7ffffbfffffffdfffffffffffff", "ffffbffffefaa6ffffffffffffffffffffffffff", > "ffffdfffefdfc52ff7ffffffffffffffffffffff", "ffffffffeff556fffffffffff7ffffffffffffff", > "ffffffffffeee7ffdffdffffffffffffffffffff", "ffffffffbfdf93ff77ffffffffffffffffffffff", > "fffffffffbfed7ff37ffffffffffffffffffffff", "fdfffffff5fdd7fff5fdffffffffffffffffffff", > "ff7ffefffdfeafff71fefffffeffffffffffffff", "ffdfffffffffeffffd9ffffff7ffffffffffffff", > "fffffffffffd4fffffe79fffbfffffffffffffff", "fffbffffffffefffffeffffdffffffffffffffff", > "fffffff67ffeafffe777ffefffffffffffffffff", "ffffbfffffdfefffffefde7fffffffffffffffff", > "fffffffdfeeeaffffffe5fffffffffffffffffff", "fffffffdffffefffeb9effffffffffffffffffff", > "fffffdddffff5fffcbffffffffffffffffffffff", "ffffffffdfffefffd2b7ffffffffffffffffffff", > "ffffffffff3f6fdfdfbfbfbfffffffffffffffff", "ffffffffffffef8f6aebffffffffffffffffffff", > "fffffff7ffffaeef51f7cff7ffffffffffffffff", "ffffbffbfe7dec7d1d1cffffffffffffffffffff", > "fffffffffffb6fff9f1beffdffffffffffffffff", "fffbff7bfff5c98d1fffefffffffffffffffffff", > "fffffffffe7ae989deffffffffffffffffffffff", "fffffffbfff3cfffefff7ff7ffffffffffffffff", > "fffbff5bffffcfdfffffffffffffffffffffffff", "fffffffbfffbcf8fc69fefffffffffffffffffff", > "fffffcfcffefcbaebffbffefffffffffffffffff", "ffebffffbfe9cbf767f5fffdffffffffffffffff", > "ffffff5ffff1e8de7dffffffffffffffffffffff", "ffffffdfffffcb977edfffffffffffffffffffff", > "fffffedffff5cfbeffb7ff7fffffffffffffffff", "fffffdf7ffd96b9ff3cf79fbffffffffffffffff", > "fffffffffffe8737ff577ffeffffffffffffffff", "fffffffbfeffcf2efff1dffffdffffffffffffff", > "fffffff7fff7dff7fffddf7fffffffffffffffff", "fffffff9bdffffffffff7f3fffffffffffffffff", > "fffffffffeffefffdfffffffffffffffffffffff", "fffffffd6fdffffdffeddfffffff5fffffffffff", > "ffffffdecffffefff76bfffffffffdffffffffff", "fffffffbd7fffcfffbe77fffffffffffffffffff", > "ffffffbff7ffffffbfebffffffffffffffffffff", "ffffff7ff7fff7efff7d7fffefffffffffffffff", > "fffffefcbffff7f5ffcdfffffbfffbffffffffff", "ffffffffffeff6fbefcffffff7ffffffffffffff", > "fffffffffefef3fbfbfbffffffffffffffffffff", "ffff7feffffffffffdfffefdffffffffffffffff", > "ffffffffffbfffffffffffffffffffffffffffff", "fffffefffbfffffffffffffeffffffffffffffff", > "ffdffdfff7ffffffffbfffffffffffffffffffff", "ffeffffffdfe7b7fffffffffddefffffffffffff", > "ffffffffdbffffbfffffffffffffffffffffffff", "ffefdfffffebffbfffffffffffffffffffffffff", > "ffffffffffffffffbff9fffdfdffffffffffffff", "fffffffefffffffffffbffffffffffffffffffff", > "ffff7fffffffbcfdfffcffffffffffffffffffff", "fffffdf7fffe2fffdfffffffffffffffffffffff", > "fbfffbffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ff7dfffffffffdf7dffffffffdffffffffffffff", "ffffffeffffffdf4fff7ffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "fffffffffffffffffffbffffffffffffffffffff", > "ffffffbffffffbffffffffffffffffffffffffff", "fffffffff7fffffffffdffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "fffffffffbfff7fffffdffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "fffff7ffffffffffffff7fffffffffffffffffff", > "fffffffffffdffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffdfffffffffffffffffffffffffff", > "ffffffffffffffff7fffffffffffffffffffffff", "ffffffffffffffff7fffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffff7fffffffffffffffffffffff", > "ffffffffffffbfff9fffffffffffffffffffffff", "ffffffffffffff7fbfffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffbfffffffffffffffffffffffffff", > "ffffffffffffbfffdfffffffffffffffffffffff", "ffffffffffffffffdfffffffffffffffffffffff", > "ffffffffffffffffdfffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffff", > "ffffffffffffffffefffffffffffffffffffffff", "ffffffffffffffffefffffffffffffffffffffff", > "ffffffffffffffffefffffffffffffffffffffff", "ffffffffffffffffefffffffffffffffffffffff", > "ffffffffffffffffffffffffffffffffffffffff" > ] > figBit' = [ > "00000000000000000000000000000000000000000000000000000000000000", > "00000000000000000000000000000000000000000000000000000000000000", > "01020000002000000000000000000080000800000000000000000000000000", > "00000000000800000001020000002010000000000000000000000000000000", > "00008102200020802100000008040000000100800000000000000000000000", > "00000000080000040000000400000000440010000000000000000100001000", > "00000000000000000000000000000000000000040080002000000000100400", > "20000000000000000020008000000008000000001020100104000000000000", > "02080800000011000004200001020800000000000004000000008000000000", > "00000020000000000000000040008000002002000000000000000008000000", > "00000000000000002000000000000000020800800000000000400000000000", > "00020000000000000000000000000002000200220000000000000000440000", > "00000000020400100000001004000100000000000000000000000800000400", > "00002008000000000000000001000000000000000000010000080000008000", > "00000000400020040820420080008000000000000000200000020000000000", > "22200200008000000000000000200000400000004000000000000000000000", > "00080000000000000000000000000808000000000200000200000000000000", > "00000000100000000008000000000200000000000088000000000080000000", > "00000040000401000000000000000000100000000000000000000800000000", > "00010000000020081000004080000000000440000000080010000008000400", > "00000000010000020001100020000004000010400001000004000000400000", > "20002000000000000000000000800000844000100000000000000000020000", > "04000000000000000000000000211040001000008000008000010000000000", > "00800008000000000400020000000010000400000000000000000000000000", > "00200401000000000100000000000400000100000000000000000000000000", > "00000000082100000040000000000000200048000100001000000000000400", > "00020000000008000008004204112284828000080001000202202220020000", > "00000000000000110000000001000820080400008000400000000002000000", > "00000400000000002000000000000100212000000000000000000000000100", > "0000000000000000000108000012aaad4a4db5400800000000000000000000", > "00000000400004000000000008800092aa2948004000100000000000800000", > "1000000010100000000000088256ff555aaa55540040000000000000000000", > "00000220000040000000020024a480556b5552200100000100040000040000", > "000000000000000000000000014abfad5aaa94a40000010000008000010000", > "0021000000000000000000012d2aa9554a5555555000000002000000000000", > "00000000020010080100004892556b555292d56a0044000000000400000000", > "04000000000001000010400555adb4aaaaaa2492d400800000000000000800", > "000000000010000080001211557b56aaaaa949555000000000000080000000", > "00000202000000100000008555d5755552aa522aa400104100400020000000", > "008000800000000000000012d52b4aaaad55ada4aa40000020000000010000", > "00044000200000000000092ab6daaad5ab556aaaa910000000000004000000", > "000000000200000008040255ad556db6dadb5aaa5540080000080001000000", > "0000000000110004010000ad6ad5ab6db6b6f6a4a550020000020000000400", > "00000008000040010022255555ad5aab6ad555aa9540008000000000000000", > "000000000000100000004d5ab6abab7db7afef7aa955000008004000200000", > "040400000000000020010bb56d5556a6ecdab5ed2490000000001000008000", > "008040000000000000946a6f52adb5fbbb77df5bea2a000000000000000000", > "00001004400002000021555955556eaef7dd75f6a892110800000000000000", > "0000000000000000010aad56aad555db5ab7eedff648800000000000000100", > "00000200008000000054ab555155beb5fded5beaba82000088000000000000", > "40000000000000410122aaaaaaa96def575ffebfee54840002000020000000", > "0040000010000000002d6ddd5556ab5afaeaabeabba1214000000000220000", > "00000000000000104152db6b2d55d6ebafbffeb7deca000000400000002000", > "00000000000040000a96a55552aaaddf7ad6abfd77fa920800004402000000", > "0400002000100000012aad52a92dabaad7fdff57deea008000000000000000", > "000080020200000424aaab552a4adb77bf57aafd7bba240000000000000000", > "000020000000080005555ad2d5bbb6fad5fd7fd7d7ef804420100000000400", > "002000000000000089a96aa552aad5af7f57d57f7d7b480008000040000000", > "00000000000000002aabb5555555bf7ddbfeffddefddd52000020800010000", > "1000020100000004aaad555554bb55ab7edb6ef7bd6f540082008000200000", > "04000000002042000aab7a52a956fbdfebfffbbef7fba88800000000000000", > "00000000200000417aaac2aad655577abf56dfffbeaef72210400004004200", > "0000408004000000a556ba4aaaadedd7edfff6dbebfbac8084000000080000", > "00000000000000095ab5a5535555bb7f7f75bfffff6efbd400080000000000", > "0208000000011042555554aaaaaad7f5dbdffb6f7efbdd5021011000000000", > "0000000000200400d555555555b7bd5f7ffd6ffbd7af77a500000000000800", > "000010000000010ab5aaaaab556d77fdd6b7fedffdfddd5a48000020000040", > "0000000410000055555aaaaad55baed77ffdbbfb7f6beaaa80200004000000", > "000000000400000ad6aaaaaaab6d7bffdb6feedff7ffbfd550001100448900", > "004000000000025ab55556aaaabbd6b57ffb7ffddddafab501090042000010", > "1010008000108015aad5556ad6d6bdffd55fedb77f7fadd550400000001040", > "00002000000002aaad55b4aab5bdd7adfffb7ffffbf5ff55a4045524aa4508", > "000000000004002ab5555555a7577d7fb76fdaddeedfd5d569510080000850", > "0004000000004aaaaaa9b52a5abdabeafdfeffffbfed7f6aaa00aa2aa55288", > "000000040000025556a56a6d56d7debfefbbb776fdbfdbadd4450040080000", > "000000000400012b55a954aaadbd6bf6bbeffdffeef5f6eaaa902a8aa2aaa8", > "000008008000054ab557536b6b6bff5fff7b6fddbfdfbbbb6a454024440040", > "000002400010289aaaacaaaad5deaaf6d5dffb77f7f6eed55a921249295528", > "09124012494546b55553555d5f7b7ddffff6dffedebbb5ead554a4a482a210", > "0000094000002aab6aaad55555add6badf7ffb6ffbeef6b6ba92a908544948", > "524aa41555554555555d15555bdbbbeff5edbffadf7fddfaaaa492a1051210", > "0410114092082b6aaab2ab6ab7776d5dbfbbf6dff7f57756aaaaa40a524948", > "528aa40a24a54ad555ad4ad56eeefff7faff7ff77edffafdb55152a1022220", > "04221151410892aeaaaaaaaad55daabb6fb5edbfdbf6afaaad4a244a548894", > "a9444a0a0a552559aaaad55abfb77feffeffbffafebff57d55515290884200", > "42129152d492ad56b5552aa5eaedeabd5bb6f6afb7f6afd6aaaa8402021048", > "28a44aa4892552ddaaaaddab5b5f5df7ffffdffbfd5ffabd5aaa12a1040400", > "420892155254aab55aa92a92f5b5f75bbb6d7dbf6ff6adeb55514908212048", > "5aeb2ad55555555556aad5552f6f5efefffff7f7fdbfdb5d56aa2041080200", > "4a9aaaaaaaaaadaab5552aaadad5edd7b6aededdb7f6eef6954a8508004820", > "512411100204455aaaa9525aadbf777dfffffffffedfbb5f6dd4a842220200", > "94914a4aa9529955555544aafb6afdd76dfb5bdb6ffaeefaaaa92500800000", > "2a4a9122420826955552aaaaaef7af7fffdffefffb6fbbaf576a4850244820", > "409022489442a96aaad4aaaadddefdeaadf6f7b5bffdeefaaad28100000000", > "2a2549252290aa9556aaa9555bb5dbbfff7fdfeffb6f7baeaad49400000000", > "888810000804556ab5552aab757fb6f6dbd6f6ff7fffdffb45b52140000000", > "2202a22aa0912aa9552a54adaeed6fdef6ffffdbdb6efb7f55721000000000", > "9448088004202ca52a4aa52adb5ff57ddf6dbb7fffffdfed25a94288000000", > "010240089009555556aa8ad5bdf55febb5fb6fdeeeadbb7f52da8800000000", > "20401220048055556d52512b56afeabf5b57daf7fbffefdd82b25280000000", > "0412000200000a8a9554825afff53deadaecb7debed55abb54ad2008000000", > "40000440420056a955552856aabef6b7aab5adb5efbf6ded01ba4a20008400", > "1244801000205592aaa54155dff5af6d5d5b5befbaeadb5f54aa9084000000", > "0000000004002ea52aaa92552a2d7c922124aabaff5556aaa2bb5000100000", > "0000220200004aaaa55550155aab55a48a55555daaaa955b54b6a420000000", > "0008000000005d525492055403dafa11540009237b7aaaaba2aa9080000000", > "0000000001006a54a555505406b5548a2092424bd6d54955692e8100000000", > "0800000000092aa514a942010007a8554a0088117aaeda15495d9220000000", > "0000000000002d2a52929054402d541550001102eabbb4d552aa8084044000", > "0000000000016a54a52aa020000ba92aa524a403dd6ea52aa4aea100000000", > "00000000000016d50954924c0000006a4a0000a00132005402ba9200000000", > "0000000000016aa56aa52010000a8014904015000054815501568080000000", > "0000044000015aaa102a896f000001692a04809120803415682d5420000000", > "04080010004072a945492014200a00224a0022020415484a80168100000000", > "4000000020015552292a906d0004815498800950a140121aa92da800000000", > "0000000000056a94842a42aafa20026aaa088205400964a5080b0080000000", > "00000000000952a5114a952aa00801292a402a812041290a522aa020000000", > "0000000000055aaaa15420ab5fd202d6aa855482a82e8269040a0000000000", > "000000000049554904918a5ad450016d5528ad01410900aa15254800000000", > "000000000002b552a92a5156bb54015aaa453492a0168254a00a0000000000", > "000200000015524900aaa2aad6b6837555a95403e8aa8054040aa000000000", > "00000000000aaa9242928a55bdad00ab6d54a90be816802a00120020000000", > "00000000000014a1155552bb776e8356db69741bf2b5525400048802248800", > "100000000005654a42555556aedb80ab6ed55496e8aaa895002a0010000248", > "000040000010492114a5516dfdbe936adb51740be93742540004a000880000", > "00000000000492402350aebaabee84aa9555a83ff82d5c9500120a8a22a948", > "000001000001549296a1596f56bf82aaaaaab25beaaaa2b40004a010944000", > "000000000001292456c476b4ddf6a36aaaadc15ef82dda95a009054a412aa8", > "00000000000452513691dd6eabaf89d55aaba877fa2ab5550024a801144408", > "000000000001a484ada06ab55d7e836ad556915dd88dd52aa00905542092a8", > "00000008010849281b15b7eaf7edd2b7beda8376fd32b56d402aa892952a48", > "00000000004112aab64add5d56df91ecd5b682dbbaaaad5520120524488aa8", > "049008915414a4242d55eaeaef75a45aaaa02f6ef655755a00aaaa4aaa5250", > "00044402014212a8b6aab7bdb5dfd056ab5489bbaeaaad55043552912a8a48", > "295102a8aa14a44a2fd5fd6b6f7d5d0010017eeefaadb55a014a8924501080", > "82022902104952909555b6deddd7f64a824affb5df55eeb50015244a8aa510", > "115440a8a52249142fab7d6b6bfeac90290156ef754b556c015252912888a0", > "a44aaa4508955249157eedbedf5bfb57d57ffdbdfed0dfd504a48824411208", > "4a9104925109549437d5bd6bb5fead552aaeab77db456abc0109054114a150", > "1026695556ea9241057f6b76ef6bfffffffbddaafff05aa104505014000a00", > "5554922aaa95549457d6f6ddf5ffaaafffdf77efb752556c408282a092a490", > "49255549256aa920157f5d76afaafffdb6f5aeb5fed02b5005542904000a00", > "555aaaaad54a920207d5f55dfdffb55fffd57deffbdfc00a10008010448000", > "aaaaaaaaaab5544095ffb576abdafffddf55f77abeb51020824a2042102090", > "14a489491140229003556d5fdf77aab7754aadafef6ffd5e08000410010000", > "a94a5212444a950205fbf57575deffffff55bfddfad56d5502912004804400", > "229484a4929048a0136d5b5fdff5dd5b6d456b7bbfbbfa9d00000840240000", > "945129492001250200feeaf576bf77fff55af406eaeabfea40440000000020", > "088a22200524484805bb9b56dbdbddb6dd55581bffd5ed5d10008000000000", > "a220880aa881010100beeaddbeeef7ffeabba002d12abff404000000000000", > "0884208002489450016fb6b7777bbb556ab69083ed55d6ed00200200000000", > "521102125400010200bb7d5dadeeefffdb5aa022f955bfb400040000000000", > "0040488000495010415ed3f7ffbbb57db5fe8b4aa0556dfd00000080000800", > "09080024810004020837ad5aaaefffeed7b690aaf5557f5600000000080000", > "2002120010020040400aab6fdfbd555fbd7dab5a82b54bfc00000000000000", > "80a08080004000001206aafd6af7fffb6bd75554a96abef500000004000000", > "2400201240108101402aaaabbfaf55addf7da96d52d56bee00040000000040", > "000800000400000012008bfeeafdfeff5aeb6b5555b55eb400000000000000", > "010004000000000000052aabffababbab7deaadb556d6bec40000000000000", > "000000000000004004a14bf6aafefeefdd55f6aad6dbb77400808000020000", > "0000000000000000200856adffabb7bb75f6ad6d556d6dec04002000000000", > "002000000000001002828bdb6afefeeddeadd5dbabb6db7500000200800000", > "000000000000000004296ab6dfababbeab6b76aa56edb6e800000080002000", > "2000000000002000114156dbbafdfeeb5faadd6aedbb5bb400000000000000", > "0000000000000000252a5db777afdffef95752aaab76f6f400400000000000", > "00000000200800000a556aaaeefb75ab56b5b6b555ad5bd404000000000000", > "000000100000000025495b7f5b6fff7bb555494aadfbb6a000000000000800", > "0010040000000000015556aafdfd6fab6ad554a56bad6bf400100042080000", > "00010000000000002aaab57dd757fafb5555492aaaf6df4000000000000000", > "0000000000000011012aaad6bdfdbfcaea020441255daad400020000000000", > "0000000000004200006ad5af6bafef6ab414a82a956b6fa020000000810400", > "0000000040000000015aad59df7b7db680054a880156dd8000002000000000", > "000000000080000000ab6ab77aefefd5200a9425015daba004000000000000", > "0000010800000000015adb6ad7befb75a002aa8802ab7f4000100000000000", > "0000000000000000955552d7bedbbed74008005520356a8000040000000000", > "00000000100400002aaab5bad5feff9a90020014002abda004010000000000", > "00040000000000000aaad56defb7f56b6a5dd4000009d68080000200000000", > "04000800000004006ab5bab6bd7dbfd5a80f50000092bd8000000000000000", > "000000000000010095556adb6beff6ab52abd40000156b2000000000000000", > "0000000000020076aaf55b6edebedd4aed2dbbffa0aade8000000000000000", > "000001040000004455bb75755bebf6dadaaff69f00457c8020000000000000", > "0000000108002d29edfaaeaef6bf5d2bb6a95aeba5596d0204008100400000", > "0004000001004a92b5b5595adf75f5557d5577bf40d37e8000200000010800", > "00000000000015456dfeb6b575dfad56eb55ad6b2154d50000000000000000", > "010000000005ea1ba9baad6daf76faad5edb6b5d56d57c0100000000000000", > "00000000000974a2d576aed55adfb6abfbb55aaba551768000000000000000", > "0000810001f74aafabff555ef7baedaaaeeff5545b55dc0000000000000000", > "00000000015a5559557aadb55aefbaab7bb5555556a57c8000000008000000", > "0000000008b75556d5feab6befb6f6d5aefefaaaadaaf50110000000000000", > "00800000f7ad52bbb5bf6d5eb57b5bbeebabadad5b52bc0000080000000000", > "000020002f6b556ead7edaeadbadf7eb5edf7f55b6d5748001021000000000", > "0000005ff9aaaad575bfd6ad6d7ebd5fd36aeaff5daada0000000000000000", > "0000001b56d55dbfaabeb55bbbabfffab6bebfaaf755748000000000000000", > "00002776ddb56b695d6fabf6d776ad576de9557faed2ddb500000200000000", > "000009adb6aaaed6eabfdaadb6ed7ffdd556b7eb5b6aaaa400000004000000", > "00000b7b6b555ab559bfebbb6b5bad6b75f56d5ef6d576a920000000200000", > "002ff6d6def6f56fb57ff555def577deeeaeab52adf5d55555000000020000", > "000adbedb5adafb56d5ff56fbb56defbb5daae955bbabc9548400000008000", > "17ff6ebb6aaab56edbfffe9d76ddbbd6feaaa96ad576d155555a9000002000", > "25aadd6ddb556eddaabffc5bddb6efbbdb755694aff5b6aaaaa40000000000", > "0777ebb776b6db6b6dfff5ad776dbef77dad6aa55aad545555514000000000", > "fdaebedaadadb6ddb53fffaaeedb6bedef6aad5ab7f6d5aaaaad5f64000000", > "eeddeb6dfb556b6bdaf7fed3b5b6deb77bd6abadaffd8a5555555040000800", > "5b6b5ef6aebbdeed7b3ffff4ded56ffdff7ddd777df6b5aaaaab6dbda80000", > "6dddb5ddfdd6b5dbd6bfffe4b5b55d57ddeb6bdd57ff45555aad5a55200000", > "b6b76f6baaad6f6ababfffeadb7577fd7f5edebbdf755adad55aaab5480000", > "efedfadeff7bdadeeaaefffe5edbaeb7f7f5b56d7fdd56b5b6b76febb7d200", > "dabb5775a9d6b76b5abffffcabbd6dfdddffebdbdbf255aeaaaad55d5d5000", > "b7d6fdeefebdeddeedafbfff5577b6afff6d5ebeffedb555b6adbeebb6ff80", > "ed7db75babab5bb5b56fffff56dddb7bb7ffebf7f7b5556d6d6b535d6dae00", > "dbebfdf6fd76ed7edb5fefffd5af6eeefdef5d5dbdeb555bab5aedb6dbdf80", > "b75f575b57adb7d5beebffffeb75fb5fef7ef7ffffaab5555ad75ad5b6b578", > "6dfaedfdfd76dd6f755ffefffadedefbbfdbdaab6ed5ab76b5bad7eadaefd0", > "bbafb75757ddb7badbadfffffd25b7aef7feb7fffbd56aab6ed6ba3f775d6c", > "eefdfdfdfebb6d6fb6afeffffeaeaddbdff7fb6fff555ad5a9bd6aeadaebb4", > "bdd7db5755f6dfdaed6ffffffa4adf77777d57fbb5d5ab5b5776dd5bb75f6c", > "f77d7efbfead6abdb6adfbffffdb6bdefddffd7fed5576b6eccaaab6daeaf4", > "bfefebd76bbbbdd6ddafff7fffd6db75dff7abfff555556db5b76edb77bb5c", > "7abebebdded6eb7bb755ffdffff8b6df777ddfadb556adaad6aaadb6ed6ee8", > "effbf7ebbbbdddaf6eeffffffff55d5aefefaaff6ab5755b6d6f5b5b5db5dc", > "bdaf5dbf76d6b77adb55ffffffe976efbafedfadeaaaaad6db5aadb6eadeb4", > "f7fdf7eaedbbedd7b6d5fff7fffe4b94afd5f7e0156edeb4b6d7776ddfb5ec", > "5d6fbd5fdf6d5b7eefabfffffffeabeb5ebb5be95ad575aaaaaadadeb56eb4", > "f7db77f56af7efab5aeafffdffffaa5ad2afffe0175baf6dad56b56b6ab5dc", > "db7eed5fdf5ab5def755ffffffffd5b6b4ab57e0ad555adb5b6dd55ddf6f74", > "ffdbbff575efff6b5df5dfffdffffc00013dfee80aafeb55555abb776ab5dc", > "d5feeadfefbaaaf6eb55fffffffff6aa802b5be016d55eafb757f56edddb74", > "ffbbbff55af7ff5d5fb57fff7ffffc84215df7e89dadf5daaaaaaaddb6b6dc", > "5aeef55ff7aed5ebeaebfffff7fffd9144b77faa135b2eb55777756b6d6fb4", > "f7fffffb6efb7fbeb75dffffffffff45293adff40eb6d5ab6adadb5edadd6c", > "fed55b6fb5afd575eed37dfffdfffc9401df7d8b25edab6aedb6b6b5b7abb4", > "dbfff7feef7dbfef5deddffffffffd290577efba8b2aaed55b5b6d6edd76dc", > "ffaadedbb5ebd55aeb5bfffffdfffc5201bebfd50aefaaaaeaf6b55b76bb74", > "56fffbbefabf7ff7bdd4ffffffbff501206fee9757556d7db6addbb6ededac", > "ffeaaeebadf5eadad771fbfffefffc0200bbffad0aaedbab6aaaad6db6aba8", > "aadfffbef75edfbf7fad3fffffefd090402fad4ba5e9b576dab6b6db6f6eb4", > "f7faaafddafbbaf5d5eaffffffffd204002eff9b5556aaad6d5b6badb5daa8", > "dad7ffd7bfadf75f6fb57fbfffffb040800fae9725b5addbb5aead7edb56d4", > "fffd757d7577adf5baeaafffffde8292280dfd9ba55576b56f69dbab6eef58", > "aab7ffefdfdedbdfedda7fffffff8120900bbe97a955adeb5a5b56ddb5d5b4", > "fffd557abb75ef7ab76aaffffffd52540601fd1b46f6db5edbaab5b6ef5ad4", > "f7b7ffdf6ddfbaeffdb57ffffffe90a81405fc9751adb5b5ad56ab6bbab5b4", > "dd7daaf6df75efdeabdaafeffff7a5641509fd17a6d5576b76aaaddd6dead4", > "bfefff7dabdfbd75ff6b7ffffff45ab48a017c9fa576dadead55db6bdb5bbc", > "f6daadef7ff577bfbadaaffffffd75d41281fe2b65daabb5db6d56deb6aad4", > "6fbfff7db6bbeeed6fb66ffbfff05fa0a4017c9fa9b57edb56d56db5edddb4", > "faf5fbf7dfeebb5bf57a5fffffd07fa50a00fd17e2d7556d55555ad6ab6b6c", > "dfafb6dd757deeff5baa6ffffff02b885201f45f556cdbb6abd56bbb76b574", > "76f5fff7fff75baafef69bffffe17fa2bec07d5fe5dbb56d6ab6dd6dadd6ac", > "efbf6d7f5b5ff6ffd5fa2fff7fd06ec8de80fd5feb6aaedbd56dabd6b6baa8", > "dd75ffd5fdfadfd6bebe4efffec5552afb417abfb55f6b6ab6db7d6ddb65dc", > "bbefb5ef6f6fbabdebb62fffffaab54aeec1765fe5555db6d5b6abdab6dab4", > "f75edfb5fbfaf7f7bf7e8bbffeaa4d55b9107d7f55b5ab6dbaabb6adadab6c", > "5af5effbdfbfaead6ad62ffffb552aab6e417e5ff56b56d5555eedbb5576d8", > "ef5fbd5776f6fd7bbfbe8ffffe925592dd447577a5b6ed5b6aeb5b6d5dad54", > "bdf577ddffdfabeeeaf60adffa6e855502b57e7ff56d9bb55aadd6db5b5b6c", > "eb5fdd7bad75fd5bbfbe8fbffe9a5aaa553574bf65ab756b55aab556d6d558", > "bff6f7eeffff6ff6d6f703fffab6854285feed7feadaabdd6eb7dbf55ab6b4", > "ed5fbebbb5effb5fbdde8fdffd2ead9525b7745feb75b6b7596ab6ab57ad6c", > "fbf5edeeffbbaef5777602fffa5a8b5542fefd7ff5ad6aedabaded6d5aaaa8", > "aeafbfbbaaeefbdfaddf8bdbedaf555b15efd57f6aeb5fb56d5b5bdb556dac", > "fb7aeadfffbbdeb6ff7e03fffabf4d57477ffa7ff5dd6aaedb76ed56aed6a8", > "add77daad5ef77dfaaef83b776adaadd21dfb2dfe56bd6d5b5adb6b575bb54", > "ff7ddf57ef7add75dfbb02fbeeaf96ab87f7f57ff5deadbb6f7b6daed6d6d4", > "55d776dbddeff7df757e83ef6aaea55721ffa97fe5b5d556dad6db5555b554", > "ff7ddfa57bbabd75efef817fbf5bdadd0fdfeb7ff96ebaddb5b5b6b6db6ea8", > "add776c9eeffebdf5abe837dfb6e96aa57ffb2fff5db56b76f6d6dadb6d5b4", > "ff7dffb2bfb6beedf7efd07fdedfa5f696efebdfeab6eddad55b5b55555aa8", > "d5d7dbe4eddffbfeddbd817fffefaaad57bfd37ffadddb6dbdb6b6b6abb554", > "7f7d7fd2bffaaeab77efd17f7ebb4bb517efb5ffeab6b6b6ab6d6dad6d5768", > "dbd7eb7d376ffbffeeb5b07fffff956aaffbab7ffdefaddafedbea55ab7554", > "7efd5df4affb57ad5befd25fffefabaa5bdfd3dfeabadbb75bb6b55556ad54", > "abb7f7af55aefd7bfebdf07ffffe8af48effd7fffd776d6af76dd4b6aadae8", > "fdfebefb4bfbb7ef6bf7785fffffabaa5fefabfff5ddbed6daf6b55555b754", > "576bebd797777d7dbeafd03fefbe857517dfd6fbf56b6bbdb75b756ad56ad8", > "fdbebd7f69ded6d7edfdf45ffbff03805fffafffeabedd6b6dddc556955ab4", > "d7ebf7db45fbffbf77abf81ffff602b40eefabfffaab6b56df77595aaab2ac", > "7d7f5d7ff92f5afddd77745bffdd49015ffeeffffaf6defd69dd556d55ad68", > "d7daf7eb4adff7577fddf41ffff680441fff9bfffdbdb5abb76b555b5576d4", > "feffdebfe8adbdffd6ebfc1ffffd2a9157dfaffffabb6b5d6dfd5576aaadb4", > "55d57deb7ebff75b7fbd5c17fec154009fffefbffab7b6ebfaababaaa95554", > "ff6ff7bfdb2b5dffeaf7fc9fffd455245ffeaffffabedabd576e555aaa2db4", > "55faaeeafefff76adfad7d13ff6154009fef5bfffaab6d56fab5abaaaadb54", > "ffaffdbfdbaabfbff6fedd17fec8a9505fffafddfebdb6df5f6eab6aaa96b4", > "d57d6bf6beffeaf5adab7e8bfb3614001ffb6ffffd6b6d6aead92add556d54", > "bfd7febff7ab7feffbfddd93fea948485fff5ffffabedadbbdb6ad554aab54", > "f57d55ed5dfdd6bad7577f0bfa5612009ffed7ffff55b76d6b752b5a952ad4", > "6fd7ff7fb76f7deffdfd6f83fa14845017feaffffabedabbddaed6d6a95558", > "bd7d55d5eddbd75eabb7bda3fa2a08005ff75fffff57756d76da95b4aa4ab4", > "ebefff7fb77f7df5fefedf82fc1602a01ffeefeffebdafb7edf57b6aaa9554", > "bf5db6d6efead7bfb5dbffa3f8260a885ffabbfffed76add5b5b56d554aad4", > "eaf77dbfbadfbeeadf7ead83fa0a00801ff75fffffaed6befdead56aa92ab4", > "bfadd7eaefb5ebbff5d5ffa2e80a842457fa7ffbff75bdebabb52ed5555554", > "eafbfabf5eff7ef76ffeafa1f00100489ffaaffffeafd336ded56daa554ad4", > "bfaf5f7bebd7dbadfab77fe2e40441245ffa7ffffffabeedb5badb56a92aa8", > "d57af5af5f7efef6dffd6fa3e88190489ff57fffffafeadb6bd56dbaaa5554", > "7bafbf7df5ebdbddf577dfc9620001105ffa5ffffefab7b6dd6b5ed5549554", > "befef5d7af5f7f775fdebfe2594950041ff0ffffff57ed6df6daab6eaaaaa8", > "fbdbef7efbf5d5fdf575d7a0a48050095ff57ffffeecbadb5b6aabdaa924b4", > "af6f5dd5aedf7f57bfdf7fe85a00040017f27fffffdb776eefb56e6daa5528", > "fafdeb7ffbf5ebfaf576dfe0940200105fd97feffeb6dadbbaedd5db6a9554", > "6fd75dd557dfbededfdf7ff45d0048049ff57fffffdb77b6d7dabeb6d4aab4", > "dabfb77ffd7aebbbbd75afe00000000017f17ffffff6dd7b7ab5a5adb54a6c", > "77eaeeead7d7ffeeebdf7ff4aa0000001ffa7ffffedb75adaf76debb692d58", > "dd5f5bb77dfeaabdff756fe0280000489ff17ffffffeef76f5d5b56d5a4b54" > ] > colorBit =[ > "edcfb1ffe2bbf7e2b1ffe2bbffedcfe2c59effe2bbffe2bbffedcfedcfb1ffe2bbedcfa7ffe2bbf7d9b1edcfa7e2c59ee2c59eedcfb1a79e80bba7899e897693806b9e8976a79e80271c00584e3030300030300008080027270093806b9e8980806b62806b626b6b586b6b5862625858584e58584e626258", > "f7d9b1edcfb1edcfa7edcfb1edcfb1edcfb1edcfa7ffe2bbf7e2b1c5bb899ebb4effff80c5d94e89a7439ebb4eedcfa7c5b193edcfb1bba7899e898093806b89766276766293806bcfa7804e3000624e00080800302708584e309e89809e8980898076806b626b6b5858584e6b6b5858584e58584e58584e", > "cfb193edcfb1ffe2bbedcfb1edcfb1edcfb1edcfb1ffff89a7c562c5d94e93b1629ebb4effff8093b16293b16289a7439ebb4ec5b19393806b93806b93806b806b62767662bb9e43898030806b00080800080800433a1c624e006b6b2793806b6b6b58766b62766b62766b6258584e58584e58584e626258", > "edcfb1edcfb1ffedcfedcfb1ffe2bbffe2bb93b1626b8927ffff80b1c56bb1cf4ed9e24effff80edf79ee2f780ffff80d9e24e9eb14393806b767662806b62806b6289803089a743a780276b6212896b126b3000272700623a126b62126b6b58767662766b626b6b5858584e58584e58584e4e4e4358584e", > "edcfb1ffedcfffedcfcfb193edcfb1ffff8076933af7f74eb1c56bffffa7ffffa7ffffa7ffffa7ffff89d9ed9389a74376933a6b6b58584e30806b62806b6293806b898030d9d96b6b6212896b00a780270808004e3000c589271c1200271c006b6b586b6b586b6b586b6b586b6b586262584e584e4e584e", > "edcfb1ffedcfffe2bbedcfb1e2cf9e76933af7f74e6b892789a743ffff80a7bb08f7ff6b9ebb4ed9ed80a79e8076933a4e763a89a743899e126b80128076587676629eb1436b6212bb9e2776933ad9e24ea776086b6212896b27433a003a4300807658806b626b6b58766b6258584e6b6b5858584e4e4e43", > "cfb193ffe2bbedcfb1edcfb1e2f7809ebb4e4e62004e763affff80ffff8076933a89a74376933a76933a6b8927ffffa7ffff80c5d94e6b89274e6b12806b627676629ebb4e303000a78043624e00896b126b62124e6b12fff727624e12cfb16b6b6b586b6b586b6b586b6b586b6b5858584e58584e4e4e43", > "c5b193edcfb1edcfb1f7d9b1cfe26bd9d96b4e6b1c4e6208e2ed6b809e274e6b1c6b89279ebb4eedf76bb1cf4e93b13089a7433a4e1c4e763a4e763a3030088076586b6212433a004e6b1c9eb143272700e29e126b6b27a78027272700121200271c0058584e766b6262625858584e58584e58584e626258", > "c5b193edcfb1f7d9b19e8062d9cf43c5d94ed9e24e6b89274e6b1cb1cf4e4e763ae2ed6b9eb1434e6b1c3a4e08ffff8993b1309ebb4e4e763a4e6b123a4e0827301c4e3000c58927624e121c1200624e00a78027a77608896b274e3000303000303008766b62766b62766b626b6b5862625858584e58584e", > "bba789d9bb93edcfb1898030b1cf4e4e6b126b89274e763a6b6b27c5d94ec5d94ed9e24e4e6b1cedf76b93b130cfe26b4e763a4e763a4e763a9ebb4e3a4e08271c00271c00bb9e43624e00a78043f793001c12001c1200eda727624e12433a00896b27ffffcfffffc5ffffcfffffcfd9bb9362625858584e", > "d9bb93cfb193e2c59e6b6b27b1cf4eb1c5274e6b1289a743cfe26bb1cf4e4e6b1c4e6b124e6b1c4e6b1c6b6b273a4e1c4e763aedf79e4e763a8980303a4e080000000000006b6b27e28027303008303008ffbb08624e00896b00ffffe2ffffcfffffcfffffc5ffffcfffffc5ffffc5ffffa7ffffa7fff79e", > "bba789cfb193f7d9b14e6b1c809e274e62004e6b126b8927b1c56b93b1624e6b1c3a4e1c4e6b1c3a4e0876933a6b892776933a4e763a3a4e1c3a43003a43003a3a1c080800624e00271c00896b004e6208894e006b6212ffffe2ffffe2ffff80ffffcfffffc5ffffc5ffffcffff780d99e27fff79effffa7", > "cfb189cfb193edcfb19ebb4e6b892789a743809e276b6b274e763a8076584e6b1c3a43003a4e084e6b1c3a43006b80126b89273030083a43003a4300272700767662000000624e00ffc527d99e27896b27303000ffffe2ffffc5ffffe2ffffc5f7c54effd962f7c54effd962ffffa7fff79ebb9e27fff79e", > "e2c59ed9bb93edcfa7ffffc59eb143b1c527809e273a43004e6b1c6b89273a43004e6b123a4e08271c00271c00434e00433a004e6b123a4300272700271c00766b62080800ffff80e29e12272700433a00c58927ffffe2ffffe2ffffcfffff80fff76bffffa7ffd962fff780f7c54efff79effffa7a78043", > "ffffcfffffcfffffe2ffffcf9eb1436b80126b89274e62084e62004e62083a43003a4e084e62086b6b273a4300433a004e62083a4300434e00121200303000ffedcfbbcf301c1200080800a78027121200ffffcfffffe2fff79effcf43ffffa7ffffa7ffffa7ffffa7ffff89ffffa7ffffc5623a12a79376", > "ffffcfffffe2ffffe2ffffe2ffd980d9e24ef7f74e809e27b1c527b1c5276b89274e6b126b8012303000623a122727001212002727000000001c1200ffff4ed9d96b1212002727003a4300303000272700ffffcffff780ffffc5ffffc5fff76bfff76bffffc5ffa743edc56bfff79ebba789433a00b19e76", > "ffedcfffedcfffedcfffffcfffedcfffff80fff76ba7bb08e2e2276b80004e6b123a4e086b3000ff5827b12700cf4308cf3a12272700ffed12ffff80623a12272700ffffe2ffffcf898030ffffc5ffffa7fff79effffc5ffff80ffff80cf8008ffd962896b12bb9e43edc56b934e1c8980306b6b27626258", > "ffffcff7d9a7f7d9b1ffe2bbffff4effff4eeded27eded27fff727586200272700a74e12cf1c00ff5827f71c00ffffcfcf1c00b11c006b6b00898000624e00ffffcfffff80ffffa7ffff80ffffa7ffffa7272700ffffa7fff780cf8008e29e12ffd962c58927584e30584e30806b6227270827301c3a3a1c", > "ffe2bbedcfb1ffe2bbcfc508ffff27ffff80ffffa7ffffa7ffffa7ffff27271c00cf3a00b11c00cf3a12b11c00b11c00891200b12700624e00433a00fff76beded27ffff00ffff27d9d900fff76bffff00fff780ffa743a74e12edc56bffd962a77608623a123a3a1c3a3a1c43431c271c002727123a3a1c", > "a78043d98062f7d9a7a7bb08ffff4efff727c5cf08e2e227b1c527a7bb006b8012a73a08e25830b127008912006212006212004308004e3000ffed00ffff12ffffa7ffff80939300ffffc5806b00ff8962ff8962ffa743ffff4effff27ff9e27623a12433a00433a1c584e30584e30272708272712271c00", > "bb9e27bb9e27e2c59e896b00ffcf43c55830434e006b80126b80124e6200434e006212008912008912006212006212004e30006b1c00896b12899e00ffffcfffffe2e2e227586200ffff80ff9e27ff763aff763aff9e27ffffa7fff727ff9e27cf4e123027083030083a3a1c27301c121208121208271c00", > "cf6b4343080030300093431cc5623a6b1c002727002727003a43003030000808003a00006212003a0000430800430800d9cf43fff76bffff4effffc5ffff80eded27ffffc5ffff803a4300ffed12ff5827ff5827ff761cfff727ffc527f77600893008303008303008271c00272712080800080800080800", > "8927006b1c00430800893008621200d980621c12002727001c1200080800121200ff4308ff5827ff43083a4300ffffa7f77600f77600a77608bb9e43ffffa7434e00bb9e27898000ffa743ffbb12ff761cff6b08ff6b08ff9308cf7600894e00303000271c00271c003a3a1c271c00080800000000121208", > "a78043d98062272700430800a780439358306b30003a4300271c00623a12ffb189cf1c00ff5827f71c00fff76bfff727ff761cff761cff3000cf8008cfc508d9cf43303000080800a78027ff8012ff9312ff761cff6b08cf6b00cf6b006b3000272700121200121200272708080800121200000000121208", > "c55830623a12d9cf43303000271c00ff89620808000808000000006b1c00a74e12621200cf1c008912006b8012a77608fff79eff3000cf27006b1c006b6b006b6b00b1a7891212003a3a1cff763aff761cff6b08ff6b08ed8008cf4e12624e001c1200080800271c00271c00080800080800000000121208", > "3a000027270058584e1c1200623a128927006b3000121200f79e766b1c00584e303a0000621200ff3000ff5827430800f71c00ff3000a73a083030003a3a1c27301c0000004e4e43271c00a74e12f74308ff6b08ff8012e28027894e00433a00000000000000080800121200080800000000000000000000", > "934e276b3000cf6b43935830000000430800623a12935830430800430800272712272700f74308ff761cff4308934e27ed4312b11c0030300008080027301c76767627301c121208272712121200623a12894e08cf4308a74e126b3000000000271c00080800080800121208080800000000000000000000", > "893008621200b14e27893008433a1c271c00584e3000000000000058584e3a3a1c3a3a1cf71c00ff4308cf1c00623a12584e30edcfb10808004e584e584e304e584e4e584e0000009393934e584e0000003a0000271c00433a1c433a1c3a3a1c584e30584e3027301c080800080800000000000000000000", > "584e306b6b586b6b58433a1c000000c5b1930000001212000000000000000808000808004308006b1c00121200271c006b6b58807658807658806b6293939327301c93939327271276767627301c121200807658584e30584e3043431c4e4e438976623a3a1c3a3a1c3a3a1c27301c272712080800121208", > "584e30584e306b6b273a3a1c0000003a3a1c0808003a3a1c0808000000006262580000008076589e8976f7d9b1cfa780f7d9b1d9bb93ffe2bbffedcf93806b8076588076584e4e434e584e121208e2c59ee2c59eedcfa7f7d9b1d9bb93cfb193f7e2b1e2c59e807658767662806b623a3a1c2727123a3a1c"] \end{hide} \HRule %\epsfig{file=Wirth.ps} %%\begin{center} %%%if recalc %%\perform{ generate "TutBit" 1 (scale 5 figBit ||| box "test mit Text") } %%%else %%\epsfig{file=TutBit.1} %%%endif %%\end{center} \hspace{\stretch{1}} %if recalc \perform{ generate "TutBit" 2 (scale 2 figBit0 |=| box "figbit0") } %else \epsfig{file=TutBit.2} %endif \hspace{\stretch{1}} %if recalc \perform{ generate "TutBit" 3 (scale 2 figBit1 |=| box "figbit1") } %else \epsfig{file=TutBit.3} %endif \hspace{\stretch{1}} %if recalc \perform{ generate "TutBit" 1 (scale 5 figBitc |=| box "figBitc") } %else \epsfig{file=TutBit.1} %endif \hspace{\stretch{1}} }} \end{document}