我想填充两个贝塞尔曲线之间的区域。
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{arrows, calc, shapes}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\draw[name path=A] (1cm,4cm) .. controls (1.3cm,1.2cm) and (1.5cm,1cm) .. (10cm,0.4cm);
\draw[name path=B] (1cm,-4cm) .. controls (1.3cm,-1.2cm) and (1.5cm,-1cm) .. (10cm,-0.4cm);
\end{tikzpicture}
我已经尝试过\filldraw
,但不幸的是,这总是填充错误的一侧。我也考虑过使用的可能性\addplot[brown!50] fill between[of=A and B];
,但我很难用命令添加贝塞尔曲线\addplot
。
我还想让不透明度从左到右流动。
答案1
无需使用任何其他库,您可以只使用剪辑功能(并将路径存储在宏中以方便使用):
\documentclass[tikz]{standalone}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\newcommand{\pathA}{(1cm,4cm) .. controls (1.3cm,1.2cm) and (1.5cm,1cm) .. (10cm,0.4cm)}
\newcommand{\pathB}{(1cm,-4cm) .. controls (1.3cm,-1.2cm) and (1.5cm,-1cm) .. (10cm,-0.4cm)}
\begin{scope}
\clip \pathA -- (10cm,-4cm) -- (1cm,-4cm) -- cycle;
\fill[orange!50] \pathB -- (10cm,4cm) -- (1cm,4cm) -- cycle;
\end{scope}
\draw \pathA;
\draw \pathB;
\end{tikzpicture}
\end{document}
答案2
我想知道你指的是讨论过的技巧这里并使用在这个答案中,其中描述了如何使用交集库将两条路径组合成一条新路径。使用这个技巧,实际上可以在两个步骤中获得所需的填充。这导致了代码
\documentclass[margin=5mm,tikz]{standalone}
\usetikzlibrary{intersections}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
% based on https://tex.stackexchange.com/a/302531/121799
% and http://texwelt.de/wissen/fragen/4153/wie-kann-ich-die-flache-zwischen-mehreren-pfaden-fullen/4161s
\begin{document}
\begin{tikzpicture}
\pgfdeclarelayer{pre main}
\pgfsetlayers{pre main,main}
\draw [name path=A] (1cm,4cm) .. controls (1.3cm,1.2cm) and (1.5cm,1cm) ..
(10cm,0.4cm);
\draw [name path=B]
(1cm,-4cm) .. controls (1.3cm,-1.2cm) and (1.5cm,-1cm)
.. (10.cm,-0.4cm);
\path [name path=C] (1cm,4cm) -- (1cm,-4cm);
\path [name path=D] (10cm,-0.4cm) -- (10cm,0.4cm);
\path [%draw,line width=3,blue,
name path=AandC,
intersection segments={
of=A and C,
sequence={A1[reverse] -- B1}
}];
\path [%draw,line width=3,purple,
name path=BandD,
intersection segments={
of=B and D,
sequence={A0 -- B1[reverse]}
}];
\pgfonlayer{pre main}
\fill [
blue!40!white,
intersection segments={
of=AandC and BandD,
sequence={A1 -- B1},
}
];
\endpgfonlayer
\end{tikzpicture}
\end{document}
警告:我保留了你的路径标签,但想提请你注意,在A
和中B
sequence={A1[reverse] -- B1}
sequence={A1 -- B1}
确实不是指的是这些路径。相反,A
和B
指的是正在结合的两条路径。(更直观的是。)和[reverse]
后面的数字(似乎)指的是应该放在这条路径中的部分,例如是交叉点前第一条路径的延伸,是交叉点后的延伸。一旦你知道了这一点,这可能是组合路径的最直接方法,并将它们用于阴影等。(当然,为了使它工作,我需要在边界处添加垂直路径,和。) A
B
A0
A1
C
D
答案3
(我知道这是一篇旧帖子但它刚刚又出现了……)
我有点惊讶以下解决方案尚未被提出:只需用线条连接路径并对这样定义的区域进行阴影(或填充)。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/417970/86}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\shade[left color=brown!50]
(1cm,4cm) .. controls (1.3cm,1.2cm) and (1.5cm,1cm) .. (10cm,0.4cm)
--
(10cm,-0.4cm) .. controls (1.5cm,-1cm) and (1.3cm,-1.2cm) ..
(1cm,-4cm) -- cycle;
\draw (1cm,4cm) .. controls (1.3cm,1.2cm) and (1.5cm,1cm) .. (10cm,0.4cm);
\draw (1cm,-4cm) .. controls (1.3cm,-1.2cm) and (1.5cm,-1cm) .. (10cm,-0.4cm);
\end{tikzpicture}
\end{document}
唯一的缺点是需要定义两次路径。在本例中,它们并不复杂,所以这似乎不是什么困难。如果这是一个问题,那么下面的使用spath3
保存并重复使用路径。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/417970/86}
\usepackage{tikz}
\usetikzlibrary{spath3}
\begin{document}
\begin{tikzpicture}
% Save the paths, but don't draw them
\path[spath/save=A] (1cm,4cm) .. controls (1.3cm,1.2cm) and (1.5cm,1cm) .. (10cm,0.4cm);
\path[spath/save=B] (1cm,-4cm) .. controls (1.3cm,-1.2cm) and (1.5cm,-1cm) .. (10cm,-0.4cm);
\shade[
left color=brown!50,
spath/use=A % set the initial path to be A
]
-- (spath cs:B 1) % add a straight line to the end of B
[spath/use={B,reverse,weld}] % append path B, reversing it, and welding it
% to make a single path for shading
-- cycle % cycle back to the start
;
\draw[spath/use=A]; % draw path A
\draw[spath/use=B]; % draw path B
\end{tikzpicture}
\end{document}
这两种方法都会产生以下结果:
答案4
我猜你想要的是使用给定的左颜色和给定的右颜色进行填充。对于 TikZ,通过简化path
操作,我们使用一个小技巧来实现这一点。
\documentclass[border=5mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\def\pathA{(1,4) .. controls (1.3,1.2) and (1.5,1) .. (10,0.4)}
\def\pathB{(1,-4) .. controls (1.3,-1.2) and (1.5,-1) .. (10,-0.4)}
% this is a small trick: clip a bigger region to fill
\begin{scope}
\clip \pathA -- (10,-4) -- (1,-4) -- cycle;
\fill[left color=orange,right color=orange!50] \pathB -- (10,4) -- (1,4) -- cycle;
\end{scope}
\draw[blue] \pathA;
\draw[red] \pathB;
\end{tikzpicture}
\end{document}
对于具有许多操作的 Asymptote path
,这样做很直接:reverse
反转路径;relpoint
选择路径上的一个点。要用统一的颜色填充,请使用。还有fill(mypath,orange);
其他几种填充类型:axialshade
,,,,,radialshade
请参阅gouraudshade
tensorshade
functionshade
这里。
// http://asymptote.ualberta.ca/
unitsize(1cm);
path pA=(1,4) .. controls (1.3,1.2) and (1.5,1) .. (10,0.4);
path pB=(1,-4) .. controls (1.3,-1.2) and (1.5,-1) .. (10,-0.4);
// path pB=yscale(-1)*pA; // <<< also works!
path mypath=pA--relpoint(pB,1)--reverse(pB)--cycle;
// fill with uniform color
//fill(mypath,orange);
// fill with left and right color
pen leftpen=green;
pen rightpen=.1green+white;
axialshade(mypath,leftpen,(0,0),rightpen,(10,0));
draw(pA,blue);
draw(pB,red);
shipout(bbox(5mm,invisible));