我想知道如何在 Latex 中围绕裁剪的图形绘制 (可见) 轮廓。作为一个基本示例,请考虑一些基本维恩图,如下所示:
\begin{tikzpicture}
\begin{scope}
\clip (-1, 0) circle (1);
\fill[color=gray] (1, 0) circle (1.5);
\end{scope}
\end{tikzpicture}
这应该会产生下面的图片:
如您所见,它仅显示两个圆的相交区域。我还想绘制它的轮廓(即限制剪切区域的边界)。PS 我不在乎圆的轮廓。我可以随时添加它们。
我尝试过\填充绘制代替\充满,但什么都没改变。你知道我该怎么办吗?任何解决方案,不一定涉及范围环境,就足够了。
答案1
主要问题是所有弧线例程都使用角度而不是 x,y 位置,因此必须使用 计算起始角度和终止角度atan2
。
您可以在范围内绘制边框,但它会被剪裁并显得更细(一半在里面,一半在外面)。
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\path[clip, name path=myclip] (-1, 0) circle (1);
\path[fill=gray, draw=black, name path=myfill] (1, 0) circle (1.5);
\path[name intersections={of=myclip and myfill}];
\end{scope}
\path (intersection-1);% compute angles
\pgfgetlastxy{\xa}{\ya}%
\path (intersection-2);
\pgfgetlastxy{\xb}{\yb}%
\path (-1,0);% center
\pgfgetlastxy{\xc}{\yc}%
\pgfmathsetmacro{\mystartangle}{atan2((\ya-\yc),(\xa-\xc))}%
\pgfmathsetmacro{\myendangle}{atan2((\yb-\yc),(\xb-\xc))}%
\draw (intersection-1) arc[start angle=\mystartangle, end angle=\myendangle, radius=1];
\end{tikzpicture}
\end{document}
答案2
解决这个问题的一个手动方法是使用两个(或多个组件)范围环境。使用第一个环境绘制由裁剪图形 + 填充组成的轮廓部分。然后切换裁剪器和裁剪图形的角色并绘制其余轮廓(不带填充)。例如:
\begin{tikzpicture}
\begin{scope} % draws the contour from the right circle
\clip (-1, 0) circle (1); % clipper = left circle
\draw[black, fill=gray] (1, 0) circle (1.5); % clipped = right circle
\end{scope}
\begin{scope} % draws the contour from the left circle
\clip (1, 0) circle (1.5); % clipper = right circle
\draw[black] (-1, 0) circle (1); % clipped = left circle
\end{scope}
\end{tikzpicture}
结果如下:
显然,这是一种低水平的编程技巧,但至少它能起作用。可能有一个编写良好的操作,可以实现相同的功能,而无需冗余代码。
PS 如果您还填充了第二个范围区域,这将影响第一个范围区域的边框。因此,我建议将其留空。