Können Sie einen Pfad aus einer Liste zeichnen oder stückweise gemeinsame Deklarationen anderweitig vermeiden? (In Metapost)

Können Sie einen Pfad aus einer Liste zeichnen oder stückweise gemeinsame Deklarationen anderweitig vermeiden? (In Metapost)

Angenommen, ich habe eine mathematische Funktion, die ich darstellen möchte.

Der einfachste Weg, dies darzustellen, besteht darin, es in kleinen Schritten entlang des Darstellungsbereichs auszuwerten und die Punkte zu generieren.

zB f(0); f(0,1); f(0,2) ... werden umgewandelt in (0, f(0)); (0,1, f(0,1)); (0,2, f(0,2)) ...

Wenn man eine Kurve statt Punkte zeichnen möchte, könnte man

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

Innerhalb einer Schleife. Mit anderen Worten, Sie schreiben eine Schleife, speichern das Ergebnis der vorherigen Berechnung, berechnen den aktuellen Wert von x, zeichnen ein gerades Segment, aktualisieren x und fahren fort.

Ist es beispielsweise möglich:

%psuedocode
pair list[];
draw list;

?

Antwort1

Hier ist eine Möglichkeit mit metapost. Damit ein Makro ein Array als Argument annehmen kann, wird es als suffixArgument deklariert, d. h. als eines mit Suffixen, die in diesem Fall sind 0,1,2,.... Das Eingabearray muss mit Index/Suffix beginnen 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}

Bildbeschreibung hier eingeben

Bearbeiten: Gemäß Thrustons Vorschlag können wir hier etwas allgemeiner sein. Wenn Sie die Option gerader Segmente oder Bézierkurven wünschen, können Sie Folgendes verwenden:

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

Bildbeschreibung hier eingeben

Antwort2

Da viele TikZ Antworten erhalten MetaPost Antworten (was natürlich toll ist) hier ist ein Tik\def\mylist{(0,1) (1,2) (2.5,1/2)}Z-Antwort auf diese vermutlich MetaPost-Frage. Bei einer gegebenen Liste ist es beispielsweise sehr gut bekannt, dass Sie diese Liste mit darstellen können \draw[blue] plot[smooth] coordinates {\mylist};. Etwas weniger bekannt ist, dass Sie auch Listen darstellen können, die die Mathematica/C++-Array-Struktur haben, beispielsweise \def\mylist{{0,1},{1,2},{2.5,1/2}}. Dies funktioniert, indem man ausnutzt, dass TikZ kann Arrays analysieren und darauf zugreifen,

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

Vollständiges MWE mit reibungslosen Beispielen:

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

Bildbeschreibung hier eingeben

verwandte Informationen