Re: [NTG-context] simplifying repeated macro calls in metafun
Dear Otared,
Regarding the way Aditya uses \startuseMPgraphic, it is also very instructive. Dalyoung, can you also share the animation example for the foldings ? I am sure we are a few on the list to learn something…
1. Here is the working sample of animation using \processMPbuffer which I did before. You can see it using adobe reader. \startbuffer[UDBasic] pair A,B,C,D; pair E, F, G, H; path p,q; numeric ang,maxNum; u:=1in; A=(.95*TextWidth,u); B=(0,u); C=(0,0); D=(.95*TextWidth,0); p := A--B--C--D; q := (TextWidth,1.5u)--(0,1.5u)--(0,-.5u)--(TextWidth,-.5u)--cycle; z0=(.1u,0); vardef nextPt (expr M,N) = if ypart(N) = 0: H := whatever[N, N + dir(.5*angle(M-N))*u] = whatever[A,B]; else: H := whatever[N, N + dir(.5*angle(M-N))*u] = whatever[C,D]; fi; H enddef; def grayUD(expr i) = draw G -- if ypart(B)=ypart(G): B -- C else: C -- B fi --z[i]; filldraw z[i]+2*(G-z[i])*u -- z[i] -- z[i+1] -- z[i+1]+(G-z[i])*u -- cycle withcolor .75white; draw G -- z[i+1] dashed evenly; draw z[0] for k=0 upto i: --z[k] endfor dashed evenly; clip currentpicture to q; setbounds currentpicture to boundingbox q; enddef; def linesUD(expr i) = draw p; draw z0 for k=0 upto i+1: --z[k] endfor dashed evenly; setbounds currentpicture to boundingbox q; enddef; \stopbuffer \startbuffer[UDpts] ang := 40; z[1] = whatever[z[0], z[0]+dir(ang)*u] = whatever[A,B]; G := whatever[z[0], z[0]+dir(2*ang)*u] = whatever[A,B]; for k = 2 upto 20: z[k] = nextPt(z[k-2],z[k-1]); maxNum := k; exitif xpart(z[k]) > TextWidth; endfor; \stopbuffer \startbuffer[UD0] draw p; setbounds currentpicture to boundingbox q; \stopbuffer \startbuffer[UD1] grayUD(0); \stopbuffer \startbuffer[UD11] linesUD(0); \stopbuffer \startbuffer[UD2] G := z0; grayUD(1) \stopbuffer \startbuffer[UD21] linesUD(1); \stopbuffer \startbuffer[UD3] G := z1; grayUD(2); \stopbuffer \startbuffer[UD31] linesUD(2); \stopbuffer \startbuffer[UD4] G := z2; grayUD(3); \stopbuffer \startbuffer[UD41] linesUD(3); \stopbuffer \startbuffer[UD5] G := z3; grayUD(4); \stopbuffer \startbuffer[UD51] linesUD(4); \stopbuffer \startbuffer[UDFinal] draw p; draw z0--z1--z2--z3--z4--z5--z6--z7--z8 dashed evenly; setbounds currentpicture to boundingbox q; \stopbuffer \setupinteraction[state=start] \usemodule[animation] \starttext \startanimation[menu=yes] {\processMPbuffer[UDBasic,UDpts,UD0]} {\processMPbuffer[UDBasic,UDpts,UD1]} {\processMPbuffer[UDBasic,UDpts,UD11]} {\processMPbuffer[UDBasic,UDpts,UD2]} {\processMPbuffer[UDBasic,UDpts,UD21]} {\processMPbuffer[UDBasic,UDpts,UD3]} {\processMPbuffer[UDBasic,UDpts,UD31]} {\processMPbuffer[UDBasic,UDpts,UD4]} {\processMPbuffer[UDBasic,UDpts,UD41]} {\processMPbuffer[UDBasic,UDpts,UD5]} {\processMPbuffer[UDBasic,UDpts,UD51]} {\processMPbuffer[UDBasic,UDpts,UDFinal]} \stopanimation \stoptext Now, I am trying to do the same thing using \startuseMPgraphic, but I don’t the correct result yet. Using \startuseMPgraphic, and \dorecurse, the code is simpler. But, it seems to me that \startanimation … \stopanimation is not working with \dorecurse{}{} … It just list all the graphics. Any hint is welcome. \startMPinitializations%{UDBasic} pair A,B,C,D; pair E, F, G, H; path p,q; numeric ang,maxNum; numeric n; %AM Added u:=1in; A=(.95*TextWidth,u); B=(0,u); C=(0,0); D=(.95*TextWidth,0); p := A--B--C--D; q := (TextWidth,1.5u)--(0,1.5u)--(0,-.5u)--(TextWidth,-.5u)--cycle; z0=(.1u,0); vardef nextPt (expr M,N) = if ypart(N) = 0: H := whatever[N, N + dir(.5*angle(M-N))*u] = whatever[A,B]; else: H := whatever[N, N + dir(.5*angle(M-N))*u] = whatever[C,D]; fi; H enddef; def grayUD(expr i) = draw G -- if ypart(B)=ypart(G): B -- C else: C -- B fi --z[i]; filldraw z[i]+2*(G-z[i])*u -- z[i] -- z[i+1] -- z[i+1]+(G-z[i])*u -- cycle withcolor .75white; draw G -- z[i+1] dashed evenly; draw z[0] for k=0 upto i: --z[k] endfor dashed evenly; clip currentpicture to q; enddef; def linesUD(expr i) = draw p; draw z0 for k=0 upto i+1: --z[k] endfor dashed evenly; % AM: removed. Set in in the main code % setbounds currentpicture to boundingbox q; enddef; ang := 40; z[1] = whatever[z[0], z[0]+dir(ang)*u] = whatever[A,B]; % AM: Changed next line from G to z[-1] z[-1] = whatever[z[0], z[0]+dir(2*ang)*u] = whatever[A,B]; for k = 2 upto 20: z[k] = nextPt(z[k-2],z[k-1]); maxNum := k; exitif xpart(z[k]) > TextWidth; endfor; \stopMPinitializations \startuseMPgraphic{foldUD}{num} numeric n; n := \MPvar{num}-1; G := z[n-1]; grayUD(n); \stopuseMPgraphic \startuseMPgraphic{dotLines}{num} numeric n; n := \MPvar{num}-1; linesUD(n); \stopuseMPgraphic \setupinteraction[state=start] \usemodule[animation] \starttext \startanimation[menu=yes] \dorecurse{7} { {\useMPgraphic{foldUD}{num=\recurselevel}} {\useMPgraphic{dotLines}{num=\recurselevel}} } \stopanimation \stoptext Best regards, Dalyoung
On Thu, 24 Jun 2021, Jeong Dal wrote:
Now, I am trying to do the same thing using \startuseMPgraphic, but I don’t the correct result yet. Using \startuseMPgraphic, and \dorecurse, the code is simpler. But, it seems to me that \startanimation … \stopanimation is not working with \dorecurse{}{} … It just list all the graphics. Any hint is welcome.
A while back, I wrote some code to easily generate metapost animations. https://adityam.github.io/context-blog/post/metapost-animation/ I haven't used it much because I am mostly on linux, and its is a PITA to get an older version of Adobe Reader to work under wine. Aditya
On Wed, 23 Jun 2021, Aditya Mahajan wrote:
On Thu, 24 Jun 2021, Jeong Dal wrote:
Now, I am trying to do the same thing using \startuseMPgraphic, but I don’t the correct result yet. Using \startuseMPgraphic, and \dorecurse, the code is simpler. But, it seems to me that \startanimation … \stopanimation is not working with \dorecurse{}{} … It just list all the graphics. Any hint is welcome.
A while back, I wrote some code to easily generate metapost animations.
https://adityam.github.io/context-blog/post/metapost-animation/
I haven't used it much because I am mostly on linux, and its is a PITA to get an older version of Adobe Reader to work under wine.
Here's a version using these macros. It runs with MkIV but not with LMTX. Sorry, no time to debug what's going wrong in LMTX right now. Aditya
On 6/24/2021 5:42 AM, Aditya Mahajan wrote:
On Wed, 23 Jun 2021, Aditya Mahajan wrote:
On Thu, 24 Jun 2021, Jeong Dal wrote:
Now, I am trying to do the same thing using \startuseMPgraphic, but I don’t the correct result yet. Using \startuseMPgraphic, and \dorecurse, the code is simpler. But, it seems to me that \startanimation … \stopanimation is not working with \dorecurse{}{} … It just list all the graphics. Any hint is welcome.
A while back, I wrote some code to easily generate metapost animations.
https://adityam.github.io/context-blog/post/metapost-animation/
I haven't used it much because I am mostly on linux, and its is a PITA to get an older version of Adobe Reader to work under wine.
Here's a version using these macros. It runs with MkIV but not with LMTX. Sorry, no time to debug what's going wrong in LMTX right now. mp variable handling in lmtx is a bit more sophisticated
when we pass colors, numerics, dimensions there is some guess work going on wrt the type of the variable and on the average that works ok but in lmtx we can also fetch variables so here is a basic setup for you (not much animation but it shows the idea \unprotect % this is similar to mkiv, although we add protection against % overload; i should still use the new argument handling here \permanent\protected\def\startMPanimation {\dodoublegroupempty\meta_start_animation} \permanent\protected\lettonothing\stopMPanimation \def\meta_start_animation#1% {\normalexpanded{\meta_start_animation_indeed{#1}}} \permanent\protected\def\meta_start_animation_indeed#1#2#3\stopMPanimation {\gdefcsname\??mpgraphic#1\endcsname{\meta_handle_use_graphic{#1}{#2}{#3}}} % this one is like yours too but it has more wrapping inside % wrt namespace, picking up variables etc; as you can see, % we just operate in the normal mp related variable namespace \permanent\tolerant\protected\def\useMPanimation#=#*#=% {\meta_begin_graphic_group{#1}% \checkmpcategoryparent \let\currentmpcategory\currentMPgraphicname \setupcurrentmpcategory[#2]% \dorecurse{\mpcategoryparameter{n}}{% \letmpcategoryparameter{i}\recurselevel \begincsname\??mpgraphic#1\endcsname\empty }% \meta_end_graphic_group} % so, the main thing here is that we added the loop and % for convenience i store the current step \protect \starttext \setupMPvariables [animation] [n=4] % watch how we *pick up* a variable, no expansion mess, we % avoid heuristics, it might even be faster (not that it % matters because tex is already pretty fast) \startMPanimation{circle} fill fullcircle scaled (10cm / mpvarn("i")); \stopMPanimation % there currently are mpvarn, mpvard, mpvars, mpvarb \useMPanimation{circle}{n=4} \stoptext ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
participants (3)
-
Aditya Mahajan
-
Hans Hagen
-
Jeong Dal