合并 tikz 路径

合并 tikz 路径

我有两条用于剪切的路径。有没有办法将这两条路径合并起来?我希望第二条剪切路径能够剪切第一条路径,这样我就可以创建更复杂的形状。

例如,(注意这只是一个简单的例子,用来表达一般情况的具体实例)

\fbox{\begin{tikzpicture}
\begin{scope}
\clip (-0.8, -0.8) rectangle (0.8,0.8) (0,0) circle (1);
\fill[color=black] (-10, -10) rectangle (10,10);
\end{scope}
\end{tikzpicture}}

它将是一个内部矩形,其角被圆圈剪掉:

在此处输入图片描述

但我想填充所有单独路径的内部(例如,我想取路径的交点或对路径进行某种代数运算)。

答案1

给你。再次特别感谢布兰登·库岑斯基让我arrayjobx意识到这个答案

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usepackage{arrayjobx}

\newcommand{\multiclip}[3]{% number of clippings, clipping commands (connect with &), draw commands
\newarray\temp%
\readarray{temp}{#2}%
\foreach \x in {1,...,#1}%
{ \begin{scope}%
        \pgfmathtruncatemacro{\xt}{\x}%
        \temp(\xt)%
        #3%
    \end{scope}%
}%
\delarray\temp%
}

\begin{document}

\fbox{\begin{tikzpicture}
    \multiclip{2}{\clip (-0.8, -0.8) rectangle (0.8,0.8);&\clip (0,0) circle (1);}{\fill[color=red](-10,-10)rectangle(10,10);}
\end{tikzpicture}}

\fbox{\begin{tikzpicture}
    \multiclip{5}{\clip(-1,-1)circle(0.8); &\clip(-1,1)circle(0.8); &\clip(1,-1)circle(0.8); &\clip(1,1)circle(0.8); &\clip(0,0)circle(0.8);}{\fill[color=red](-10,-10)rectangle(10,10); \draw(-5,-5)-- (5,5); \draw(-1,-1)rectangle(1,1);}
\end{tikzpicture}}

\end{document}

该命令\multiclip接受三个参数:

  • 要剪辑的区域数
  • 剪辑的命令(您必须指定整个命令,例如\clip (0,0) circle (1);。原则上,可以将代码更改为\clip \temp(\xt);这样就只需编写(0,0) circle (1)。但在前一种变体中,您可以决定执行例如draw某些剪辑区域)。单个命令必须通过 连接起来&
  • 所有剪切区域中将出现的绘图命令。

在此处输入图片描述


编辑1:对于交叉剪辑,您可以使用嵌套范围和剪辑命令并将绘制命令放入最内层范围,或者您可以简单地连续给出剪辑命令。但是,在任何情况下,边界框都是僵硬的。我构建了一个有 5 个重叠圆圈的示例。手动完成时会产生较大的边界框。但是,通过宏完成时,边界框是最大的,例如在您的示例中,由 引起的 20 x 20 的框\fill (-10,-10) -- (10,10);。我不知道为什么会发生这种情况,但您可以通过使用\useasboundingbox之前来修复它。以下是最终命令\unionclip\intersectionclip

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usepackage{arrayjobx}
\usepackage{xifthen}

\newcommand{\unionclip}[3]{% number of clippings, clipping commands (connect with &), draw commands
\newarray\temp%
\readarray{temp}{#2}%
\foreach \x in {1,...,#1}%
{ \begin{scope}%
        \pgfmathtruncatemacro{\xt}{\x}%
        \temp(\xt)%
        #3%
    \end{scope}%
}%
\delarray\temp%
}

\newcommand{\intersectionclip}[3]{% number of clippings, clipping commands (connect with &), draw commands
\newarray\temp%
\readarray{temp}{#2}%
%\begin{scope}%
\foreach \x in {1,...,#1}%
{   \pgfmathtruncatemacro{\xt}{\x}%
    \temp(\xt)%
}
#3%
%\end{scope}%
\delarray\temp%
}

\begin{document}

\fbox{\begin{tikzpicture}
    \unionclip{2}
                        {\clip (-0.8, -0.8) rectangle (0.8,0.8);&
                         \clip (0,0) circle (1);}
                        {\fill[color=green](-10,-10)rectangle(10,10);}
\end{tikzpicture}}
\fbox{\begin{tikzpicture}
    \unionclip{5}
                        {\clip(-1,-1)circle(0.8);&
                         \clip(-1,1)circle(0.8);&
                         \clip(1,-1)circle(0.8);&
                         \clip(1,1)circle(0.8);&
                         \clip(0,0)circle(0.8);}
                        {\fill[color=green](-10,-10)rectangle(10,10);
                         \draw[thick](-5,-5)-- (5,5);
                         \draw[densely dashed,ultra thick](-1,-1)rectangle(1,1);}
\end{tikzpicture}}

\begin{tikzpicture}
\draw[fill=green,fill opacity=0.25](-1,-1)circle(2.5);
\draw[fill=green,fill opacity=0.25](-1,1)circle(2.5);
\draw[fill=green,fill opacity=0.25](1,-1)circle(2.5);
\draw[fill=green,fill opacity=0.25](1,1)circle(2.5);
\draw[fill=green,fill opacity=0.25](0,0)circle(2.5);
\draw[densely dashed,ultra thick](-1,-1)rectangle(1,1);
\end{tikzpicture}

\fbox{
\begin{tikzpicture}
\clip(-1,-1)circle(2.5);
\clip(-1,1)circle(2.5);
\clip(1,-1)circle(2.5);
\clip(1,1)circle(2.5);
\clip(0,0)circle(2.5);
    \fill[color=green](-10,-10)rectangle(10,10);
    \draw[densely dashed,ultra thick](-1,-1)rectangle(1,1);
\end{tikzpicture}}

\fbox{\begin{tikzpicture}
    \useasboundingbox (-1.5,-1.5) rectangle (1.5,1.5);  
    \intersectionclip{2}
                        {\clip (-0.8, -0.8) rectangle (0.8,0.8);&
                         \clip (0,0) circle (1);}
                        {\fill[color=green](-10,-10)rectangle(10,10);}
\end{tikzpicture}}
\fbox{\begin{tikzpicture}
    \useasboundingbox (-1.5,-1.5) rectangle (1.5,1.5);  
    \intersectionclip{5}
                        {\clip(-1,-1)circle(2.5);&
                         \clip(-1,1)circle(2.5);&
                         \clip(1,-1)circle(2.5);&
                         \clip(1,1)circle(2.5);&
                         \clip(0,0)circle(2.5);}
                        {\fill[color=green](-10,-10)rectangle(10,10);
                         \draw[densely dashed,ultra thick](-1,-1)rectangle(1,1);}
\end{tikzpicture}}

\end{document}

在此处输入图片描述

相关内容