为什么 \foreach 不能正常工作?

为什么 \foreach 不能正常工作?

为什么有些线(红色的)画不出来?

在此处输入图片描述

以下是我的代码

\documentclass[tikz,border=5pt]{standalone}
\begin{document}
\begin{tikzpicture}
\clip  (0,0) rectangle (10.8,7.2);
\draw  (0,0) rectangle (10.8,7.2);
 \foreach \x in {-0.8,1,...,10.9}
 \foreach \y in {0.2,2,...,7.4}
  \draw  (\x ,\y)  --(\x+0.9 ,\y);
\foreach \l in {0.6,2.4,...,9.6}
   \foreach \m in {-0.2,1.6,...,8.8}
    \draw (\l,\m) -- (\l,\m+0.9);
     \foreach \x in {0.1,1.9,...,9.1}
 \foreach \y in {1.1,2.9,...,6.5}
  \draw  (\x ,\y)  --(\x+0.9 ,\y);
\foreach \l in {1.5,3.3,...,10.5}
   \foreach \m in {0.7,2.5,...,6.1}
    \draw(\l,\m) -- (\l,\m+0.9);
\end{tikzpicture}
\end{document} 

另一个问题:有没有更简单\更好的方法来绘制这些线条?

答案1

您应该考虑舍入误差。因此将最后一个值稍微放大一点,例如放大到 10.51。

除此之外,我会使用整数表示步骤,然后计算值。例如,对于最后一个步骤:

\foreach \l in {1,2,...,6} %
   \foreach \m in {0,1,...,3} %
    \draw(1.5+1.8*\l,0.7+1.8*\m) -- (1.5+1.8*\l,0.7+1.8*\m+0.9);

答案2

绘制此类图案的另一种方法,仅使用两个嵌套循环。

\documentclass[tikz,border=5pt]{standalone}
\begin{document}
\begin{tikzpicture}
\clip  (0,0) rectangle (10.8,7.2);
\draw  (0,0) rectangle (10.8,7.2);

\newcommand\dx{0.9} % horizontal distance between the line centers
\newcommand\dy{0.9} % vertical distance between the line centers
\pgfmathsetmacro\lx{\dx/2} % half length of horizontal line
\pgfmathsetmacro\ly{\dy/2} % half length of vertical line

\foreach \x in {-2,...,15} {
   \foreach \y in {-1,...,9} {
     \pgfmathsetmacro\ifhoriz{ifthenelse((-1)^(\x+\y)<0,0,1)}
     \ifnum \ifhoriz=0
       \draw (\x*\dx-\lx,\y*\dy) -- (\x*\dx+\lx,\y*\dy);
     \else
       \draw (\x*\dx,\y*\dy-\ly) -- (\x*\dx,\y*\dy+\ly);
    \fi
}}
\end{tikzpicture}
\end{document} 

或者,如果 x 和 y 的间距和行长始终相同,则可以使用单个\draw

\documentclass[tikz,border=5pt]{standalone}
\begin{document}
\begin{tikzpicture}
\clip  (0,0) rectangle (10.8,7.2);
\draw  (0,0) rectangle (10.8,7.2);

\newcommand\dx{0.9} % distance between center of lines in pattern
\pgfmathsetmacro\lx{\dx/2} % half length of lines in pattern

\foreach \x in {-2,...,15} {
   \foreach \y in {-1,...,9} {
       \draw [rotate around={ifthenelse((-1)^(\x+\y)<0,0,90):(\x*\dx,\y*\dx)}]
            (\x*\dx-\lx,\y*\dx) -- (\x*\dx+\lx,\y*\dx);
}}
\end{tikzpicture}
\end{document} 

在这两种情况下,我都没有在循环中使用显式的 x 和 y 值,而是像 Ulrike 在她的回答中那样使用整数。为了决定是画一条水平线还是垂直线,我计算了(-1)^(\x+\y),其中\x\y是整数。如果你写出这些值的矩阵,它将看起来像

y\x  |  1  2  3  4  5
---------------------
1    |  1 -1  1 -1  1 
2    | -1  1 -1  1 -1
3    |  1 -1  1 -1  1
4    | -1  1 -1  1 -1

因此,沿着两个轴,每隔一个 1 和 -1。

在第一种情况下,我使用ifthenelse((-1)^(\x+\y)<0,0,1)将宏设置\ifhoriz为 0 或 1,然后\ifnum如果为 0,我使用它绘制一条水平线\ifhoriz,如果为 1,我使用它绘制一条垂直线。

在第二种情况下,我画了一条水平线,但我使用类似的ifthenelse语句将线旋转 0 度或 90 度。

答案3

\foreach你可以使用新定义的pattern

\documentclass[tikz,border=2mm]{standalone} 
\usetikzlibrary{positioning, patterns}

\tikzset{
    hatch thickness/.store in=\hatchthickness,
    hatch thickness=1pt
    }

\makeatletter
\pgfdeclarepatternformonly[\hatchthickness]{myhatch}
{\pgfpointorigin}{\pgfpoint{18mm}{18mm}}
{\pgfpoint{18mm}{18mm}}
{
    \pgfsetcolor{\tikz@pattern@color}
    \pgfsetlinewidth{\hatchthickness}
    \pgfpathmoveto{\pgfpoint{0mm}{4.5mm}}
    \pgfpathlineto{\pgfpoint{9mm}{4.5mm}}
    \pgfpathmoveto{\pgfpoint{9mm}{13.5mm}}
    \pgfpathlineto{\pgfpoint{18mm}{13.5mm}}
    \pgfpathmoveto{\pgfpoint{4.5mm}{9mm}}
    \pgfpathlineto{\pgfpoint{4.5mm}{18mm}}
    \pgfpathmoveto{\pgfpoint{13.5mm}{0mm}}
    \pgfpathlineto{\pgfpoint{13.5mm}{9mm}}
    \pgfusepath{stroke}
}
\makeatother

\begin{document}
\begin{tikzpicture}
\filldraw[pattern=myhatch, pattern color=red] (0,0) rectangle (10.8,7.2);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容