diff options
Diffstat (limited to 'Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv')
-rw-r--r-- | Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv | 105 |
1 files changed, 61 insertions, 44 deletions
diff --git a/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv b/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv index 0cc209302ea..617855473c2 100644 --- a/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv +++ b/Master/texmf-dist/metapost/context/base/mpiv/mp-base.mpiv @@ -201,7 +201,7 @@ let graycolor = numeric ; % color part (will be overloaded) def colorpart primary t = - if colormodel t=7: + if colormodel t = 7: (cyanpart t, magentapart t, yellowpart t, blackpart t) elseif colormodel t = 5 : (redpart t, greenpart t, bluepart t) @@ -250,7 +250,7 @@ vardef whatever = ? enddef ; -% unary operators +% unary operators (with patched round) let abs = length ; @@ -258,7 +258,14 @@ vardef round primary u = if numeric u : floor(u+.5) elseif pair u : - (round xpart u, round ypart u) + (floor(xpart u+.5), floor(ypart u+.5)) + elseif path u : + % added by HH + for i=0 upto length u-1 : + round(point i of u) .. + controls round(postcontrol i of u) and round(precontrol i+1 of u) .. + endfor + if cycle u : cycle else : point infinity of u fi else : u fi @@ -323,53 +330,18 @@ primarydef w dotprod z = (xpart w * xpart z + ypart w * ypart z) enddef ; -primarydef x**y = - if y = 2 : - x*x - else : - takepower y of x - fi -enddef ; - -def takepower expr y of x = - if x>0 : - mexp(y*mlog x) - elseif (x=0) and (y>0) : - 0 - else : - 1 - if y = floor y : - if y >= 0 : - for n=1 upto y : - *x - endfor - else : - for n=-1 downto y : - /x - endfor - fi - else : - hide(errmessage "Undefined power: " & decimal x & "**" & decimal y) - fi - fi -enddef ; - -% for big number systems: -% % primarydef x**y = -% if y = 1 : -% x -% elseif y = 2 : +% if y = 2 : % x*x -% elseif y = 3 : -% x*x*x % else : % takepower y of x % fi % enddef ; -% -% vardef takepower expr y of x = -% if (x=0) and (y>0) : +% +% def takepower expr y of x = +% if x>0 : +% mexp(y*mlog x) +% elseif (x=0) and (y>0) : % 0 % else : % 1 @@ -389,6 +361,51 @@ enddef ; % fi % enddef ; +% for big number systems: + +primarydef x**y = + if y = 0 : + 1 + elseif x = 0 : + 0 + elseif y < 0 : + 1/(x**-y) + elseif y = 1 : + x + elseif y = 2 : + x*x + elseif y = 3 : + x*x*x + else : + takepower y of x + fi +enddef ; + +def takepower expr y of x = + if y=0 : % isn't x**0 = 1 even if x=0 ? + 1 + elseif x=0 : + 0 + else : + if y = floor y : + 1 + if y >= 0 : + for n=1 upto y : + *x + endfor + else : + for n=-1 downto y : + /x + endfor + fi + elseif x>0 : + mexp(y*mlog x) + else : + -mexp(y*mlog -x) + fi + fi +enddef ; + vardef direction expr t of p = postcontrol t of p - precontrol t of p enddef ; |