我正在尝试制作这张图片:
我在绘制弯曲路径时遇到了问题。
平均能量损失
\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
一些想法:
定义名为
left
和的坐标right
(例如),其中包含曲线在节点两侧开始和结束的坐标(string)
。例如:\coordinate (left) at ($(string.west)+(-20pt,0pt)$); \coordinate (right) at ($(string.east)+(20pt,0pt)$);
(left) -- +(2ex,0) |- (number)
例如,使用语法在名为 的点left
、其右侧的另一个点 2ex 之间绘制一条折线,然后绘制一条 L 形线,该线向下延伸至名为 的节点级别number
,最后到达该节点。技巧是使用 来进行rounded corners=2ex
此折线,以便半径等于到第二点的距离。类似地,右侧的曲线用
(number) -| ($(right)+(-2ex,0)$) -- +(right)
事实上,这两个部分可以组合在一个
\draw
命令中,除非你想要前半部分使用箭头,而后半部分不使用它。以上所有操作都必须针对下方的每个节点完成
(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 会导致一些瑕疵,因为这个半径大于框高度的一半。