我有两条路径 — — 关键是,它们不是封闭的;我想只对它们之间的有界区域进行着色。尝试使用填充和剪辑来封闭路径时,我遇到了无法创建新的有界区域的问题。
我的路径只是一系列直线,因此我当然可以精确计算出需要填充的区域,但我想通过稍微移动两个区域来迭代此过程。更准确地说,我当前的代码给出了以下信息:
这不是我想要的。我来解释一下发生了什么。
我的两条路径中的一条是分区的外边界;另一条是外边界移位。因此,右下角的方块,外边界向左移动了一个方块,红色方块是这两条线之间的方块。向左或向上移动到图形,会分别将另一个边界向左或向上移动。
因此,底部的图片从右侧第三个位置开始就不正确了——大片红色区域实际上并不是分区的两个边界之间的边界,而是为了填充和剪切而试图封闭路径的产物。这是我在那个方块中的两条路径的样子:
我想要的正方形是这样的:
我的代码并不智能,也不是我的第一次尝试,但这是我手头上现有的:
\begin{tikzpicture}[scale=.1]
\foreach \x in {1,2,...,7}
\foreach \y in {0,1,...,5}
{
\begin{scope}[xshift=-10*\x cm, yshift=10*\y cm]
\draw[clip] (0,5)--(2,5)--(2,4)--(3,4)--(3,2)--(4,2)--(4,1)--(7,1)--(7,0)--(0,0)-- cycle;
\draw[fill=red] (0,5)--(2,5)--(2,4)--(3,4)--(3,2)--(4,2)--(4,1)--(7,1)--(7,0)--(0,0)--cycle;
\draw[fill=white] (-\x, \y + 20) |- ++(2,-15) |- ++(1,-1) |- ++(1,-2) |- ++(3,-1) |- ++(13,-1) -- ++(\x,-\y) -| ++(-13,1) -| ++(-3,1) -| ++(-1,2) -| ++(-1,1) -| ++(-2,15) -| ++(40,-40) -| (-\x, \y + 20);
\draw[very thin, gray] (0,0) grid (8,8);
\end{scope}
}
\end{tikzpicture}
答案1
这与您期望看到的匹配程度如何?我使用该intersections
库来查找两条路径的实际相交位置(注意:由于它们经常重叠,如果路径有曲线段,则此方法效果不佳,因为曲线段的算法会报告很多交叉点;直线的算法更简单,因此重叠仅报告重叠段的端点)。然后我们取其中的第一个和最后一个,由于路径是阶梯曲线,因此实际上位于路径之间的所有区域都在包含这两个交叉点的矩形中。因此,我们根据该矩形进行裁剪,然后根据曲线进行裁剪,然后填充该区域。
\documentclass{article}
%\url{http://tex.stackexchange.com/q/122516/86}
\usepackage{tikz}
\usetikzlibrary{intersections}
\newcommand\bdrypath{
(0,5) --(2,5)--(2,4)--(3,4)--(3,2)--(4,2)--(4,1)--(7,1)--(7,0)
}
\newcommand\ebdrypath{
(0,10) -- \bdrypath -- (14,0)
}
\newcommand\cbdrypath[1]{
\ebdrypath #1 (0,10)
}
\begin{document}
\begin{tikzpicture}[scale=.1]
\foreach \x in {1,2,...,7}
\foreach \y in {0,1,...,5}
{
\begin{scope}[xshift=-10*\x cm, yshift=10*\y cm]
\path[name path=bdry] \ebdrypath;
\path[name path=sbdry,xshift=-\x cm, yshift=\y cm] \ebdrypath;
\path[name intersections={of=bdry and sbdry, sort by=bdry, total=\n}] (intersection-1) coordinate (start) (intersection-\n) coordinate (end);
\begin{scope}
\clip (start) rectangle (end);
\clip \cbdrypath{-|};
\clip[xshift=-\x cm, yshift=\y cm] \cbdrypath{|-};
\fill[red] (0,0) rectangle (7,5);
\end{scope}
\begin{scope}
\clip \cbdrypath{-|};
\draw[very thin, gray] (0,0) grid (7,5);
\end{scope}
\draw \bdrypath -- (0,0) -- cycle;
\end{scope}
}
\end{tikzpicture}
\end{document}