TikZ 中两个曲线区域并集的轮廓边界

TikZ 中两个曲线区域并集的轮廓边界

发现这里有几个问题显然与我想要的有关,TikZ 复合形状的轮廓描边如何在 TikZ 中勾勒出环形和矩形的并集?TikZ:从交叉口到交叉口绘制圆弧和其他一些,但仍然无法弄清楚如何使它们适应我的需要。

我有这个:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc,intersections}

\begin{document}

\begin{tikzpicture}
\clip (-4,-1) rectangle (4,3);
\coordinate (a) at (-4,-3);
\coordinate (va) at (3,7.5);
\shadedraw[name path=higher,opacity=.3] (a) .. controls ($(a)+(va)$) .. ($(a)+(6,0)$);
\coordinate (b) at (4,-5);
\coordinate (vb) at (-3,7.5);
\shadedraw[name path=lower,opacity=.3] ($(b)-(6,0)$) .. controls ($(b)+(vb)$) .. (b);
\path [name intersections={of=higher and lower,by=x}];
\coordinate (xa) at (-1.65,3.45);
\coordinate (xb) at (1,.75);
\draw[thick] (a) .. controls ($(a)+.89*(va)$) and ($(x)+(xa)$) .. (x)
                 .. controls ($(x)+(xb)$) and ($(b)+.6*(vb)$) .. (b);
\end{tikzpicture}

\end{document} 

结果是

在此处输入图片描述

但是我花了很大力气,通过盲目的反复试验,才找到代码中的六位小数,而且,如果你仔细观察,就会发现图像仍然不完全准确。

有没有更好的方法来画出那条粗线?

答案1

这可以通过使用spath3图书馆(这个應該可以使用 CTAN 上的当前版本,但如果不能,可以使用最新版本github- 它只是在等我将其上传到 CTAN)。

绘制并着色原始路径后,它会在交叉点处分裂。然后可以单独渲染各个组件,也可以将它们焊接在一起,在交叉点处形成一个漂亮的接头。

\documentclass{article}
%\url{https://tex.stackexchange.com/q/598243/86}

\usepackage{tikz}
\usetikzlibrary{
  calc,
  intersections,
  spath3
}

\begin{document}

\begin{tikzpicture}
\clip (-4,-1) rectangle (4,3);
\coordinate (a) at (-4,-3);
\coordinate (va) at (3,7.5);
\shadedraw[spath/save=higher,opacity=.3] (a) .. controls ($(a)+(va)$) .. ($(a)+(6,0)$);
\coordinate (b) at (4,-5);
\coordinate (vb) at (-3,7.5);
\shadedraw[spath/save=lower,opacity=.3] ($(b)-(6,0)$) .. controls ($(b)+(vb)$) .. (b);

\tikzset{
  spath/split at intersections={higher}{lower},
  spath/get components of={higher}\higherPath,
  spath/get components of={lower}\lowerPath,
}

\draw[
  thick,
  spath/use=\getComponentOf\higherPath{1},
  spath/use={\getComponentOf\lowerPath{2},weld},
];

\end{tikzpicture}

\end{document} 

最终结果:

轮廓形状

交叉口细节:

交点细节

答案2

一个简单的方法是剪掉节点 (x) 下方的部分。存储两条曲线,以便能够使用它们两次,一个用于阴影,一个用于线条绘制。 两条曲线的轮廓

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc,intersections}

\begin{document}

    \begin{tikzpicture}
        \clip (-4,-1) rectangle (4,3);
        \coordinate (a) at (-4,-3);
        \coordinate (va) at (3,7.5);
        \coordinate (b) at (4,-5);
        \coordinate (vb) at (-3,7.5);
        
        \def\higherpath{(a) .. controls ($(a)+(va)$) .. ($(a)+(6,0)$)}
        \def\lowerpath{($(b)-(6,0)$) .. controls ($(b)+(vb)$) .. (b)}
                
        \shadedraw[name path=higher,opacity=.3] \higherpath;
        \shadedraw[name path=lower,opacity=.3] \lowerpath;
        
        \path [name intersections={of=higher and lower,by=x}];
                
        \clip (-4,-1) -- (-2,-1) -- (x) -- (2,-1) -- (3,-1) -- (3,3) -| cycle;
        \draw \higherpath \lowerpath;
    \end{tikzpicture}

\end{document}

相关内容