%% To be used with the minim-mp metapost processor. See minim-hatching-doc.mp
%% for an overview of the patterns defined below.


% 1 definition macros

def new_linepattern(suffix name)(expr sep, rot) =
   beginpattern(name)
       draw origin -- (100,0);
       matrix = identity rotated rot;
       setbounds currentpicture to unitsquare xscaled 100 yscaled 2 shifted (0, -1);
   endpattern(100, sep);
enddef;

def new_dotpattern(suffix name)(expr r, sep, rot) =
   beginpattern(name)
       drawdot origin withpen pencircle scaled r;
       matrix = identity rotated rot;
       setbounds currentpicture to bbox currentpicture;
   endpattern(sep,sep);
enddef;

def new_hexdotpattern(suffix name)(expr r, sep) =
   beginpattern(name)
       pickup pencircle scaled r;
       drawdot origin; drawdot (sep, sep/sqrt(3));
       setbounds currentpicture to bbox currentpicture;
   endpattern(2sep,2sep/sqrt(3));
enddef;

def new_brokenlinepattern(suffix name)(expr sep, on, off) =
   beginpattern(name)
       draw (0,0) -- (on,0);
       draw (on/2+off/2,sep) -- (3on/2+off/2,sep);
       setbounds currentpicture to bbox currentpicture;
   endpattern(on+off,2sep);
enddef;

def new_distortedgridpattern(suffix name)(expr sep, rot, x, y) =
   beginpattern(name)
       draw (0, sep/2) -- (sep, sep/2);
       draw (sep/2, 0) -- (sep/2, sep);
       matrix = identity xscaled x yscaled y rotated rot;
       setbounds currentpicture to unitsquare scaled sep;
   endpattern(sep,sep);
enddef;
def new_gridpattern(suffix name)(expr sep, rot) =
   new_distortedgridpattern(name)(sep, rot, 1, 1) enddef;

def new_weavepattern(suffix name)(expr sep, width) =
   beginpattern(name)
       matrix = identity rotated 45;
       draw (0,-width)--(0,width);
       draw (-width,sep)--(width,sep);
       draw (sep-width,0)--(sep+width,0);
       draw (sep,sep-width)--(sep,sep+width);
   endpattern(2sep,2sep); enddef;

def new_hexpattern(suffix name)(expr d) =
   beginpattern(name)
       save v,w; w:=d/2; v := w/sqrt(3); draw (w,4v) -- (w,6v);
       draw (0,v) -- (w,0) -- (2w,v) -- (2w,3v) -- (w,4v) -- (0,3v);
       setbounds currentpicture to unitsquare xscaled 3w yscaled 6v shifted linecorr;
   endpattern(2w,6v); enddef;

def new_circlepattern(suffix name)(expr d) =
   beginpattern(name)
       draw fullcircle scaled d;
       draw fullcircle scaled d shifted (sqrt(3)/2*d,d/2);
   endpattern(sqrt(3)*d,d); enddef;

def new_scalepattern(suffix name)(expr d) =
   beginpattern(name)
       draw halfcircle scaled d rotated 180;
       draw halfcircle scaled d rotated 180 shifted (d/2,d/2);
   endpattern(d,d); enddef;

def new_squarecirclepattern(suffix name)(expr d) =
   beginpattern(name)
       draw fullcircle scaled d;
       setbounds currentpicture to unitsquare shifted -(1/2,1/2) scaled 2d;
   endpattern(d,d); enddef;


% 1 predefined patterns

if known skip_predefined_patterns : expandafter endinput fi;

begingroup save xl, l, s;
2l = 3s; 2xl = 3l; s = 3.5;

save linecorr; pair linecorr; linecorr = -(.2pt, .2pt);

begingroup
   save horizontal, vertical, upward, downward, diagonal;
   horizontal = 0; vertical = 90; diagonal = 45;
   downward = 30; downward = -upward;
   forsuffixes d = horizontal, vertical, upward, downward :
       new_linepattern(d lines)(l, d);
       new_linepattern(dense d lines)(s, d);
   endfor

   new_brokenlinepattern(broken lines)(l, 2l, l)
   new_brokenlinepattern(dense broken lines)(s, 3s, s)

   forsuffixes d = diagonal, upward, downward :
       new_gridpattern(d grid)(l, d);
       new_gridpattern(dense d grid)(s, d);
   endfor
endgroup;

new_gridpattern(grid)(l, 0)
new_gridpattern(dense grid)(s, 0)

new_distortedgridpattern(horizontal grid)(l, 45, 3/2, 1);
new_distortedgridpattern(vertical grid)(l, 45, 1, 3/2);
new_distortedgridpattern(dense horizontal grid)(s, 45, 3/2, 1);
new_distortedgridpattern(dense vertical grid)(s, 45, 1, 3/2);

new_weavepattern(stitches)(l, 3/2)
new_weavepattern(weave)(l, 3)
new_weavepattern(dense weave)(s, 3/2)

beginpattern(horizontal zigzag)
   draw (0,0)--(l,2/3l)--(2l,0);
   setbounds currentpicture to unitsquare xscaled 2l yscaled l shifted -(0,l/6);
endpattern(2l,l);
beginpattern(vertical zigzag)
   draw (0,0)--(2/3l,l)--(0,2l);
   setbounds currentpicture to unitsquare xscaled l yscaled 2l shifted -(l/6,0);
endpattern(l,2l);

beginpattern(crosses)
   matrix = identity rotated 45;
   save c,o,w; pair c,o; c=(l/2,l/2); w=4/5;
   o:=(w, w); draw (c+o)--(c-o);
   o:=(w,-w); draw (c+o)--(c-o);
   setbounds currentpicture to unitsquare scaled l;
endpattern(l,l);

beginpattern(bricks)
   draw (0,l)--(0,0)--(2l,0);
   draw (l,2l)--(l,l)--(3l,l);
   clip currentpicture to unitsquare xscaled 3l yscaled 2l shifted linecorr;
endpattern(2l,2l);

beginpattern(tiles)
   save s; s:=l/4;
   draw (0,l+s) -- (l+s,l+s);
   draw (l-s,0) -- (l-s,l+s);
   draw currentpicture rotatedaround((l,l), 180);
   draw (0,2l) -- (0,0) -- (2l,0);
   clip currentpicture to unitsquare xscaled 2l yscaled 2l shifted linecorr;
   matrix := identity rotated 45;
endpattern(2l,2l);

beginpattern(chords)
   save c,d; c:=2.1; d:=1.4;
   draw (c-d,c-d){dir 225}..{dir -30}(2c-d/2,d/2-2c);
   draw (2c+d,-d-2c){dir -45}..{dir 210}(c+d/2,d/2-5c);
   setbounds currentpicture to bbox currentpicture;
endpattern(7c, 2c);

beginpattern(tea cloth)
   save r; r:=xl/8; pickup pencircle scaled r;
   drawdot (xl/2,xl/2); drawdot (0,0);
   for i = 1 upto 3 : drawdot (0,i*xl/4); drawdot (i*xl/4,0); endfor
endpattern(xl,xl);

beginpattern(knit)
   save v; v:=2/3xl;
   draw (0,0) -- (0,v);
   draw (-xl/2,3/2v) -- (-xl/2,v/2) {dir -60}..{dir -60} (0,0) {dir 60}..{dir 60} (xl/2,v/2);
endpattern(xl,v);

beginpattern(purl)
   save v; v := 2/3xl;
   interim linecap:=butt;
   draw (0,0) -- (0,v) {dir 30}..{dir 30} (xl/2,3/2v) {dir -30}..{dir -30} (xl,v);
   draw (xl/2,v/2) {dir -30}..{dir -30} (xl,0) {dir 30}..{dir 30} (3/2xl,v/2) -- (3/2xl,-v/2);
endpattern(xl,2v);

new_hexpattern(hexagons)(xl);
new_hexpattern(small hexagons)(l);

new_squarecirclepattern(square circles)(xl);
new_squarecirclepattern(small square circles)(l);

new_circlepattern(circles)(xl);
new_circlepattern(small circles)(l);

new_scalepattern(scales)(xl);
new_scalepattern(small scales)(l);

save dot;
dot := 1.2pt;
new_hexdotpattern(dots)(dot, l);
new_hexdotpattern(dense dots)(dot, s);
new_hexdotpattern(sparse dots)(dot, xl);
new_dotpattern(square dots)(dot, l, 0);
new_dotpattern(diamond dots)(dot, l, 45);
new_dotpattern(dense square dots)(dot, s, 0);
new_dotpattern(dense diamond dots)(dot, s, 45);
new_dotpattern(sparse square dots)(dot, xl, 0);
new_dotpattern(sparse diamond dots)(dot, xl, 45);
dot := 1.8pt;
new_hexdotpattern(heavy dots)(dot, l);
new_hexdotpattern(dense heavy dots)(dot, s);
new_hexdotpattern(sparse heavy dots)(dot, xl);
new_dotpattern(square heavy dots)(dot, l, 0);
new_dotpattern(diamond heavy dots)(dot, l, 45);
new_dotpattern(dense square heavy dots)(dot, s, 0);
new_dotpattern(dense diamond heavy dots)(dot, s, 45);
new_dotpattern(sparse square heavy dots)(dot, xl, 0);
new_dotpattern(sparse diamond heavy dots)(dot, xl, 45);

endgroup;

% 

endinput;