From 1e69816bbbeebedafd52684fc4182ce977d92a8a Mon Sep 17 00:00:00 2001
From: Hans Hagen <pragma@wxs.nl>
Date: Mon, 11 Apr 2022 20:12:40 +0200
Subject: 2022-04-11 19:22:00

---
 metapost/context/base/mpxl/mp-lmtx.mpxl | 14 ++++++++++++--
 metapost/context/base/mpxl/mp-luas.mpxl | 12 +++++++++++-
 metapost/context/base/mpxl/mp-tool.mpxl | 31 +++++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+), 3 deletions(-)

(limited to 'metapost')

diff --git a/metapost/context/base/mpxl/mp-lmtx.mpxl b/metapost/context/base/mpxl/mp-lmtx.mpxl
index 9adacb9d9..f8ee2032a 100644
--- a/metapost/context/base/mpxl/mp-lmtx.mpxl
+++ b/metapost/context/base/mpxl/mp-lmtx.mpxl
@@ -602,6 +602,7 @@ presetparameters "function" [
     yarrow      = "",
     reverse     = false,
   % function    : metatable is parent
+    axis        = "both",
 ] ;
 
 def lmt_function = applyparameters "function" "lmt_do_function" enddef ;
@@ -640,8 +641,8 @@ vardef lmt_do_function =
         pickup pencircle xyscaled(lw/sx,lw/sy) ;
         draw image (
             save xmin, xmax, xstep, xsmall, xlarge, ymin, ymax, ystep, ysmall, ylarge, p ;
-            save code, option, txl, txs, tyl, tys, swap ;
-            string code, option, shape ;
+            save code, option, txl, txs, tyl, tys, swap, axis ;
+            string code, option, shape, axis ;
             path txl, txs, tyl, tys ; boolean swap, close ;
             picture p ;
 
@@ -659,6 +660,7 @@ vardef lmt_do_function =
             swap    := getparameter "reverse" ;
             shape   := getparameter "shape" ;
             close   := getparameter "close" ;
+axis   := getparameter "axis" ;
             p := image (
                 if (getparametercount "functions") > 0 :
                     for s = 1 upto getparametercount "functions" :
@@ -700,6 +702,12 @@ vardef lmt_do_function =
 
             if not swap : draw p fi ;
 
+if (axis = "") or (axis = "no") :
+    % nothing
+else :
+
+    % todo: x y both
+
             option := getparameter "xticks" ;
             if option = "top" :
                 txs := (0,0) -- (0,tl) ;
@@ -887,6 +895,8 @@ vardef lmt_do_function =
                     shifted (xmin-tl,0)
                     shifted center leftboundary currentpicture ;
             fi ;
+
+fi ;
         )
 
         xyscaled(sx,sy) ;
diff --git a/metapost/context/base/mpxl/mp-luas.mpxl b/metapost/context/base/mpxl/mp-luas.mpxl
index f10c3507a..cc760f93e 100644
--- a/metapost/context/base/mpxl/mp-luas.mpxl
+++ b/metapost/context/base/mpxl/mp-luas.mpxl
@@ -231,6 +231,14 @@ let dppart = bluepart ;
 
 permanent wdpart, htpart, dppart;
 
+newscriptindex mfid_sortedpath ; mfid_sortedpath := scriptindex "sortedpath" ;
+newscriptindex mfid_uniquepath ; mfid_uniquepath := scriptindex "uniquepath" ;
+
+def sortedpath = runscript mfid_sortedpath enddef ;
+def uniquepath = runscript mfid_uniquepath enddef ;
+
+permanent sortpath, uniquepath ;
+
 newscriptindex mfid_texvar ; mfid_texvar := scriptindex "texvar" ; vardef texvar(expr s) = runscript mfid_texvar s enddef ;
 newscriptindex mfid_texstr ; mfid_texstr := scriptindex "texstr" ; vardef texstr(expr s) = runscript mfid_texstr s enddef ;
 
@@ -313,6 +321,7 @@ permanent getparameters, presetparameters, hasparameter, hasoption, getparameter
 newscriptindex mfun_newrecord ; mfun_newrecord := scriptindex "newrecord" ;
 newscriptindex mfun_setrecord ; mfun_setrecord := scriptindex "setrecord" ;
 newscriptindex mfun_getrecord ; mfun_getrecord := scriptindex "getrecord" ;
+newscriptindex mfun_cntrecord ; mfun_cntrecord := scriptindex "cntrecord" ;
 
 % let record = runscript ; % We need to use "let" because we don't expand!
 
@@ -321,9 +330,10 @@ def record    = newinternal numeric runscript enddef ;
 def newrecord = runscript mfun_newrecord ; enddef ; % semicolon prevents lookahead
 def setrecord = runscript mfun_setrecord ; enddef ;
 def getrecord = runscript mfun_getrecord   enddef ;
+def cntrecord = runscript mfun_cntrecord   enddef ;
 
 permanent
-    record, newrecord, setrecord, getrecord ;
+    record, newrecord, setrecord, getrecord, cntrecord ;
 
 % No vardef's because we need to scan for an assignment too and we'll see
 % an endgroup otherwise.
diff --git a/metapost/context/base/mpxl/mp-tool.mpxl b/metapost/context/base/mpxl/mp-tool.mpxl
index 28d1bbf3e..d99439c5b 100644
--- a/metapost/context/base/mpxl/mp-tool.mpxl
+++ b/metapost/context/base/mpxl/mp-tool.mpxl
@@ -3946,3 +3946,34 @@ primarydef p withdashes len =
 enddef ;
 
 permanent withdashes ;
+
+%D For Mikael:
+
+path mfun_b ;
+pair mfun_k ;
+
+tertiarydef p intersectionpath q =
+    begingroup ;
+    save mfun_b ; path mfun_b ; mfun_b := sortedpath (p intersectiontimeslist q) ;
+    save mfun_k ; pair mfun_k ; mfun_k := point 0 of mfun_b;
+    .5[point xpart mfun_k of p, point ypart mfun_k of q]
+    for i = 1 upto length(mfun_b) :
+        hide(mfun_k := point i of mfun_b;)
+        -- .5[point xpart mfun_k of p, point ypart mfun_k of q]
+    endfor
+    endgroup
+enddef ;
+
+tertiarydef p firstintersectionpath q =
+    begingroup ;
+    save mfun_b ; path mfun_b ; mfun_b := sortedpath (p intersectiontimeslist q) ;
+    point xpart (point 0 of mfun_b) of p
+    for i = 1 upto length(mfun_b) :
+        -- point xpart (point i of mfun_b) of p
+    endfor
+    endgroup
+enddef ;
+
+tertiarydef p secondintersectionpath q =
+    q firstintersectionpath p
+enddef;
-- 
cgit v1.2.3