Graphics and media/Collections of tips and tricks/Use MetaPost arrays

From Wiki
Jump to navigation Jump to search

In Metapost (or rather in Metafun) one can define arrays of colors, strings, paths, pens and other variables. An example is the following:

  • \starttext
    \startMPpage
    
    string MyColors[] ;
    path   MyPaths [] ;
    pen MyPens[] ;
    for j = -1 step 1 until 3 :
      MyPens[j] := pencircle scaled ((2+j)*pt) ;
    endfor
    
    MyPaths[-1] := (-1.5cm,1.5cm) -- (1.5cm,1.5cm) ; 
    MyColors[-1]:= "magenta" ; 
    MyPaths[0]  := (-2cm,2cm) -- (2*cos(0)*cm,-2cm) ; 
    MyColors[0] := "darkyellow" ;
    MyPaths[1]  := fullcircle scaled 3cm ; 
    MyColors[1] := "darkred" ;
    MyPaths[2]  := fullsquare scaled 2cm ; 
    MyColors[2] := "darkgreen" ;
    MyPaths[3]  := (-2cm,-2cm) -- (2cm,2cm) ; 
    MyColors[3] := "darkblue" ;
    
    for j = -1 step 1 until 3 :
      draw MyPaths[j] 
           withpen MyPens[j] 
           withcolor MyColors[j] ;
    endfor
    \stopMPpage
    \stoptext
    

In the above example, instead of

string MyColors[] ;

one could have said

color MyColors[] ;

and then we should have defined each component of MyColors as colors instead of strings:

  • \starttext
    \startMPpage
    color MyColors[] ;
    path   MyPaths [] ;
    pen MyPens[] ;
    for j = -1 step 1 until 3 :
      MyPens[j] := pencircle scaled ((2+j)*pt) ;
    endfor
    
    MyPaths[-1] := (-1.5cm,1.5cm) -- (1.5cm,1.5cm) ; 
    MyColors[-1]:= magenta ; 
    MyPaths[0]  := (-2cm,2cm) -- (2*cos(0)*cm,-2cm) ; 
    MyColors[0] := darkyellow ;
    MyPaths[1]  := fullcircle scaled 3cm ; 
    MyColors[1] := darkred ;
    MyPaths[2]  := fullsquare scaled 2cm ; 
    MyColors[2] := darkgreen ;
    MyPaths[3]  := (-2cm,-2cm) -- (2cm,2cm) ; 
    MyColors[3] := darkblue ;
    
    for j = -1 step 1 until 3 :
      draw MyPaths[j] withpen MyPens[j] withcolor MyColors[j] ;
    endfor
    \stopMPpage
    \stoptext
    

Also note that in order to specify the size of the pen in MyPens[j] we have to say ((2+j)*pt) in order for Metapost to interpret correctly the desired size of the pen. The outer parentheses are to prevent MetaPost from interpreting the definition as

MyPens[j] := (pencircle scaled (2+j)) * pt ;

which would result in an error.