[NTG-context] OT: looking for metapost/fun examples

David Arnold darnold at northcoast.com
Sun Mar 27 06:39:26 CEST 2005


Gerben, Again, thanks for all you do. Here's a Fourier approximation of 
a square wave. Again, I compiled this in Texshop so I know it works.

%verbatimtex
% \input mtplain
% \MTMI{8pt}{6pt}{5pt}
% \MTSY{8pt}{6pt}{5pt}
% \MTEX{8pt}
% \MathRoman{tir}{8pt}{6pt}{5pt}
% \MathBold{tib}{8pt}{6pt}{5pt}
%etex

%Input Context macros
input mp-tool

%define ytick
  vardef ytick(expr pos)=
   path p;
   p:=(-2,0)--(2,0);
   draw p shifted pos;
  enddef;

%define xtick
  vardef xtick(expr pos)=
   path p;
   p:=(0,-2)--(0,2);
   draw p shifted pos;
  enddef;

%define pi
  pi:=3.14159;

%define cosine in radians
  vardef cos(expr x)=
   cosd(x*180/pi)
  enddef;

%define sine in radians
  vardef sin(expr x)=
   sind(x*180/pi)
  enddef;

%hyperbolic sine
  vardef sinh(expr x)=
   (exp(x)-exp(-x))/2
  enddef;

beginfig(1);

%enter number of terms
  numeric N;
  N=6;

%define L
  numeric L;
  L:=pi;

%define a_0
  ao:=1;

%define a_n
  vardef a(expr n)=
   2*sin(n*pi/2)/(n*pi)
  enddef;

%define b_n
  vardef b(expr n)=
   0
  enddef;

%initialize scale
  numeric ux, uy;
  pi*ux=2in; 1.5*uy=2in;

%draw axes
  drawarrow (0,0)--(3.5ux,0);
  drawarrow (0,0)--(0,1.5uy);

%label axes
  label.rt(btex $x$ etex, (3.5ux,0));

%tick marks
  xtick((pi*ux,0));
  label.bot(btex $\pi$ etex, (pi*ux,0));
  ytick((0,1*uy));
  label.lft(btex $1$ etex, (0,1*uy));

%draw the function in black
  draw (0,1uy)--((pi/2)*ux,1uy);

%draw Fourier approximation in cyan
  path p;
  numeric x, y;
  x:=0;
  y:=ao/2;
  for k=1 step 1 until N:
   y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L);
  endfor;
  p:=(x,y);
  for x=0 step .1 until pi:
   y:=ao/2;
   for k=1 step 1 until N:
    y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L);
   endfor;
   p:=p--(x,y);
  endfor;
  x:=pi;
  y:=ao/2;
  for k=1 step 1 until N:
   y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L);
  endfor;
  p:=p--(x,y);
  p:=p xyscaled(ux,uy);
  draw p withcolor cyan;

endfig;


beginfig(0);

%enter number of terms
  numeric N;
  N=6;

%define L
  numeric L;
  L:=pi;

%define a_0
  ao:=1;

%define a_n
  vardef a(expr n)=
   2*sin(n*pi/2)/(n*pi)
  enddef;

%define b_n
  vardef b(expr n)=
   0
  enddef;

%initialize scale
  numeric ux, uy;
  6*pi*ux=2in; 1.5*uy=2in;

%draw axes
  drawdblarrow (-3.5*pi*ux,0)--(3.5*pi*ux,0);
  drawarrow (0,0)--(0,1.5uy);

%label axes
  label.rt(btex $x$ etex, (3.5*pi*ux,0));

%tick marks
  xtick((pi*ux,0));
  xtick((2*pi*ux,0));
  xtick((3*pi*ux,0));
  label.bot(btex $3\pi$ etex, (3*pi*ux,0));
  xtick((-pi*ux,0));
  xtick((-2*pi*ux,0));
  xtick((-3*pi*ux,0));
  label.bot(btex $-3\pi$ etex, (-3*pi*ux,0));
  ytick((0,1*uy));
  label.lft(btex $1$ etex, (0,1*uy));

%draw the function in black
  path q;
  q:=(-pi/2,1)--(pi/2,1);
  q:=q xyscaled(ux,uy);
  draw q;
  draw q shifted (2*pi*ux,0);
  draw q shifted (-2*pi*ux,0);

%draw Fourier approximation in cyan
  path p;
  numeric x, y;
  x:=-3*pi;
  y:=ao/2;
  for k=1 step 1 until N:
   y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L);
  endfor;
  p:=(x,y);
  for x=-3*pi step .1 until 3*pi:
   y:=ao/2;
   for k=1 step 1 until N:
    y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L);
   endfor;
   p:=p--(x,y);
  endfor;
  x:=3*pi;
  y:=ao/2;
  for k=1 step 1 until N:
   y:=y+a(k)*cos(k*pi*x/L)+b(k)*sin(k*pi*x/L);
  endfor;
  p:=p--(x,y);
  p:=p xyscaled(ux,uy);
  draw p withcolor cyan;

endfig;
end;


On Mar 26, 2005, at 3:19 PM, Gerben Wierda wrote:

> I am trying to learn metapost/fun, inline in ConTeXt source. Some 
> basic things are clear, but now the issue is metapost itself.
>
> For instance, I would like to plot a Fourier approximation of a block 
> function.
>
> For instance, I would like to plot a gaussian spread.
>
> I am looking for examples on how to do this. I need to do a bit of 
> programming here and these are my initial projects.
>
> Thanks in advance,
>
> G
>
> _______________________________________________
> ntg-context mailing list
> ntg-context at ntg.nl
> http://www.ntg.nl/mailman/listinfo/ntg-context
>



More information about the ntg-context mailing list