带有白色背景的虚线

带有白色背景的虚线

有没有一种优雅的方式来绘制虚线,下面有白色实线?我问这个问题的原因是,我经常画很多多边形,它们共享一些虚线边。然而,无论每条线被画了多少次,我都希望所有线都有相同数量的点。这是一个最小的例子:

\documentclass{article}
\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}
        \draw [dotted]
            (0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle
            (1,0) -- (2,0) -- (2,1) -- (1,1) -- cycle
        ;
    \end{tikzpicture}
\end{document}

enter image description here

所以在这里你可以看到两个正方形有一条共用的边。我想避免共用边有明显更多的点。显然,我想要一个通用的解决方案,即仍然需要绘制两次相同的页面,但点不会累加。

答案1

两个段之间的公共部分需要与段的起点保持相同的距离(即最近的搬去):

\draw [dotted] 
  (0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle
  (2,0) -- (1,0) -- (1,1) -- (2,1) -- cycle;

这里,部件(1,0) -- (1,1)位于同一位置,并在最近移动到的位置之后开始一个单元((0,0)(2,0)位于线路起点的)。

但是如果有很多矩形,这会很快变得混乱,但你可以分别绘制每一边,每条水平线从左到右,每条垂直线从下到上:

\draw [dotted]
  foreach \x in {0, ..., 2} {
    foreach \y in {0, ..., 1} {
      [shift={(\x, \y)}]
        (0,0) --  (1,0) (0,0) --  (0,1)
        (0,1) -- +(1,0) (1,0) -- +(0,1)
    }
  };

也许更好的方法是定义一个dash pattern它有一个相位,可以很好地增加边的长度。

由于您使用的长度1,即1cm默认的坐标坐标系,你可以使用

dash pattern = on \pgflinewidth off .66667mm-\pgflinewidth,
dash phase   = .5\pgflinewidth
% or:
dash         = on \pgflinewidth off .66667mm-\pgflinewidth phase .5\pgflinewidth

这意味着该线有一个方点(on \pgflinewidth),下一个方点从 0.66667 毫米之后开始。

由于\pgflinewidth不是适合公制坐标系的好数字,我们\pgflinewidth再次减去 ,这意味着只.66667mm需要适合 1 厘米(它符合 150 次)
dash phase是需要的,以便点从路径的起点处的中心开始。

现在您可以简单地rectangle再次使用路径操作(甚至是指定角落的版本):

\draw[
  dash pattern=on \pgflinewidth off 1mm-\pgflinewidth,
  dash phase=.5\pgflinewidth
] foreach \x in {0, ..., 2} {
    foreach \y in {0, ..., 1} {
      (\x, \y) rectangle + (1,1)    
    }
  };

如果您更改坐标系,则需要调整此值(或者我们需要编写一个特殊的键来为您完成此操作,但这有点数学)。

由于忽略了线宽,因此它也不能很好地与线宽匹配.66667mm。因此,如果线宽接近此值,点之间的间距就会变小。(这就是我1mm在下面的示例中使用的原因,因为thick使用了。)


我还添加了一个例子grid手术(它只绘制不重叠的直线)——看起来不太好看,因为图案不适合坐标系,但它不会在彼此之上绘制多条线。(当然,您可以使用与上面类似的虚线设置,使其再次整齐排列)。

第四个例子沿着网格的路径放置矩形,这使得奇怪的坐标坐标系,尽管需要一点工作来旋转它们以便它看起来像一个虚线图案。

我把所有的例子都放在了一起,\matrix以便于在一个图表中展示它们。

代码

\documentclass[tikz]{standalone}
\begin{document}
\tikz[thick]\matrix[row sep=5mm, column sep=5mm]{
\draw [dotted] 
  (0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle
  (2,0) -- (1,0) -- (1,1) -- (2,1) -- cycle;
&
\draw [dotted]
  foreach \x in {0, ..., 2} {
    foreach \y in {0, ..., 1} {
      [shift={(\x, \y)}]
        (0,0) --  (1,0) (0,0) --  (0,1)
        (0,1) -- +(1,0) (1,0) -- +(0,1)
    }
  };
\\
\draw[
  dash pattern=on \pgflinewidth off 1mm-\pgflinewidth,
  dash phase=.5\pgflinewidth
] foreach \x in {0, ..., 2} {
    foreach \y in {0, ..., 1} {
      (\x, \y) rectangle + (1,1)    
    }
  };
&
\draw [dotted] (0,0) grid (3,2);
\\
\fill[x=(30:.5cm), y=(70:.7777cm)]
  foreach \x in {0, ..., 2} {
    foreach \y in {0, ..., 1} {
      [shift={(\x, \y)}]
      foreach \X in {0, ..., 9} {
        foreach \xy/\yx/\v in {x/y/0, y/x/0, x/y/1, y/x/1} {
          ([shift={(-.5\pgflinewidth,-.5\pgflinewidth)}]xyz cs: \xy=\X/10,\yx=\v)
            rectangle + (\pgflinewidth, \pgflinewidth)
        }
      }
    }
  };
\\};
\end{document}

输出

enter image description here

相关内容