![填充抛物线和形状之间的区域](https://linux22.com/image/286728/%E5%A1%AB%E5%85%85%E6%8A%9B%E7%89%A9%E7%BA%BF%E5%92%8C%E5%BD%A2%E7%8A%B6%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%9F%9F.png)
我研究过类似的情况,我甚至不明白 pgfplots 如何帮助我,因为我需要填充两条线和一条抛物线之间的区域。这是我的代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\coordinate (A1) at (0,0);
\coordinate (A2) at (1,3);
\coordinate (A3) at (3,2);
\draw[very thin,color=gray] (0,0) grid (3.2,3.2);
\draw[->,name path=xaxis] (-0.1,0) -- (3.2,0) node[right] {$x$};
\draw[->,name path=yaxis] (0,-0.1) -- (0,3.2) node[above] {$y$};
\foreach \x in {0,...,3}
\draw (\x,1pt) -- (\x,-3pt)
node[anchor=north] {\x};
\foreach \y in {0,...,3}
\draw (1pt,\y) -- (-3pt,\y)
node[anchor=east] {\y};
\draw[name path=plot,domain=0:3.2] plot (\x,{\x^2/3}) node[right] {$y=\frac{x^2}{3}$};
coordinate [name intersections={of= A2--A3 and plot,by=intersect-1}];
coordinate [name intersections={of= A1--A3 and plot,by=intersect-2}];
\filldraw[thick,fill=blue,fill opacity=0.4] (A1) -- (A2) -- (A3) -- cycle;
\end{tikzpicture}
\end{document}
谢谢你的帮助,我知道这是一个简单的问题,但说实话这是我在 TeX 中的第一个图表。
答案1
您可以使用\clip
。引用自TikZ/PGF 手册(第 2.11 节,第 35 页):
在 TikZ 中,剪辑非常简单。您可以使用命令
\clip
剪辑所有后续绘制。它的工作原理与 类似\draw
,只是它不绘制任何内容,而是使用给定的路径剪辑后续所有内容。
所以我在你的情节中添加了两个片段:
\clip (A1) -- (A2) -- (A3) -- (3,0) -- cycle;
\clip [domain=0:3.2] plot (\x, \x^2/3) -- (A2) -- (A1);
编辑:现在我知道你想剪辑什么了,这仍然相当容易。对于第一个命令,我们删除-- (3,0)
,否则我们会剪辑太多。对于第二个命令,-- (A2) -- (A1)
剪辑多于抛物线。如果我们用 代替它-- (3.2,0) -- (0,0)
,那么我们剪裁在下面行。请参阅下面更新的屏幕截图和代码。
为了更清楚地说明这两行代码剪辑的是什么,下面附上一张额外的截图:
第一行代码剪切的是红色虚线边框内的区域。第二行是蓝色虚线边框内的区域。
第一个会剪切两条线之间的区域。第二个会剪切抛物线上方的区域,并延伸出去覆盖两条线之间的区域。如果我不添加额外的点,那么它会将直线剪切到原点,这会遗漏您想要遮蔽的部分区域。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\coordinate (A1) at (0,0);
\coordinate (A2) at (1,3);
\coordinate (A3) at (3,2);
\draw[very thin,color=gray] (0,0) grid (3.2,3.2);
\draw[->,name path=xaxis] (-0.1,0) -- (3.2,0) node[right] {$x$};
\draw[->,name path=yaxis] (0,-0.1) -- (0,3.2) node[above] {$y$};
\foreach \x in {0,...,3}
\draw (\x,1pt) -- (\x,-3pt)
node[anchor=north] {\x};
\foreach \y in {0,...,3}
\draw (1pt,\y) -- (-3pt,\y)
node[anchor=east] {\y};
\draw[name path=plot,domain=0:3.2] plot (\x,{\x^2/3}) node[right] {$y=\frac{x^2}{3}$};
\draw (A1) -- (A2);
\draw (A2) -- (A3);
\draw (A1) -- (A3);
\clip (A1) -- (A2) -- (A3) -- cycle;
\clip [domain=0:3.2] plot (\x, \x^2/3) -- (3.2,0) -- (0,0);
\fill [blue, opacity=0.4] (0,0) rectangle (3,3);
\end{tikzpicture}
\end{document}
它看起来像这样:
答案2
对于使用 PSTricks 进行打字练习来说,它太短了。我不知道你到底想要哪一个,所以我为你提供了以下 2 个案例。
情况1
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl,pst-plot}
\def\f{(x^2/3)}
\def\g{(2*x/3)}
\def\h{((-x+7)/2)}
\pstVerb{/I2P {AlgParser cvx exec} def}
\begin{document}
\begin{pspicture}[saveNodeCoors,algebraic,linejoin=2](-1,-1)(4,4)
\psaxes{->}(0,0)(-1,-1)(3.5,3.5)[$x$,0][$y$,90]
\pstInterFF[PointName=none,PointSymbol=none]{\f I2P}{\h I2P}{2}{A}
\pscustom*[linecolor=blue!50]
{
\psplot{0}{3}{\g}
\psplot{3}{N-A.x}{\h}
\psplot{N-A.x}{0}{\f}
\closepath
}
\psplot{0}{3.2}{\f}
\pspolygon(*3 {\g})(*1 {\h})
\uput[u](*3.2 {\f}){\scriptsize $f(x)=\frac{x^2}{3}$}
\end{pspicture}
\end{document}
案例 2
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-eucl,pst-plot}
\def\f{(x^2/3)}
\def\g{(2*x/3)}
\def\h{((-x+7)/2)}
\pstVerb{/I2P {AlgParser cvx exec} def}
\begin{document}
\begin{pspicture}[saveNodeCoors,algebraic,linejoin=2,PointName=none,PointSymbol=none](-1,-1)(4,4)
\psaxes{->}(0,0)(-1,-1)(3.5,3.5)[$x$,0][$y$,90]
\pstInterFF{\f I2P}{\g I2P}{2}{A}
\pstInterFF{\f I2P}{\h I2P}{2}{B}
\pscustom*[linecolor=blue!50]
{
\psplot{N-A.x}{3}{\g}
\psplot{3}{N-B.x}{\h}
\psplot{N-B.x}{N-A.x}{\f}
\closepath
}
\psplot{0}{3.2}{\f}
\pspolygon(*3 {\g})(*1 {\h})
\uput[u](*3.2 {\f}){\scriptsize $f(x)=\frac{x^2}{3}$}
\end{pspicture}
\end{document}
笔记:
最新的pst-eucl
可以接受中缀表示法,因此I2P
不再需要运算符。
答案3
PSTricks 解决方案:
\documentclass{article}
\usepackage{pst-plot}
\begin{document}
\begin{pspicture}[algebraic](-0.35,-0.4)(4.4,3.7)
\psaxes[
tickcolor = black!20,
xticksize = 0 3,
yticksize = 0 3
]{->}(0,0)(3.3,3.3)[$x$,0][$y$,90]
\pscustom*[
linecolor = blue!50
]{
\psline(3,2)(!177 sqrt 3 sub 4 div 31 177 sqrt sub 8 div)
\psplot{2}{2.576}{x^2/3} % plot from 2 to (sqrt(177)-3)/4
\psline(!2 4 3 div)(3,2)
\closepath
}
\psplot{0}{3.2}{x^2/3}
\uput[0](!3.2 256 75 div){$y = \frac{x^{2}}{3}$}
\pspolygon(0,0)(1,3)(3,2)
\end{pspicture}
\end{document}
答案4
MetaPost 解决方案。使用方便的宏找到并填充所需区域buildcycle
。
input mpcolornames;
input latexmp;
setupLaTeXMP(options="12pt", packages = "amsmath", textextlabel = enable, mode = rerun);
u := 1.5cm; xmin := -.5; xmax := 3.5; ymin := -.5; ymax := 3.5; len := 3bp;
vardef f(expr x) = (x**2)/3 enddef;
path p; p = origin -- (3, 2) -- (1, 3) -- cycle;
path curve; curve = origin
for i = 0.01 step 0.01 until 3:
-- (i, f(i))
endfor;
beginfig(1);
labeloffset := 6bp;
for i = 1 upto 3:
draw u*(i, 0) -- u*(i, ymax) withcolor LightGray;
draw u*(0, i) -- u*(xmax, i) withcolor LightGray;
draw (i*u, -len) -- (i*u, len); label.bot("$" & decimal i & "$", (i*u, 0));
draw (-len, i*u) -- (len, i*u); label.lft("$" & decimal i & "$", (0, i*u));
endfor;
labeloffset := 3bp;
label.llft("$O$", origin); label.bot("$x$", (xmax*u, 0)); label.lft("$y$", (0, ymax*u));
fill buildcycle(subpath(1, 2) of p, reverse curve, subpath (epsilon, 3) of p)
scaled u withcolor SlateBlue1;
draw p scaled u;
draw curve scaled u;
picture curvelabel;
curvelabel = thelabel.rt("$y=\dfrac{x^2}{3}$", u*point infinity of curve);
unfill bbox curvelabel; draw curvelabel;
drawarrow (xmin*u, 0) -- (xmax*u, 0);
drawarrow (0, ymin*u) -- (0, ymax*u);
endfig;
end.