在 Tikz 中绘制直线曲线,又称 Etch-a-Sketch 绘图

在 Tikz 中绘制直线曲线,又称 Etch-a-Sketch 绘图

我想从特定位置开始绘制直线路径,然后在水平和垂直方向上规定增量。

我目前正在做这样的事情

\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}

输出

在此处输入图片描述

相关内容