相交(剪切)区域周围的轮廓

相交(剪切)区域周围的轮廓

我想知道如何在 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 如果您还填充了第二个范围区域,这将影响第一个范围区域的边框。因此,我建议将其留空。

相关内容