![TikZ 中两个曲线区域并集的轮廓边界](https://linux22.com/image/434041/TikZ%20%E4%B8%AD%E4%B8%A4%E4%B8%AA%E6%9B%B2%E7%BA%BF%E5%8C%BA%E5%9F%9F%E5%B9%B6%E9%9B%86%E7%9A%84%E8%BD%AE%E5%BB%93%E8%BE%B9%E7%95%8C.png)
发现这里有几个问题显然与我想要的有关,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}