为什么有些线(红色的)画不出来?
以下是我的代码
\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}