简洁版本
我想做一些相当复杂的坐标数学来制作一个概念图表,但我想使用 pgfplots,因为我已经在文档的其他地方使用过它,并且希望轴样式(我个人更喜欢)匹配。
我在 tikzmath 中做坐标计算,
\begin{tikzpicture}
\tikzmath{
coordinate \c;
\c0 = (0.0,0.0);
\c1 = (1.0,1.0);
}
\begin{axis}[
xmin=0,
xmax=1,
ymin=0,
ymax=1]
\draw (\c0) -- (\c1);
\coordinate [label=$\c1$] (foo) at (0.5,0.5);
\end{axis}
\end{tikzpicture}
有没有办法从 tikzmath 使用的坐标系转换为轴坐标系?
长版本
我正在尝试绘制一个图来演示通过几个点进行的二次插值。具体来说,我想展示(与三次插值不同)整个曲线的形状如何完全由某一点(我选择第一个点)的导数决定。我想为不同的值绘制这条曲线,所以\d0
我认为我可以利用 TikZ 提供的三次控制点(通过controls
)和计算这些控制点应该是什么。
\begin{tikzpicture}
\tikzmath{
% coordinates
coordinate \p;
\p0 = (0.0,0.0);
\p1 = (0.2,0.6);
\p2 = (0.6,0.9);
\p3 = (1.0,1.0);
% dy/dx values
real \d;
\d0 = 1.0;
\d1 = 2.0 * (\py1 - \py0) / (\px1 - \px0) - \d0;
\d2 = 2.0 * (\py2 - \py1) / (\px2 - \px1) - \d1;
\d3 = 2.0 * (\py3 - \py2) / (\px3 - \px2) - \d2;
% https://math.stackechange.com/a/336679/475643
% quadratic control points
coordinate \q;
\q1 = ({(\px0 + \px1) / 2.0}, {\py0 + \d0 * (\px1 - \px0) / 2.0});
\q2 = ({(\px1 + \px2) / 2.0}, {\py1 + \d1 * (\px2 - \px1) / 2.0});
\q3 = ({(\px2 + \px3) / 2.0}, {\py2 + \d2 * (\px3 - \px2) / 2.0});
% cubic control points, lefthand side
coordinate \s;
\s1 = {(2 / 3 * \q1) + (1 / 3 * \p0)};
\s2 = {(2 / 3 * \q2) + (1 / 3 * \p1)};
\s3 = {(2 / 3 * \q3) + (1 / 3 * \p2)};
% cubic control points, righthand side
coordinate \r;
\r1 = {(2 / 3 * \q1) + (1 / 3 * \p1)};
\r2 = {(2 / 3 * \q2) + (1 / 3 * \p2)};
\r3 = {(2 / 3 * \q3) + (1 / 3 * \p3)};
}
\begin{axis}[
xmin=0,
xmax=60,
ymin=0,
ymax=60,
width=\textwidth,
height=\textwidth]
% https://math.stackexchange.com/q/335226/475643
\draw (axis cs:\p0) .. controls (axis cs:\s1) and (axis cs:\r1) .. (axis cs:\p1);
\draw (axis cs:\p1) .. controls (axis cs:\s2) and (axis cs:\r2) .. (axis cs:\p2);
\draw (axis cs:\p2) .. controls (axis cs:\s3) and (axis cs:\r3) .. (axis cs:\p3);
% datapoints
\draw (axis cs:\p0) node[circle,fill,scale=0.5,label=above:$P_{0}$] {};
\draw (axis cs:\p1) node[circle,fill,scale=0.5,label=above:$P_{1}$] {};
\draw (axis cs:\p2) node[circle,fill,scale=0.5,label=above:$P_{2}$] {};
\draw (axis cs:\p3) node[circle,fill,scale=0.5,label=above:$P_{3}$] {};
\end{axis}
\end{tikzpicture}
如果你忽略计算控制点时的错误(仍在努力),它似乎可以正确地绘制所有内容,直到某个比例因子:
答案1
该
\tikzmath
语句需要在axis
环境内部。这似乎使得 TikZ 数学以一对一的方式解释坐标规范,即 1pt = 1。所有以下坐标计算都将在画布坐标系统PGF/TikZ。
当在 TikZ 路径中使用类似坐标时
(\s2)
,将导致(0.3333pt, 1.26666pt)
,即上述画布坐标系中的坐标。通过明确指定强制 PGF/TikZ 在轴坐标系中解释此坐标axis cs:
会将其转回 PGFPlots 坐标(即 1 = 1pt)。这和之前的点是否是 PGFPlots 轴坐标系统实现方式的良好副作用或幸运事故还有待观察。预计在更复杂的情况下这不会正常工作(3d 根本不起作用,大于 16000 的数字也不起作用)。
坐标计算r和s不正确:
\s1 = {(2 / 3 * \q1) + (1 / 3 * \p0)};
将导致\s1 = {(2 / 3 * \qx1, \qy1) + (1 / 3 * \px0, \py0)};
这可能被解释为两个坐标的相加
(2 / 3 * \qx1, \qy1)
和(1 / 3 * \px0, \py0)
,即因子 1/3 仅适用于X多变的。
当。。。的时候calc
库被加载时“正常”坐标计算将可用:
\s1 = ($2 / 3 *(\q1) + 1 / 3 *(\p0)$);
\s2 = ($2 / 3 *(\q2) + 1 / 3 *(\p1)$);
\s3 = ($2 / 3 *(\q3) + 1 / 3 *(\p2)$);
请注意不*
和之间的空间(
按照手册进行。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{calc, math}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=0, xmax=1, ymin=0, ymax=2,
width=\textwidth,
height=\textwidth]
\tikzmath{
% coordinates
coordinate \p;
\p0 = (0.0,0.0);
\p1 = (0.2,0.6);
\p2 = (0.6,0.9);
\p3 = (1.0,1.0);
% dy/dx values
real \d;
\d0 = 1.0;
\d1 = 2.0 * (\py1 - \py0) / (\px1 - \px0) - \d0;
\d2 = 2.0 * (\py2 - \py1) / (\px2 - \px1) - \d1;
\d3 = 2.0 * (\py3 - \py2) / (\px3 - \px2) - \d2;
% https://math.stackexchange.com/a/336679/475643
% quadratic control points
coordinate \q;
\q1 = ({(\px0 + \px1) / 2.0}, {\py0 + \d0 * (\px1 - \px0) / 2.0});
\q2 = ({(\px1 + \px2) / 2.0}, {\py1 + \d1 * (\px2 - \px1) / 2.0});
\q3 = ({(\px2 + \px3) / 2.0}, {\py2 + \d2 * (\px3 - \px2) / 2.0});
% cubic control points, lefthand side
coordinate \s;
\s1 = ($2 / 3 *(\q1) + 1 / 3 *(\p0)$);
\s2 = ($2 / 3 *(\q2) + 1 / 3 *(\p1)$);
\s3 = ($2 / 3 *(\q3) + 1 / 3 *(\p2)$);
% cubic control points, righthand side
coordinate \r;
\r1 = ($2 / 3 *(\q1) + 1 / 3 *(\p1)$);
\r2 = ($2 / 3 *(\q2) + 1 / 3 *(\p2)$);
\r3 = ($2 / 3 *(\q3) + 1 / 3 *(\p3)$);
}
% https://math.stackexchange.com/q/335226
\draw (axis cs:\p0) .. controls (axis cs:\s1) and (axis cs:\r1) .. (axis cs:\p1);
\draw (axis cs:\p1) .. controls (axis cs:\s2) and (axis cs:\r2) .. (axis cs:\p2);
\draw (axis cs:\p2) .. controls (axis cs:\s3) and (axis cs:\r3) .. (axis cs:\p3);
% datapoints
\draw (axis cs:\p0) node[circle,fill,scale=0.5,label=above:$P_{0}$] {};
\draw (axis cs:\p1) node[circle,fill,scale=0.5,label=above:$P_{1}$] {};
\draw (axis cs:\p2) node[circle,fill,scale=0.5,label=above:$P_{2}$] {};
\draw (axis cs:\p3) node[circle,fill,scale=0.5,label=above:$P_{3}$] {};
\end{axis}
\end{tikzpicture}
\end{document}