.png)
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 suffix
argumento, 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}
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}
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}