有没有一种优雅的方式来绘制虚线,下面有白色实线?我问这个问题的原因是,我经常画很多多边形,它们共享一些虚线边。然而,无论每条线被画了多少次,我都希望所有线都有相同数量的点。这是一个最小的例子:
\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}
所以在这里你可以看到两个正方形有一条共用的边。我想避免共用边有明显更多的点。显然,我想要一个通用的解决方案,即仍然需要绘制两次相同的页面,但点不会累加。
答案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}