如何绘制曲线路径

如何绘制曲线路径

我正在尝试制作这张图片:

我在绘制弯曲路径时遇到了问题。

平均能量损失

\documentclass[scale=0.5,border=12pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usepackage{lmodern}
\usetkzobj{all} 
\usetikzlibrary{shapes.geometric,arrows,positioning,fit,calc,backgrounds}

\usepackage{hyperref}

\tikzset{
   b/.style={
       draw,
       rectangle,
       rounded corners=2ex,
       minimum height=0.2cm,
       minimum width=1in,
       align=center,
       font=\small},
   c/.style={
      draw,
      rectangle,
      rounded corners=2ex,
      minimum height=0.5in,
      minimum width=2in,
      align=center,
      rotate=-90,
      font=\large},
   ar/.style={
      rounded corners=2ex,
      ->,
      >=latex},  
   myarrow/.style args={#1 colored by #2 and #3}{
      -stealth,
      line width=#1,
      #2,
      postaction={draw,-stealth,#3,line width=(#1)/3,
      shorten <=(#1)/3,
      shorten >=2*(#1)/3}, 
      },
   toptext/.style={    % <-- New
      above,
      text width=6cm,
      align=center,
      font=\large}
}

\begin{document}
\begin{tikzpicture} 
\node (string) [b] {string};
\node (number) [b, below=0.3 cm of string] {number};
\node (object) [b, below=0.3 cm of number] {object};
\node (array) [b, below=0.3 cm of object] {array};
\node (true) [b, below=0.3 cm of array] {true};
\node (false) [b, below=0.3 cm of true] {false};
\node (null) [b, below=0.3 cm of false] {null};

\draw  (string.west) -- ++(-70pt,0pt);
\draw  (string.east) -- ++(70pt,0pt);

\end{tikzpicture}

\end{document}

答案1

一些想法:

  1. 定义名为left和的坐标right(例如),其中包含曲线在节点两侧开始和结束的坐标(string)。例如:

    \coordinate (left) at ($(string.west)+(-20pt,0pt)$);
    \coordinate (right) at ($(string.east)+(20pt,0pt)$);
    
  2. (left) -- +(2ex,0) |- (number)例如,使用语法在名为 的点left、其右侧的另一个点 2ex 之间绘制一条折线,然后绘制一条 L 形线,该线向下延伸至名为 的节点级别number,最后到达该节点。技巧是使用 来进行rounded corners=2ex此折线,以便半径等于到第二点的距离。

  3. 类似地,右侧的曲线用(number) -| ($(right)+(-2ex,0)$) -- +(right)

  4. 事实上,这两个部分可以组合在一个\draw命令中,除非你想要前半部分使用箭头,而后半部分不使用它。

  5. 以上所有操作都必须针对下方的每个节点完成(string),因此可以轻松地在循环中进行迭代。

因此代码如下:

\coordinate (left) at ($(string.west)+(-20pt,0pt)$);
\coordinate (right) at ($(string.east)+(20pt,0pt)$);

\draw  ($(left) +(-30pt, 0)$) -- (string);
\draw  (string.east) -- ($(right) + (30pt,0)$);

\foreach \token in {number, object, array, true, false, null} {
    \draw[rounded corners=2ex] (left) -- +(2ex,0) |- (\token) -| ($(right)+(-2ex,0)$) -- (right);    
}

制作:

结果

笔记:其余代码未显示,因为与您提供的代码相同,只是我更改了rounded corners=1ex(而不是 2ex)b/.style。使用 2ex 会导致一些瑕疵,因为这个半径大于框高度的一半。

相关内容