如何像图形样式一样在 TikZ 中基于一系列点创建循环?

如何像图形样式一样在 TikZ 中基于一系列点创建循环?

我目前正在开展一个项目,旨在创建一个翻译器Frank Drewes 的图表风格进入 TikZ。

举个例子,我尝试将下图从图形样式手册重新创建为 TikZ 图。

(看图形样式图示例

在此处输入图片描述

上述代码的图形样式如下:

\begin{graph}(4,4)(-2,0)
\squarenode{Sq}(-1.5,3.5)
\textnode{Te}(1.5,3.5){abc}
\roundnode{Ro}(0,.5)
\diredge{Sq}{Te}
\edge{Sq}{Ro} \diredge{Ro}{Te}
\dirbow{Ro}{Sq}{-.2}
\dirbow{Ro}{Te}{.2}
\dirloopedge{Ro}(-.8,-.2)(-1.2,.4)
\dirloopedge{Ro}(.8,-.2)(1.2,.4)
\loopedge{Ro}{15}(0,-.5)
\end{graph}

大多数命令都很容易翻译;然而,我在使用“loopedge”和“dirloopedge”命令时遇到了很多麻烦。

手册中对“loopedge”命令的描述如下:

\loopedge{名称}(x1,y1)(x2,y2)

节点 name 处的循环。坐标 (x1,y1) 和 (x2,y2) 被解释为以 name 为起点的两个边的端点的相对坐标。在绘制过程中,它们通过曲线连接起来以获得循环。

TikZ 中似乎没有这样的命令,事实上,绘制循环似乎真的很难。图形样式手册中缺少关于连接曲线实际生成方式的文档,这进一步加剧了我的问题。

谁能帮我?

答案1

我不确定具体用什么方法获得绘制的曲线\dirloopedge(出于某种原因,您示例中的不对称支撑点似乎产生了对称曲线)。下面是一个与“图形样式”中的形式相同的宏。

它从起始节点到第一个支撑点绘制一条直线,从第二个支撑曲线到起始节点绘制一条直线,两个支撑点之间的曲线的outin角度等于直线段的角度。您可能需要调整looseness确定曲线半径的参数。

\documentclass{article}
\usepackage{tikz}

\def\dirloopedge#1(#2,#3)(#4,#5){
    \pgfpointxy{#2}{#3}
    \pgfgetlastxy{\ax}{\ay}
    \pgfmathsetmacro\outangle{atan2(#2,#3)}
    \pgfmathsetmacro\inangle{atan2(#4,#5)}

    \draw [-latex] (#1) -- +(#2,#3) to [out=\outangle,in=\inangle,looseness=5]  +(#4,#5) -- (Ro);
}


\begin{document}
\begin{tikzpicture}

\node (Ro)  at (0,0.5) [fill,circle,inner sep=2pt] {};

\dirloopedge{Ro}(0.8,-0.2)(0.8,0.2)

\end{tikzpicture}
\end{document}

dirloopedge 与 TikZ

相关内容