您可以从列表中绘制路径,或者以其他方式避免分段联合声明吗?(在 metapost 中)

您可以从列表中绘制路径,或者以其他方式避免分段联合声明吗?(在 metapost 中)

假设我有一个想要绘制的数学函数。

绘制该图形的最简单方法是沿着绘图域以小步骤对其进行评估并生成点。

例如 f(0); f(0.1); f(0.2) ... 转换为 (0, f(0)); (0.1, f(0.1)); (0.2, f(0.2)) ...

如果想画一条曲线而不是点,可以这样做

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

循环内部。换句话说,你编写一个循环,存储前一次计算的结果,计算 x 的当前值,绘制直线段,更新 x 并继续。

是否可以这样做,例如:

%psuedocode
pair list[];
draw list;

答案1

这是使用 的一种可能性metapost。对于将数组作为参数的宏,它被声明为suffix参数,即具有后缀的参数,在本例中为0,1,2,...。输入数组必须以索引/后缀 开头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}

在此处输入图片描述

编辑:根据 Thruston 的建议,我们可以在这里更笼统一些。 如果您想要直线段或贝塞尔曲线的选项,那么您可以使用:

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

在此处输入图片描述

答案2

由于许多钛Z 答案得到 MetaPost 答案(当然很棒)这里是 TiZ 回答了这个问题,大概是 MetaPost 的问题。给定一个列表,众所周知\def\mylist{(0,1) (1,2) (2.5,1/2)},你可以用 绘制这个列表\draw[blue] plot[smooth] coordinates {\mylist};。不太为人所知的是,你也可以绘制具有 Mathematica/C++ 数组结构的列表,比如\def\mylist{{0,1},{1,2},{2.5,1/2}}。这通过利用 TiZ 可以解析和访问数组,

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

具有流畅示例的完整 MWE:

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

在此处输入图片描述

相关内容