交点、填充与轴相等之间的相互作用

交点、填充与轴相等之间的相互作用

请耐心等待,这有点复杂。我在尝试回答时遇到了一些奇怪的事情这个问题很好. 从 MWE 开始

\documentclass[tikz,border=3.14mm]{standalone}
%\usetikzlibrary{intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture}
 \begin{axis}[axis equal]
    \addplot[thick,samples=80,name path global=duck] {(-3)*x/abs(x)^(2/3)};    % From https://tex.stackexchange.com/a/144463/152550
    \addplot[thick,samples=80,name path global=koala] ({sqrt(16/3)*cos((x) r)}, {sqrt(16)*sin((x) r)});
    \path (0,0) coordinate (O) (1,0) coordinate(X);
    \fill[red,name intersections={of=duck and koala,by={i1,i2}}]
    (i1) circle (2pt) (i2) circle (2pt);
   \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

到目前为止一切顺利。但是,如果仅通过向下移动来激活\usetikzlibrary{intersections}和停用,则会收到错误\usepgfplotslibrary{fillbetween}%

 ! Package pgf Error: No shape named intersection-2 is known.

这告诉我们找不到第二个交点。如果我们坚持这样做,但注释掉[axis equal],错误就会消失,即找到第二个交互。这是怎么回事?

甚至,如果将交点的确定移出轴环境,

\documentclass[tikz,border=3.14mm]{standalone}
%\usetikzlibrary{intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture}
 \begin{axis}[axis equal]
    \addplot[thick,samples=80,name path global=duck] {(-3)*x/abs(x)^(2/3)};    % From https://tex.stackexchange.com/a/144463/152550
    \addplot[thick,samples=80,name path global=koala] ({sqrt(16/3)*cos((x) r)}, {sqrt(16)*sin((x) r)});
    \path (0,0) coordinate (O) (1,0) coordinate(X);
   \end{axis}
    \fill[red,name intersections={of=duck and koala,by={i1,i2}}]
    (i1) circle (2pt) (i2) circle (2pt);
\end{tikzpicture}
\end{document}

一个人

在此处输入图片描述

这意味着交点不正确。另一方面,计算轴外的交点是一种常见的做法,例如这个很好的答案。请注意,即使axis equal在最后一个例子中删除一个,交叉点仍然不正确。

答案1

计算坐标的坐标不匹配的原因是 pgfplots 中的一个错误。

根本原因在 pgfplots 手册的“4.26 TikZ 互操作性”部分中有解释:pgfplots 重新缩放和平移坐标系。Pgfplots 尽力向最终用户隐藏此重新缩放。例如,轴内的命名坐标在离开轴后会自动重新缩放,以便您可以在之后引用它们\end{axis}。命名路径的坐标不存在此功能。

一种解决方法是确保坐标系匹配,即禁用 pgfplots 的重新缩放功能。

手册的上述部分对此进行了解释。应用到您的示例中,这可能看起来像

\documentclass[tikz,border=3.14mm]{standalone}
%\usetikzlibrary{intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture}
 \begin{axis}[axis equal,
    disabledatascaling,
    anchor=origin,
    x=1cm,y=1cm,
    ]
    \addplot[thick,samples=80,name path=duck] {(-3)*x/abs(x)^(2/3)};
    \addplot[thick,samples=80,name path=koala] ({sqrt(16/3)*cos((x) r)}, {sqrt(16)*sin((x) r)});
    \path (0,0) coordinate (O) (1,0) coordinate(X);
   \end{axis}
    \fill[red,name intersections={of=duck and koala,by={i1,i2}}]
    (i1) circle (2pt) (i2) circle (2pt);
\end{tikzpicture}
\end{document}

在此处输入图片描述

但这可能会影响像这样的重新缩放功能axis equal

但同样:这不能开箱即用的原因实际上是一个错误:pgfplots 在离开时不会翻译命名路径的坐标\end{axis}

答案2

这很可能是因为 PGFPlots 使用了比 PGF 更新的库版本intersections,因此它与该库类似external(比较https://tex.stackexchange.com/a/341662/95441)。为了支持这一点,您可以对两个文件进行差异分析

pgflibraryintersections.code.tex
pgfplotsoldpgfsupp_pgflibraryintersections.code.tex

相关内容