在 tikz 中更改循环大小和形状

在 tikz 中更改循环大小和形状

我想让圆圈周围的小环(上面的环)变得更圆、更漂亮。

下面是我的代码的一个简短示例:

 \documentclass{scrbook}
 \usepackage{tikz}
 \usetikzlibrary{positioning,automata}
 \begin{document}

 \begin{tikzpicture}[shorten >=1pt,auto]
   \tikzstyle{place}=[circle,thick,draw=blue!75,fill=blue!20,minimum
                      size=6mm]
   \node[place] (foo) [label=above left:Foo] {$1$};
   \path[->] (foo) edge  [loop above] node {1} ();
  \end{tikzpicture}
 \end{document}

上一个代码示例

答案1

您可以使用四个参数来调整loop大小和形状。您可以设置inout角度,以及循环的最小长度及其looseness。有关更多详细信息,请参阅 TikZ 文档的第 50.4 节:

\documentclass{scrbook}
\usepackage{tikz}
\usetikzlibrary{positioning,automata}
\begin{document}

\tikzset{every loop/.style={min distance=10mm,in=0,out=60,looseness=10}}
\tikzset{place/.style={circle,thick,draw=blue!75,fill=blue!20,minimum
                      size=6mm}}
\begin{tikzpicture}[shorten >=1pt,auto]   
   \node[place] (foo) [label=above left:Foo] {$1$};
   \path[->] (foo) edge  [loop above] node {1} ();
  \end{tikzpicture}
\end{document}

代码输出

在这个例子中,我习惯\tikzset全局设置它们;您也可以.style为个体添加规范tikzpicture或为单个循环设置参数。

可以使用节点样式中的键来设置标签距离label distance。要将标签移近节点,请使用负值。对于此示例,这-3pt似乎效果很好。似乎没有办法为单个节点设置此键。因此,您可以

答案2

不久前,我尝试创建一个类似圆形的循环(确切地说是圆弧,但更圆一些,更美观一些)。我没有找到简单的方法来做到这一点,但这是我为此类循环编写的代码。

第一个代码:我只使用了 TikZ,但我使用经验法来计算一些长度。宏\tikzAngleOfLine给了我一条线的角度。如果\AngleEnd大于,\AngleSart就会出现问题。在第二个代码示例中,我给出了解决方案。

\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc} 

\newcommand{\tikzAngleOfLine}{\tikz@AngleOfLine}
\def\tikz@AngleOfLine(#1)(#2)#3{%
\pgfmathanglebetweenpoints{%
\pgfpointanchor{#1}{center}}{%
\pgfpointanchor{#2}{center}}
\pgfmathsetmacro{#3}{\pgfmathresult}%
}

\begin{document} 

\begin{tikzpicture}[scale=1.5,>=stealth']
\node [circle,draw,minimum size=2cm](A) {first node};
\node [circle,minimum size=3cm](B) at ([{shift=(60:1)}]A){};
\coordinate  (C) at (intersection 2 of A and B);
\coordinate  (D) at (intersection 1 of A and B);
 \tikzAngleOfLine(B)(D){\AngleStart}
 \tikzAngleOfLine(B)(C){\AngleEnd}
\draw[red,thick,->]%
   let \p1 = ($ (B) - (D) $), \n2 = {veclen(\x1,\y1)}
   in   
     (B) ++(60:\n2) node[fill=white]{$\alpha$}
     (D) arc (\AngleStart-360:\AngleEnd:\n2); % -360 only if  \AngleStart>\AngleEnd
 \end{tikzpicture}  

\end{document}

结果是代码输出

第二段代码:这里我使用了tkz-euclide包中的一些宏。想法是建立一个与第一个节点正交的圆。

\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all} 
\usetikzlibrary{through}  
\newcommand{\tikzAngleOfLine}{\tikz@AngleOfLine}
\def\tikz@AngleOfLine(#1)(#2)#3{%
\pgfmathanglebetweenpoints{%
\pgfpointanchor{#1}{center}}{%
\pgfpointanchor{#2}{center}}
\pgfmathsetmacro{#3}{\pgfmathresult}%
} 

\def\roundloop[#1]#2#3{%
 \coordinate (rla) at (#2.east); 
 \path   (#2)--++(#1) coordinate (rlb);
 \tkzTgtFromP(#2,rla)(rlb)            
 \node (rlb) at (rlb) [circle through={(tkzFirstPointResult)}] {};
 \coordinate  (rlc) at (intersection 2 of #2 and rlb);
 \coordinate  (rld) at (intersection 1 of #2 and rlb);         
 \tikzAngleOfLine(rlb)(rld){\AngleStart}
 \tikzAngleOfLine(rlb)(rlc){\AngleEnd} 
 \tikzAngleOfLine(#2)(rlb){\AngleLabel}
 \ifdim\AngleStart pt<\AngleEnd pt
 \draw[red,thick,->]%
   let \p1 = ($ (rlb) - (rld) $), \n2 = {veclen(\x1,\y1)}
   in   
     (rlb) ++(\AngleLabel:\n2) node[fill=white]{#3}
     (rld) arc (\AngleStart:\AngleEnd:\n2); 
 \else 
  \draw[red,thick,->]%
   let \p1 = ($ (rlb) - (rld) $), \n2 = {veclen(\x1,\y1)}
   in   
     (rlb) ++(\AngleLabel:\n2) node[fill=white]{#3}
     (rld) arc (\AngleStart-360:\AngleEnd:\n2); 
   \fi 
  }
\begin{document}

\begin{tikzpicture} 
  \node[circle,draw] (O){first node}; 
  \roundloop[180:2]{O}{$\alpha$}
   \roundloop[0:1]{O}{$\beta$}  
     \roundloop[60:3]{O}{$\delta$}
   \roundloop[-120:4]{O}{$\gamma$} 
\end{tikzpicture} 

\end{document}  

代码输出

答案3

您可以通过以下方式调整角度和松弛度:

\path[->,every loop/.style={looseness=10}] (foo)
         edge  [in=120,out=60,loop] node {1} (); 

循环示例

相关内容