我想从特定位置开始绘制直线路径,然后在水平和垂直方向上规定增量。
我目前正在做这样的事情
\documentclass{独立} \usepackage{tikz} \开始{文档} \开始{tikzpicture} \draw [超厚] (20,12) -- (18,12); \draw [超厚] (18,12) -- (18,10); \draw [超厚] (18,10) -- (16,10); \draw [超厚] (16,10) -- (16,8); \draw [超厚] (16,8) -- (12,8); \draw [超厚] (12,8) -- (12,10); \draw [超厚] (12,10) -- (8,10); \draw [超厚] (8,10) -- (8,12); \draw [超厚] (8,12) -- (6,12); \draw [超厚] (6,12) -- (6,14); \draw [超厚] (6,14) -- (4,14); % ETC ... \结束{tikzpicture} \结束{文档}
但这要求我找到每个点,而更简单的是(对于我的特定情况)仅指示从一个点到下一个点的水平或垂直距离。
我尝试过这样的事情
\documentclass{独立} \usepackage{tikz} \开始{文档} \开始{tikzpicture} \节点(A)位于(20,12){}; \节点(B)位于(18,12){}; \节点(C)位于(18,10){}; \节点(D)位于(16,10){}; \绘制(A)|- ++(-2,0)-|(B); \绘制(B)|- ++(0,-2)-|(C); \绘制(C)|- ++(-2,0)-|(D); % ETC \结束{tikzpicture} \结束{文档}
看起来这++ (-2,0)
似乎是正确的,但是命名节点很繁琐,而且这并不能产生我想要的效果。
有没有办法用简单的符号来实现我的想法?比如
从 (20,12) 开始 向左走 2 个单位 下降 2 个单位 向左走 2 个单位 % ETC
又名 Etch-a-Sketch 风格?
答案1
\draw (20,12) -- ++(2,0) -- ++(0,2) -- ++(-3,0) -- ++(45:3);
在每个新的增量坐标之前使用++
,使其相对于上一个坐标,并将铅笔放在那里。
这是一个完整的例子:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\tikz\draw (20,12) -- ++(2,0) -- ++(0,2) -- ++(-3,0) -- ++(30:3) {[rounded corners=10pt]-- ++(5,0) -- ++(0,-6)} -- ++(-7,0) -- cycle;
\end{document}
当然,将其与 -| 或 |- 路径运算符结合起来可以进一步简化代码;以下两段代码产生相同的结果:
\tikz\draw (20,12) -- ++(2,0) -- ++(0,2) -- ++(3,0) -- ++(0,1) -- ++(1,0) -- ++(0,-3) -- ++(2,0);\par\bigskip
和
\tikz\draw (20,12) -| ++(2,2) -| ++(3,1) -- ++(1,0) |- ++(2,-3);
我认为在这种情况下定义命令不会增加任何东西;事实上,我认为它降低了现有语法(已经很简单)的功能。该示例表明,您可以使用极坐标等并在中途修改(最高 TikZ 限制)路径属性;即使当前问题不需要这样做,如果需要的话,能够进行此类修改也是一件好事。
答案2
不确定这是否是必需的,但这里有一种rectilinear
可以达到所需效果的装饰:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations}
\pgfdeclaredecoration{rectilinear}{start}{%
\state{start}[width=\pgfdecorationsegmentlength/2,
next state=draw above]{%
\pgfpathmoveto{\pgfpointorigin}%
\pgfcoordinate{@1}{\pgfpointorigin}%
}
\state{draw above}[width=\pgfdecorationsegmentlength/2,
next state=draw below]{%
\pgfcoordinate{@2}{\pgfpointorigin}%
\pgftransformreset%
\pgfpointanchor{@1}{center}\pgfgetlastxy\a\b%
\pgfpointanchor{@2}{center}\pgfgetlastxy\c\d%
\pgfpathlineto{\pgfqpoint{\a}{\d}}%
\pgfpathlineto{\pgfqpoint{\c}{\d}}%
\pgfnodealias{@1}{@2}%
}
\state{draw below}[width=\pgfdecorationsegmentlength/2,
next state=draw above]{%
\pgfcoordinate{@2}{\pgfpointorigin}%
\pgftransformreset%
\pgfpointanchor{@1}{center}\pgfgetlastxy\a\b%
\pgfpointanchor{@2}{center}\pgfgetlastxy\c\d%
\pgfpathlineto{\pgfqpoint{\c}{\b}}%
\pgfpathlineto{\pgfqpoint{\c}{\d}}%
\pgfnodealias{@1}{@2}%
}
\state{final}{%
\pgftransformreset%
\pgfpointanchor{@1}{center}\pgfgetlastxy\a\b%
\pgfpointdecoratedpathlast\pgfgetlastxy\c\d%
\pgfpathlineto{\pgfqpoint{\a}{\d}}%
\pgfpathlineto{\pgfqpoint{\c}{\d}}%
}
}
\tikzset{rectilinear/.style={
decoration={rectilinear, #1}, decorate
}}
\begin{document}
\begin{tikzpicture}[very thick, line join=round, line cap=round]
\draw [gray, postaction={rectilinear, draw=red}]
(0,4) -- ++(30:2) -- ++(300:3);
\draw [gray, postaction={rectilinear, draw=green!50!black}]
(0,2) circle [radius=1];
\draw [gray, postaction={rectilinear={segment length=0.25cm}, draw=blue}]
(0,0) -- (3,1) arc (90:-90:1) .. controls ++(180:1) and ++(225:1) .. cycle;
\end{tikzpicture}
\end{document}
答案3
这里有四个宏,,\Start
和来创建所需的路径。\Goleft
\Godown
\Goup
代码
\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{every node/.style={inner sep=0pt,minimum size=0pt}}
\newcommand{\Start}[1]{\node (A) at #1 {};}
\newcommand{\Goleft}[1]{\draw($(A)+( -0.5\pgflinewidth ,0.5\pgflinewidth)$)--+(#1,0)node(A){};}
\newcommand{\Godown}[1]{\draw($(A)+(-0.5\pgflinewidth,0)$)--+(0,-#1)node(A){};}
\newcommand{\Goup}[1]{\draw($(A)+(-0.5\pgflinewidth,0)$)--+(0,#1)node(A){};}
\begin{document}
\begin{tikzpicture}
\Start{(20,12)}
\Goleft{2}
\Godown{2}
\Goleft{3}
\Godown{1}
\Goleft{4}
\Goup{3}
\end{tikzpicture}
\end{document}
输出