使用 tikz 填充两条贝塞尔曲线之间的区域

使用 tikz 填充两条贝塞尔曲线之间的区域

我想填充两个贝塞尔曲线之间的区域。

 \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和中Bsequence={A1[reverse] -- B1}sequence={A1 -- B1}确实不是指的是这些路径。相反,AB指的是正在结合的两条路径。(更直观的是。)和[reverse]后面的数字(似乎)指的是应该放在这条路径中的部分,例如是交叉点前第一条路径的延伸,是交叉点后的延伸。一旦你知道了这一点,这可能是组合路径的最直接方法,并将它们用于阴影等。(当然,为了使它工作,我需要在边界处添加垂直路径,和。) ABA0A1CD

答案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请参阅gouraudshadetensorshadefunctionshade这里

在此处输入图片描述

// 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));

相关内容