%% shiftoff.mp
%% Copyright 2006 Henrik Tidefelt
% 
% This work may be distributed and/or modified under the 
% conditions of the LaTeX Project Public License, either version 1.3 
% of this license or (at your option) any later version.
% The latest version of this license is in 
% http://www.latex-project.org/lppl.txt 
% and version 1.3 or later is part of all distributions of LaTeX 
% version 2005/12/01 or later.
% 
% This work has the LPPL maintenance status `maintained�.
% 
% The Current Maintainer of this work is Henrik Tidefelt,
% tidefelt@isy.liu.se.
% 
% This work, referred to as blockdraw.mp, consists of the files
%   shiftoff.mp
%   blockdraw.mp
%   bondgraph.mp
%   blockdraw_mp.pdf

numeric to_lft;
to_lft = 0;
numeric to_llft;
to_llft = 1;
numeric to_bot;
to_bot = 2;
numeric to_lrt;
to_lrt = 3;
numeric to_rt;
to_rt = 4;
numeric to_urt;
to_urt = 5;
numeric to_top;
to_top = 6;
numeric to_ulft;
to_ulft = 7;
numeric to_center;
to_center = 8;

def to_dir(expr z ) =
  if (xpart z) > 0:
    if (ypart z) > 0:
      if abs(xpart z) > 2*abs(ypart z):
	to_rt
      elseif abs(ypart z) > 2*abs(xpart z):
	to_top
      else:
	to_urt
      fi
    else:
      if abs(xpart z) > 2*abs(ypart z):
	to_rt
      elseif abs(ypart z) > 2*abs(xpart z):
	to_bot
      else:
	to_lrt
      fi
    fi
  else:
    if (ypart z) > 0:
      if abs(xpart z) > 2*abs(ypart z):
	to_lft
      elseif abs(ypart z) > 2*abs(xpart z):
	to_top
      else:
	to_ulft
      fi
    else:
      if abs(xpart z) > 2*abs(ypart z):
	to_lft
      elseif abs(ypart z) > 2*abs(xpart z):
	to_bot
      else:
	to_llft
      fi
    fi
  fi
enddef;

def dir_to(expr d ) =
  dir( 180 + d * 45 )
enddef;

def shiftoff(expr pic, corner ) =
  if corner = to_lft:
    (pic shifted ((-center pic)+((xpart llcorner pic)-(xpart center pic),0)))
  elseif corner = to_llft:
    (pic shifted ((-center pic)+(llcorner pic)-(center pic)))
  elseif corner = to_bot:
    (pic shifted ((-center pic)+(0,(ypart llcorner pic)-(ypart center pic))))
  elseif corner = to_lrt:
    (pic shifted ((-center pic)+(lrcorner pic)-(center pic)))
  elseif corner = to_rt:
    (pic shifted ((-center pic)+((xpart lrcorner pic)-(xpart center pic),0)))
  elseif corner = to_urt:
    (pic shifted ((-center pic)+(urcorner pic)-(center pic)))
  elseif corner = to_top:
    (pic shifted ((-center pic)+(0,(ypart ulcorner pic)-(ypart center pic))))
  elseif corner = to_ulft:
    (pic shifted ((-center pic)+(ulcorner pic)-(center pic)))
  else:
    (pic shifted (-center pic))
  fi
enddef;

numeric shiftofflabelmargin;
shiftofflabelmargin := bboxmargin;
def shiftoffwlm(expr pic, corner ) =
  if corner = to_lft:
    (pic shifted ((-center pic)+((xpart llcorner pic)-(xpart center pic),0)+(-shiftofflabelmargin,0)))
  elseif corner = to_llft:
    (pic shifted ((-center pic)+(llcorner pic)-(center pic)+(-shiftofflabelmargin,-shiftofflabelmargin)))
  elseif corner = to_bot:
    (pic shifted ((-center pic)+(0,(ypart llcorner pic)-(ypart center pic))+(0,-shiftofflabelmargin)))
  elseif corner = to_lrt:
    (pic shifted ((-center pic)+(lrcorner pic)-(center pic)+(shiftofflabelmargin,-shiftofflabelmargin)))
  elseif corner = to_rt:
    (pic shifted ((-center pic)+((xpart lrcorner pic)-(xpart center pic),0)+(shiftofflabelmargin,0)))
  elseif corner = to_urt:
    (pic shifted ((-center pic)+(urcorner pic)-(center pic)+(shiftofflabelmargin,shiftofflabelmargin)))
  elseif corner = to_top:
    (pic shifted ((-center pic)+(0,(ypart ulcorner pic)-(ypart center pic))+(0,shiftofflabelmargin)))
  elseif corner = to_ulft:
    (pic shifted ((-center pic)+(ulcorner pic)-(center pic)+(-shiftofflabelmargin,shiftofflabelmargin)))
  else:
    (pic shifted (-center pic))
  fi
enddef;