我一直在尝试重现以下示例
\documentclass[tikz,margin=3pt]{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{pgfplots.polar,intersections}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{polaraxis}[samples=50,smooth,thick,axis lines=none]
\begin{scope} % Everything inside this scope is clipped
% frame
\path[clip,draw]
plot[domain=44.9:135] (axis cs: \x, {(4/sin(\x))/(1+0.01*(4/sin(\x))^2)})
--plot[domain=135:225] (axis cs: \x, {(-4/cos(\x))/(1+0.01*(-4/cos(\x))^2)})
--plot[domain=225:315] (axis cs: \x, {(-4/sin(\x))/(1+0.01*(-4/sin(\x))^2)})
--plot[domain=-45:45] (axis cs: \x, {(4/cos(\x))/(1+0.01*(4/cos(\x))^2)})
--cycle;
% Clipped plot:
\addplot[dotted,domain=30:150]{(3/sin(x))/(1+0.01*(3/sin(x))^2)};
\end{scope}
% Scope ended, so this is not clipped:
\addplot[red,dotted,domain=20:160]{(2/sin(x))/(1+0.01*(2/sin(x))^2)};
\end{polaraxis}
\end{tikzpicture}
\end{document}
由此回答。不幸的是,我想要创建的区域涉及无法使用 tikz 的绘图功能正确绘制的函数。我可以使用 pgfplots 的 \addplot 绘制它们,但我不知道如何提取路径并将它们连接到其他点和路径。我的总体目标是绘制轮廓填充区域(也来自 pgfplot)。我将不胜感激任何指导或帮助。
编辑:我想将点 (-0.66,2) 连接到路径
\addplot[domain=-0.66:0, clip = true] {-2*x*(x^2 + sqrt(1+ x^4))};
这条路
\addplot[domain=0:2] {2*x*(-x^2 + sqrt(1+ x^4))};
然后,将此路径移动到(2,2)并循环到(-0.66,2)然后使用范围内的区域来裁剪填充的轮廓。
答案1
事实上,这并不是什么大问题,而且钾Z 完全有能力绘制这些函数。
您只需注意一件事:由于某些神秘的机制,\x
如果您希望它取要指数化的负值,则需要用括号括起来。因此,如果可能为负数,则应写为(\x)^2
而不是。但这仅适用于Ti 中的函数\x^2
\x
plot
钾Z。
我猜你可能不想要极轴:
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=100, smooth, axis lines=none]
\begin{scope}
\path[clip]
(-0.66,2) --
plot[domain=-0.66:0] (axis cs: \x, {-2*\x*((\x)^2 + sqrt(1+(\x)^4))}) --
plot[domain=0:2] (axis cs: \x, {2*\x*(-\x^2 + sqrt(1+\x^4))}) --
(2,2) -- cycle;
\fill[red] (-1,5) rectangle (10,-10);
\end{scope}
\addplot[domain=-0.66:0] {-2*x*(x^2 + sqrt(1+ x^4))};
\addplot[domain=0:2] {2*x*(-x^2 + sqrt(1+ x^4))};
\end{axis}
\end{tikzpicture}
\end{document}
另一种方法是使用fillbetween
库。这样,您就不需要将所有内容绘制两次。
由于这两条路径实际上并不相交(仅在一个点相交,这一点很容易被 Ti 忽略)。钾Z(由于舍入误差),我们应该在序列定义中使用整个路径,使用L*
与R*
而不是交集段:
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=100, smooth, axis lines=none]
\addplot[domain=-0.66:0, name path=A] {-2*x*(x^2 + sqrt(1+ x^4))};
\addplot[domain=0:2, name path=B] {2*x*(-x^2 + sqrt(1+ x^4))};
\begin{scope}
\path[clip, intersection segments={of=A and B,
sequence={L* -- R*}}] -- (2,2) -- (-0.66,2) -- cycle;
\fill[red] (-1,5) rectangle (10,-10);
\end{scope}
\end{axis}
\end{tikzpicture}
\end{document}
输出与上面相同。