
假設我有一個數學函數 f 我想繪製。
繪製此圖的最簡單方法是沿著繪圖域以小步長對其進行評估並產生點。
例如 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
由於許多鈦kZ 答案得到 MetaPost 答案(這當然很棒)這裡是 TikZ 回答了這個可能是 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}}
.這是透過利用 Ti 來實現的kZ 可以解析和存取數組,
\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}