Você pode traçar um caminho a partir de uma lista ou evitar declarações conjuntas por partes? (Em metapostagem)

Você pode traçar um caminho a partir de uma lista ou evitar declarações conjuntas por partes? (Em metapostagem)

Digamos que eu tenha uma função matemática que desejo traçar.

A maneira mais fácil de plotar isso é avaliá-lo em pequenos passos ao longo do domínio de plotagem e gerar os pontos.

por exemplo, f(0); f(0,1); f(0.2) ... é convertido em (0, f(0)); (0,1,f(0,1)); (0,2,f(0,2)) ...

Se alguém quiser desenhar uma curva em vez de pontos, poderá fazer

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

Dentro de um loop. Em outras palavras, você escreve um loop, armazena o resultado do cálculo anterior, calcula o valor atual de x, desenha um segmento reto, atualiza x e continua.

É possível fazer, por exemplo:

%psuedocode
pair list[];
draw list;

?

Responder1

Aqui está uma possibilidade com metapost. Para que uma macro tome um array como argumento, ele é declarado como suffixargumento, ou seja, aquele que possui sufixos que neste caso são 0,1,2,.... A matriz de entrada deve começar com index/suffix 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}

insira a descrição da imagem aqui

Editar: De acordo com a sugestão de Thruston, podemos ser um pouco mais gerais aqui. Se desejar a opção de segmentos retos ou curvas de Bézier, você poderá usar:

\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}

insira a descrição da imagem aqui

Responder2

Desde muitos TikAs respostas Z obtêm respostas do MetaPost (o que é ótimo), aqui está um TikResposta Z para esta pergunta presumivelmente MetaPost. Dada uma lista, digamos, \def\mylist{(0,1) (1,2) (2.5,1/2)}é sabido que você pode traçar essa lista com \draw[blue] plot[smooth] coordinates {\mylist};. O que é um pouco menos conhecido é que você também pode plotar listas que possuem a estrutura de array Mathematica/C++, digamos, \def\mylist{{0,1},{1,2},{2.5,1/2}}. Isso funciona explorando que TikZ pode analisar e acessar arrays,

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

MWE completo com exemplos suaves:

\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}

insira a descrição da imagem aqui

informação relacionada