在 pgfplots 手册中说:
\addplot+[smooth]
Smooth plots interpolate smoothly between successive points.
为了从函数评估中选择正确的点样本进行绘图,我需要详细了解“平滑绘图”pgfplots(或 tikz)实际实现的“插值”是什么。
例如,它是三次样条函数(可能不是)、Akima 样条函数还是自制样条函数?如果不是标准样条函数,它具有哪些属性?连续性、一阶导数连续性、二阶导数连续性、单调性、最大容许曲率?
答案1
它使用三次贝塞尔曲线连接绘图上的点,并使用考虑到前一个点和下一个点的相对简单的算法计算每个点的两个支撑位。
贝塞尔曲线的支撑点计算如下:过一点的切线与连接前一点和后一点的线平行:
为了确定点处的曲线的控制点是,处理程序计算向量是−X并按张力因子缩放。我们称结果向量为s。 然后是+s和是−s将是周围的控制点是。曲线起点处的第一个控制点将再次作为起点本身;同样,最后一个控制点也将作为终点本身。
采用同样的方法smooth cycle
。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.pathreplacing, shapes.misc}
\tikzset{show curve controls/.style={decoration={show path construction,curveto code={
\draw[blue,dashed](\tikzinputsegmentfirst)--(\tikzinputsegmentsupporta)node[at end,cross out,draw,solid,red,inner sep=2pt]{};
\draw[blue,dashed](\tikzinputsegmentsupportb)--(\tikzinputsegmentlast)node[at start,cross out,draw,solid,red,inner sep=2pt]{};}},decorate}}
\begin{document}
\tikz[mark=*, mark size=1pt]
\foreach[count=\j] \cycle in {, \space cycle}
\foreach[count=\i] \tension in {.5, 1, 1.5, 2}
\draw[shift={(\j*5cm,-\i*2cm)}, postaction=show curve controls]
plot[tension=\tension, smooth\cycle] coordinates {(0,0)(1,1)(2,.5)(3,1)}
node[above] {\tension}
(0,0) edge[densely dotted] (2,.5)
(1,1) edge[densely dotted] (3,1);
\end{document}