简洁版本

简洁版本

简洁版本

我想做一些相当复杂的坐标数学来制作一个概念图表,但我想使用 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}

但是当我渲染它时,坐标不在轴坐标系中: 实际 LaTeX 输出

我希望有以下情节: 所需的 LaTeX 输出

有没有办法从 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}

如果你忽略计算控制点时的错误(仍在努力),它似乎可以正确地绘制所有内容,直到某个比例因子:

更复杂的实际 LaTeX 输出

答案1

  • \tikzmath语句需要在axis环境内部。

    这似乎使得 TikZ 数学以一对一的方式解释坐标规范,即 1pt = 1。所有以下坐标计算都将在画布坐标系统PGF/TikZ。

  • 当在 TikZ 路径中使用类似坐标时(\s2),将导致(0.3333pt, 1.26666pt),即上述画布坐标系中的坐标。通过明确指定强制 PGF/TikZ 在轴坐标系中解释此坐标axis cs:会将其转回 PGFPlots 坐标(即 1 = 1pt)。

    这和之前的点是否是 PGFPlots 轴坐标系统实现方式的良好副作用或幸运事故还有待观察。预计在更复杂的情况下这不会正常工作(3d 根本不起作用,大于 16000 的数字也不起作用)。

  • 坐标计算rs不正确: \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}

输出

在此处输入图片描述

相关内容