给定 Latex 中的一条任意路径,例如用 Tikz 绘制,我想用一条与原始路径有固定距离的更大路径包围这条路径,例如 1 厘米。
请注意,这实际上只是一个草图,在草图中,外部路径到内部路径的距离不是恒定的,尽管它应该是恒定的。我读到我的问题的术语是“偏移”,但我找不到如何实现它。
我目前没有此草图的 Latex 代码。您还可以考虑用一个更大的矩形包围一个矩形作为简单示例 - 重要的是,外部路径是使用通用代码生成的,可以应用于任何路径。
其预期用途是绘制缝纫图案,然后外部路径标记接缝余量。
更新
以下是原始路径的最小工作示例:
\pagestyle{empty}
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% I know this could be drawn with a single
% use of \draw, but in reality my figures
% will be more complicated and will also be created
% using multiple \draw calls.
\draw (0,3) -- (2,7) -- (4,3);
\draw (4,3) -- (3,0) -- (1,0) -- (0,3);
\end{tikzpicture}
\end{document}
此代码导致
如何根据要求添加周围路径,而无需再次手动绘制相同的图形,只是更大(使用手动计算的坐标)?
我也想稍微限制一下我的问题:任意路径太笼统了,我无法用语言描述它,但我要绘制的东西不会太复杂。此提供的路径示例的通用方法应该适用于我将要绘制的其他路径。
答案1
这是一个带有clip
和的解决方案double distance
(受到 cfr 答案下方的评论的启发):
- 尊重路径的原始距离(黑色曲线)。
- 有角度和曲线的路径均可使用。
- 可以使用距离/颜色列表来绘制多个接缝余量。
该invclip
操作来自如何在 TikZ 中反转“剪辑”选择?。
关于线宽的注意事项:原始路径是内部裁剪的,因此其宽度比预期的要窄一半。要使所有曲线具有相同的宽度,您必须为接缝余量选择一个宽度(line width=1mm
在我的示例中),并为原始路径选择一个两倍的宽度(line width=2mm
在我的示例中)。
\documentclass[tikz,border=3cm]{standalone}
\tikzset{%
draw seam allowance/.style 2 args={
preaction={line width=1mm,line join=round,double distance=#1*2,draw=#2},
},
seam allowances/.style={%
preaction={clip},
preaction={draw seam allowance/.list={#1}},
draw,%fill=white,
},
seam allowances/.default={{{2cm}{blue}}},
invclip/.style={
clip,
insert path={
{[reset cm] (-16000pt,-16000pt) -| (16000pt,16000pt) -| cycle}
},
},
}
\begin{document}
\begin{tikzpicture}
\def\mypath{
(0,30) -- (20,50) -- (40,30) to[out=-180,in=130] (30,0)
-- (10,0) arc(-90:-180:5cm) to[out=90,in=-45] (3,27) -- cycle
}
\begin{scope}
\begin{pgfinterruptboundingbox}
\path [invclip] \mypath;
\end{pgfinterruptboundingbox}
\draw [seam allowances={{4cm}{red},{3cm}{red},{2cm}{blue},{1cm}{blue}},line width=2mm]
\mypath ;
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}
\def\mypath{
(0,0) -- (-10,10) -- (0,20) -- (10,10) -- cycle
(0,0) -- (10,-10) -- (0,-20) -- (-10,-10) -- cycle
}
\begin{scope}
\begin{pgfinterruptboundingbox}
\path [invclip] \mypath;
\end{pgfinterruptboundingbox}
\draw [line width=2mm,seam allowances={{4cm}{red},{3cm}{orange},{2cm}{blue},{1cm}{green}}]
\mypath ;
\end{scope}
\end{tikzpicture}
\end{document}
答案2
这是一个非常简单的解决方案,它只用于double
绘制路径。我们定义一个样式seam
,它实际上只是用于double
绘制线条,但具有语义名称。可以seam allowance
根据需要设置。默认情况下,这里设置为2.5pt
。
\tikzset{%
seam/.style={%
double distance=\seamallowance,
draw,
},
seam allowance/.store in=\seamallowance,
seam allowance=2.5pt,
}
将其应用到示例中,结果如下所示:
请注意,路径连接处有间隙。实际上,如果路径不是连续绘制的,您将很难获得整齐的连接。在这种情况下,您需要使用cycle
。
编辑
cycle
如果要将带有 s 的事物组合在一起,则不能使用plot
,但在大多数情况下这可能无关紧要。下面是一个例子,它以与其他情况相同的方式开始,但随后使用绘图,最后在起点结束。绘制的第一个坐标是绘图之前给出的最后一个坐标,最后绘制的坐标是第一个给出的坐标。
这里有微小的缝隙,但这真的很重要吗?考虑到上下文,我猜不重要。因此,修复它可能不值得额外的麻烦和开销。如果不把碎片剪下来并钉在布上,情况就会有所不同,值得这么做。然而,对于这种用途,我会选择更简单的解决方案。(毕竟,缝隙只会很小。)
虽然可能存在一些极端情况,你可能会遇到一些奇怪的事情,但我认为考虑到用例,这可能是非常特殊的。一般来说,衣服是由形状相当规则的碎片构成的。(人们不希望胸部缝合处有奇异之处。)
当然,我对此不作任何保证。如果你最终因为我的代码而衣衫褴褛,那你就只能自己去拼凑了。
\documentclass[tikz,border=10pt,multi]{standalone}
\begin{document}
\tikzset{%
seam/.style={%
double distance=\seamallowance,
draw,
},
seam allowance/.store in=\seamallowance,
seam allowance=2.5pt,
}
\begin{tikzpicture}
\draw [seam] (0,3) -- (2,7) -- (4,3);
\draw [seam] (4,3) -- (3,0) -- (1,0) -- (0,3);
\end{tikzpicture}
\begin{tikzpicture}
\draw [seam] (0,3) -- (2,7) -- (4,3) -- (4,3) -- (3,0) -- (1,0) -- cycle;
\end{tikzpicture}
\begin{tikzpicture}
\draw [seam] (0,3) -- (2,7) -- (4,3) plot [smooth] coordinates { (4,3) (3,-2) (-2,0) (0,3) };
\end{tikzpicture}
\end{document}