¿Se puede trazar un camino a partir de una lista o evitar declaraciones conjuntas por partes? (En metapost)

¿Se puede trazar un camino a partir de una lista o evitar declaraciones conjuntas por partes? (En metapost)

Digamos que tengo una función matemática que quiero trazar.

La forma más sencilla de trazar esto es evaluarlo en pequeños pasos a lo largo del dominio de trazado y generar los puntos.

por ejemplo, f(0); f(0,1); f(0.2) ... se convierte en (0, f(0)); (0,1, f(0,1)); (0,2, f(0,2)) ...

Si uno quiere dibujar una curva en lugar de puntos, podría hacerlo

draw (0, f(0))--(0.1, f(0.1)); 
draw (0.1, f(0.1))--(0.2, f(0.2));

Dentro de un bucle. En otras palabras, escribe un bucle, almacena el resultado del cálculo anterior, calcula el valor actual de x, dibuja un segmento recto, actualiza x y continúa.

¿Es posible hacer, por ejemplo:

%psuedocode
pair list[];
draw list;

?

Respuesta1

Aquí hay una posibilidad con metapost. Para que una macro tome un array como argumento, se declara como suffixargumento, es decir uno que tenga sufijos que en este caso son 0,1,2,.... La matriz de entrada debe comenzar con índice/sufijo 0.

\documentclass[border=10cm]{standalone}
\usepackage{luamplib}

\begin{document}
\begin{mplibcode}
vardef pairs(suffix P)=
    save p_,i_; path p_;
    i_:=0;
    p_:=P[0] forever: exitif not (known P[incr i_]); --P[i_] endfor;
    p_
enddef;

beginfig(0);
u:=1cm;
pair p[];
p[0]=origin;
p[1]=u*(1,1);
p[2]=u*(2,0);
p[3]=u*(4,0);

draw pairs(p) withpen pencircle scaled 1bp withcolor red;
endfig;
\end{mplibcode}

\end{document}

ingrese la descripción de la imagen aquí

Editar: según la sugerencia de Thruston, podemos ser un poco más generales aquí. Si desea la opción de segmentos rectos o curvas de Bézier, puede utilizar:

\begin{mplibcode}
vardef pairs(suffix P)(text joiner)=
    save p_,i_; path p_;
    i_:=0;
    P[0] forever: exitif not (known P[incr i_]); joiner P[i_] endfor
enddef;

beginfig(0);
u:=1cm;
pair p[];
p[0]=origin;
p[1]=u*(1,1);
p[2]=u*(2,0);
p[3]=u*(4,-1);
drawoptions(withpen pencircle scaled 1bp);
draw pairs(p,..) withcolor red;
draw pairs(p,--) withcolor blue;
draw pairs(p,{right}..{right});
%k:=0;
%draw pairs(p,{dir (incr k*30)}..{right}) withcolor green;
drawoptions();

endfig;
\end{mplibcode}

ingrese la descripción de la imagen aquí

Respuesta2

Desde muchos TikLas respuestas Z obtienen respuestas MetaPost (lo cual, por supuesto, es genial) aquí hay un TikRespuesta Z para esta presumiblemente pregunta de MetaPost. Dada una lista, por ejemplo, \def\mylist{(0,1) (1,2) (2.5,1/2)}es bien sabido que se puede trazar esta lista con \draw[blue] plot[smooth] coordinates {\mylist};. Lo que es algo menos conocido es que también se pueden trazar listas que tienen la estructura de matriz de Mathematica/C++, por ejemplo, \def\mylist{{0,1},{1,2},{2.5,1/2}}. Esto funciona explotando ese TikZ puede analizar y acceder a matrices,

\draw plot[samples at={0,1,2}] ({{\mylist}[\x][0]},{{\mylist}[\x][1]});

MWE completo con ejemplos fluidos:

\documentclass[tikz,margin=3]{standalone}
\begin{document}
\begin{tikzpicture}
\def\mylist{(0,1) (1,2) (2.5,1/2)}
\draw plot coordinates {\mylist};
\draw[blue] plot[smooth] coordinates {\mylist};
\begin{scope}[yshift=-4cm]
\def\mylist{{0,1},{1,2},{2.5,1/2}}
\draw plot[samples at={0,1,2}] ({{\mylist}[\x][0]},{{\mylist}[\x][1]});
\draw[blue] plot[smooth,samples at={0,1,2}] ({{\mylist}[\x][0]},{{\mylist}[\x][1]});
\end{scope}
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada