在下面的代码中,我遇到了两个问题:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1.0cm,y=1.0cm]
\draw[->,color=black] (-0.5,0) -- (5.5,0);
\foreach \x in {2,4}
\draw[shift={(\x,0)},color=black] (0pt,2pt) -- (0pt,-2pt) node[below] {\footnotesize $\x$};
\draw[->,color=black] (0,-0.5) -- (0,4.5);
\foreach \y in {1,2}
\draw[shift={(0,\y)},color=black] (2pt,0pt) -- (-2pt,0pt) node[left] {\footnotesize $\y$};
\draw[color=black] (0pt,-10pt) node[right] {\footnotesize $0$};
\clip(-0.5,-0.5) rectangle (5.5,4.5);
\draw [domain=0:5.5] plot(\x,{(\x -2)});
\draw[ smooth,samples=100,domain=0:5.5] plot(\x,{sqrt((\x))});
%\draw [fill=gray,fill opacity=0.3] plot [domain=0:2] (\x,{(\x -2)})--plot [smooth,domain=0:4] (\x,{sqrt((\x))}) ;
\end{tikzpicture}
\end{document}
- 为什么 (0,0) 附近的图形不是很平滑?
- 如何像下图这样为两条曲线之间的区域着色?
答案1
1. 为什么图形不是很平滑?
一种相当直接的方法是增加样本数量。在我的回答中(参见下文),我将其定义\sqrtsamples
为每单位样本数量,然后将其乘以绘图域的大小,这样就可以得到统一的绘图分辨率。
编辑:另一种有趣的方法是使用隐式图,这样您就可以以不同的方式分布样本。在您的例子中,您希望对较小的 x 进行更密集的采样,对较大的 x 进行更粗的采样。因此,您可以绘制参数 的 100 多个样本\t
,然后选择\x=\t^2
。当然,您还必须修改绘图域:
\draw[smooth,samples=100,domain=0:sqrt(5.5),variable=\t] plot({\t^2},{sqrt(\t^2)});
这将使用更少的样本为您提供更加平滑的外观。
2. 如何为两条曲线之间的区域着色?
您可以使用示波器进行填充,将其剪切到曲线之间的区域,使用与实际绘图相同的采样分辨率(再次参见下面的示例)。只需剪掉绘图上方的所有内容sqrt
以及仿射绘图和 x 轴下方的所有内容。然后用一种颜色填充原始剪切区域的左侧部分(最多 x=2),其余部分用另一种颜色填充。(编辑:我最初的回答有点愚蠢。你实际上不需要知道你的图的交集。)
但是,这里我考虑到您实际上想要在特定值 x=2 的上方和下方填充不同的颜色。如果您想以更通用的方式执行此操作,我建议您查看 TikZ 库intersections
并使用let
命令获取您感兴趣的交叉点的 x 坐标。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\def\sqrtsamples{100}
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1.0cm,y=1.0cm]
\draw[->,color=black] (-0.5,0) -- (5.5,0);
\foreach \x in {2,4}
\draw[shift={(\x,0)},color=black] (0pt,2pt) -- (0pt,-2pt) node[below] {\footnotesize $\x$};
\draw[->,color=black] (0,-0.5) -- (0,4.5);
\foreach \y in {1,2}
\draw[shift={(0,\y)},color=black] (2pt,0pt) -- (-2pt,0pt) node[left] {\footnotesize $\y$};
\draw[color=black] (0pt,-10pt) node[right] {\footnotesize $0$};
\clip(-0.5,-0.5) rectangle (5.5,4.5);
% filling scope
\begin{scope}
%% clip to everything between x-axis and sqrt plot
\clip (0,0) -- plot[smooth,samples=5.5*\sqrtsamples,domain=0:5.5](\x,{sqrt((\x))}) -- (5.5,0);
%% clip away everything below affine plot (up to top border of original clipping area)
\clip (0,4.5) -- plot[domain=0:5.5](\x,{(\x -2)}) -- (5.5,4.5);
%% fill areas
\fill[black,opacity=.3] (-0.5,-0.5) rectangle (2,4.5);
\fill[gray,opacity=.3] (2,-0.5) rectangle (5.5,4.5);
\draw[thick] (2,-0.5) -- (2,4.5);
\end{scope}
% plot functions
\draw[domain=0:5.5] plot(\x,{(\x -2)});
\draw[smooth,samples=5.5*\sqrtsamples,domain=0:5.5] plot(\x,{sqrt((\x))});
\end{tikzpicture}
\end{document}
结果: