填充 TikZ 中两条曲线相交处的外部

填充 TikZ 中两条曲线相交处的外部

我正在尝试使用 TikZ 中的 fillbetween 选项填充两条曲线交叉点的外部。此绘图是更复杂图片的一部分;所以我更喜欢使用我的曲线定义代码。我不想使用\addplot,这样我就可以根据需要控制曲线的形状。

受到以下答案的启发贾斯珀·哈比希特这个帖子,我想出了以下代码来手动填充指定区域。此方法绘制直线三角形区域。

为了遵循曲线的曲率,有没有办法填充该区域,例如使用代码:intersectionsegments={of=curveA and topAB and curveB}; 或者使用软剪辑。

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\usetikzlibrary{backgrounds,shadings,patterns}
\begin{document}
\tikzset{pics/.cd,
curvef/.style n args={2}{code={
\node [red] at (#1,#2) (begin){}
([shift={(10.:.4cm)}]begin.center) node (beginr){}
([shift={(60:4.4cm)}]beginr.center) node (midtop){}
([shift={(-60:4.4cm)}]midtop.center) node (end){}
([shift={(-10.:.4cm)}]end.center) node (endr){};}}}
%
\tikzset{lw/.style={line width=.08cm}}
%
\begin{tikzpicture}[scale=.8, transform shape]
%
\pic at (0,0) {curvef={.8}{0}};
%
\draw[blue, lw, name path=curveA]([shift={(180.:.8cm)}]begin.center) --   (begin.center) to [out=6, in=-160, looseness=1.] (beginr.center) to [out=20, in=-125, looseness=.68] (midtop.center) to [out=55, in=160, looseness=.68] node[pos=.1] (mda){} node[pos=.74] (r){} (end.center) to [out=-20, in=174, looseness=1.] (endr.center) --  ([shift={(0.:2.6cm)}]endr.center);
%
\pic at (2,0) {curvef={.8}{0}};
%
\draw[green!60!black, lw, name path=curveB] ([shift={(180.:2.8cm)}]begin.center) --  (begin.center) to [out=6, in=-160, looseness=1.] (beginr.center) to [out=20, in=-125, looseness=.68] (midtop.center) coordinate (mdb) to [out=55, in=160, looseness=.68]node[pos=.1] (mdb){} (end.center) to [out=-20, in=174, looseness=1.] (endr.center) --  ([shift={(0.:.8cm)}]endr.center);
%
\path[name path=topAB] (mda.center) --  (mdb.center);
%
\path[name intersections={of=curveA and curveB}] (intersection-2) node[circle, black, fill=black, scale=0.6] (ab2) {};
%
\begin{scope}[on background layer]
\path[fill=red!50] (ab2.center) -- ([shift={(0.:.14cm)}]mda.center) -- ([shift={(180.:.14cm)}]mdb.center) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

好吧,如果您知道两条曲线最大值的坐标,您可以执行以下操作(我将一些节点更改为\pic曲线定义中的坐标,但这不会改变结果;相关内容是背景层上的路径):

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\pgfplotsset{compat=newest}
\usetikzlibrary{backgrounds}

\begin{document}
\tikzset{pics/.cd,
    curvef/.style n args={2}{code={
        \coordinate (begin) at (#1,#2);
        \coordinate (beginr) at ([shift={(10.:.4cm)}]begin);
        \coordinate (midtop) at ([shift={(60:4.4cm)}]beginr);
        \coordinate (end) at ([shift={(-60:4.4cm)}]midtop);
        \coordinate (endr) at ([shift={(-10.:.4cm)}]end);
    }
}}

\tikzset{lw/.style={line width=.08cm}}

\begin{tikzpicture}[scale=.8, transform shape]

\pic at (0,0) {curvef={.8}{0}};

\draw[blue, lw, name path=curveA]
    ([shift={(180.:.8cm)}]begin) --
    (begin) to [out=6, in=-160, looseness=1.] 
    (beginr) to [out=20, in=-125, looseness=.68] 
    (midtop) to [out=55, in=160, looseness=.68] 
    coordinate [pos=.1] (mda) 
    coordinate [pos=.74] (r) 
    (end) to [out=-20, in=174, looseness=1.] 
    (endr) --
    ([shift={(0.:2.6cm)}]endr);

\pic at (2,0) {curvef={.8}{0}};

\draw[green!60!black, lw, name path=curveB] 
    ([shift={(180.:2.8cm)}]begin) -- 
    (begin) to [out=6, in=-160, looseness=1.] 
    (beginr) to [out=20, in=-125, looseness=.68] 
    (midtop) coordinate (mdb) 
    to [out=55, in=160, looseness=.68] 
    coordinate [pos=.1] (mdb)
    (end) to [out=-20, in=174, looseness=1.] 
    (endr) --  
    ([shift={(0.:.8cm)}]endr);

\path[name intersections={of=curveA and curveB}] 
    (intersection-2) node[circle, black, fill=black, scale=0.6] (ab2) {};

\begin{scope}[on background layer]
    \path[fill=red!50, name path=layerAB] 
        (ab2.center) -| (mda) -- (mdb) |- cycle;
    
    \path[name path=layerABtemp, intersection segments={
            of=curveA and layerAB, sequence={L2[reverse] -- R3}
        }] -- cycle;

    \path[fill=red, intersection segments={
            of=layerABtemp and curveB, sequence={L2 -- R2[reverse]}
        }] -- cycle;
\end{scope}

\end{tikzpicture}
\end{document}

在此处输入图片描述

请注意,没有必要转义 内的空行或行尾tikzpicture。另外,我建议您\coordinate尽可能使用 s 而不是节点,因为这可以简化您的代码(例如,您不需要使用锚点.center),而且节点具有内部和外部 sep,这可能会影响输出。

如果您加载pgfplots(这对于fillbetween库来说是必需的,则不需要tikz单独加载。但是在使用时pgfplots,请确保始终将compat选项设置为合理的。

答案2

这是使用 TikZ 的一个技巧。

在此处输入图片描述

\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}[thick]
\def\Aleft{(-3,0)--(-2,0) .. controls +(0:2) and +(180:.3) ..(0,2)}
\def\Aright{(0,2) .. controls +(0:.3) and +(180:2) .. (2,0)--(3,0)}
\def\Bleft{[shift={(-1,0)}]\Aleft}
\def\Bright{[shift={(-1,0)}]\Aright}
\def\curveA{\Aleft--\Aright}
\def\curveB{[shift={(-1,0)}]\curveA}
\begin{scope}
\clip \Aleft -|  cycle;
\clip \Bright |- cycle;
\fill[yellow] (0,2) rectangle +(-1,-2);
\end{scope}
\draw[blue] \curveA;
\draw[teal] \curveB;
\end{tikzpicture}
\end{document}  

相关内容