在多条路径的线上添加箭头

在多条路径的线上添加箭头

我正在绘制一个tikzpicture并尝试使其灵活。有一组符号我希望能够移动,同时保持它们的相对位置。到目前为止,我尝试在一个\draw' and using+(x,y)' 坐标内连接命令以保持相对位置。在下图中,我希望能够将圆圈内的内容作为一个组移动。

MWE 输出

我取得了一些进展,但我这样做的一个副作用是,我无法让这个东西在我的 S 节点之间的线的末端包含箭头。例如,如果我输入“->”而不是“--”,它就会忽略它。我像往常一样被手册淹没了。也许我错过了一种更好的方法。有什么建议可以帮助吗?

平均能量损失

\documentclass[border=6mm]{standalone}

\usepackage{tikz}

\begin{document}
%
\begin{tikzpicture}[>=latex]
    \draw (1.5,1.5) circle (1.5cm);
    \draw (0.5,1.8) node {$S_1$}
        +(2,0) node {$S_2$} 
        +(1,-1) node {$S_3$}
        +(0.4,0) -- +(1.6,0)
        +(1.8,-0.20) -- +(1.2,-0.8)
        +(0.2,-0.2) -- +(0.8,-0.8);
\end{tikzpicture}
%
\end{document}

我无法弄清楚如何在组内添加箭头的另一种元素是弧线。如下图所示。我知道如何将弧线作为单独的元素来实现这一点,但我无法让它在组内工作。

在此处输入图片描述

额外 MWE

\documentclass[border=6mm]{standalone}

\usepackage{tikz}

\begin{document}
%
\begin{tikzpicture}[>=latex]
    \draw (1.5,1.5) circle (2.0cm);
    \draw (0.5,1.8) node {$S_1$}
        +(2,0) node {$S_2$}
        +(1,-1) node {$S_3$}
        +(0.4,0) edge[<->] +(1.6,0)
        +(1.8,-0.20) edge[<->] +(1.2,-0.8)
        +(0.2,-0.2) edge[<->] +(0.8,-0.8);
    \draw[<->] (0.5,2.05) arc (0:270:0.3cm);
    \draw[<->] (2.8,1.75) arc (-90:180:0.3cm);
    \draw[<->] (1.3,0.65) arc (-225:45:0.3cm);
\end{tikzpicture}
%
\end{document}

答案1

您可以使用edge[->]而不是--

\documentclass[border=6mm]{standalone}

\usepackage{tikz}

\begin{document}
%
\begin{tikzpicture}[>=latex]
    \draw (1.5,1.5) circle (1.5cm);
    \draw (0.5,1.8) node {$S_1$}
        +(2,0) node {$S_2$}
        +(1,-1) node {$S_3$}
        +(0.4,0) edge[->] +(1.6,0)
        +(1.8,-0.20) edge[->] +(1.2,-0.8)
        +(0.2,-0.2) edge[->] +(0.8,-0.8);
\end{tikzpicture}
%
\end{document}

在此处输入图片描述

对于编辑,不完全是具有指定尺寸的弧,但这应该作为起点。

\documentclass[border=6mm]{standalone}

\usepackage{tikz}

\begin{document}
%
\begin{tikzpicture}[>=latex]
\draw (0,0) coordinate (-center) circle (1.5cm);
    \draw (150:0.75) node (-s1) {$S_1$}
            (30:.75) node (-s2) {$S_2$}
             (-90:.75) node (-s3) {$S_3$}
             (-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s2.center)
             (-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
             (-s2.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
             (-s1.north) edge[->,bend right,distance=0.5cm,in=-45,out=-140](-s1.west)
             (-s2.north) edge[->,bend right,distance=0.5cm,in=45,out=140,looseness=5] (-s2.east)
             (-s3.east) edge[->,bend right,distance=0.8cm,in=40,out=140] (-s3.west);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

Harish 已经解决了箭头的问题,但如果你愿意的话,move around a group of symbols我建议使用pic(TiKZ 3.0 的新功能)。

\documentclass[border=6mm]{standalone}

\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
%

\tikzset{
    mygroup/.pic={
    \draw (0,0) coordinate (-center) circle (1.5cm);
    \draw (150:0.75) node (-s1) {$S_1$}
            (30:.75) node (-s2) {$S_2$}
             (-90:.75) node (-s3) {$S_3$}
             (-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s2.center)
             (-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
             (-s2.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center);
    }
}
\begin{tikzpicture}[>=latex]
    \pic (A) {mygroup};
   \pic[rotate=15,transform shape] at (3,2) (B) {mygroup};
   \pic[red, rotate=-90, transform shape] at (2.75,-1.5) (C) {mygroup};
    \draw[->,blue] (A-s1) to[out=90,in=100] (B-s2);
    \draw[->,blue] (A-s3) to[out=-60,in=180] (C-s2.south);
\end{tikzpicture}
%
\end{document}

在此处输入图片描述

更新:

图片可以有参数吗?比如说形状相同但标签不同。

是的,但需要一种新的pic声明。下面的代码显示了如何声明 3 个参数mygroup pic以及如何使用mygroup={1st}{2nd}{3rd}语法分配它们。在这个答案TikZ 3.0——`pic` 的多个参数,提出了另一种系统mygroup={1st/2nd/3rd}。它很容易修改代码。

我确信可以定义一些default参数,但直到现在我都无法做到。我知道如何用style声明来做到这一点,但我无法成功pic。在我找到解决方案(或其他人提供解决方案)之前,您必须为每个组声明所有三个参数。

\documentclass[border=6mm]{standalone}

\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
%

\tikzset{
    pics/mygroup/.style n args={3}{
        code = {
                \draw (0,0) coordinate (-center) circle (1.5cm);
                \draw (150:0.75) node (-s1) {#1}
                    (30:.75) node (-s2) {#2}
                    (-90:.75) node (-s3) {#3}
                    (-s1.center) edge[->,shorten >=3mm, shorten <=3mm] (-s2.center)
                                        edge[->,shorten >=3mm, shorten <=3mm] (-s3.center)
                    (-s2.center) edge[->,shorten >=3mm, shorten <=3mm] (-s3.center);
        }
    }
}
\begin{tikzpicture}[>=latex]
    \pic (A) {mygroup={$S_1$}{$S_2$}{$S_3$}};
   \pic[rotate=15,transform shape] at (3,2) (B) {mygroup={$S_5$}{$S_6$}{$S_7$}};
   \pic[red, rotate=-90, transform shape] at (2.75,-1.5) (C) {mygroup={$S_a$}{$S_b$}{$S_c$}};
    \draw[->,blue] (A-s1) to[out=90,in=100] (B-s2);
    \draw[->,blue] (A-s3) to[out=-60,in=180] (C-s2.south);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

当(重新)使用组时,我使用以下方法。它允许您创建一个组,并在任何地方使用自定义 x、y 偏移和大小重复使用它。

\documentclass[border=6mm]{standalone}
\usepackage{tikz}

\begin{document}

% define a new group of elements to be reused later
\def\mygroup#1#2{
\begin{scope}[shift={#1}, scale=#2]
  % using polar coordinates here (just for example)
  \draw (0,0) ++(135:1cm) node (n1) {$S_1$};
  \draw (0,0) ++(45:1cm) node (n2) {$S_2$};
  \draw (0,0) ++(270:1cm) node (n3) {$S_3$};

  \draw [->] (n1) -- (n2);
  \draw [->] (n2) -- (n3);
  \draw [->] (n1) -- (n3);
\end{scope}
}

\begin{tikzpicture}[>=latex]
  \draw (0,0) circle (1.5cm); 
  % reuse \mygroup (1st parameter is x,y-shift, 2nd is resize)
  \mygroup{(0,0)}{1};
\end{tikzpicture}
\end{document}

在此处输入图片描述

这样,您就可以在其他组中重复使用该组,子类您的 tikz 代码的部分。

编辑(带弧的版本):

这是带有弧线的 MWE 的增强版本。这里的做法是,您可以按 x、y 坐标移动三角形图形,相应的弧线将停留在所需的节点上。我只是为三个节点 (n1、n2、n3) 添加了节点名称,并设置了相对于它们的弧线位置。

\documentclass[border=6mm]{standalone}
\usepackage{tikz}

\begin{document}
%
\begin{tikzpicture}[>=latex]
    \draw (1.5,1.5) circle (2.0cm);
    \draw (0.5,1.8) node (n1) {$S_1$}
        +(2,0) node (n2) {$S_2$}
        +(1,-1) node (n3) {$S_3$}
        +(0.4,0) edge[<->] +(1.6,0)
        +(1.8,-0.20) edge[<->] +(1.2,-0.8)
        +(0.2,-0.2) edge[<->] +(0.8,-0.8);
    \draw[<->] (n1.north) arc (0:270:0.3cm);
    \draw[<->] (n2.east) arc (-90:180:0.3cm);
    \draw[<->] (n3.south) ++(.2,.1) arc (45:-225:0.3cm);
\end{tikzpicture}
%
\end{document}

我无法将所有路径和节点定义放入一次调用中。如果没有添加额外的 ,圆弧将没有箭头draw

\def我认为首选方法是通过或环境创建新形状,.pic如上所示。如果您尝试将所有路径和节点定义放入一个调用中,您将无法微调图形。此外,在其他上下文中重用代码也会更加困难。

编辑:支持节点周围的圆形坐标(另请参阅下面的评论) 以下代码是对下面评论的回答。它引入了对围绕节点的圆形坐标的支持,以取代north, south,... 坐标。

这里有一个小片段,展示了如何使用极坐标来实现你的目标:

\documentclass[border=6mm]{standalone}
\usepackage{tikz}

\begin{document}
%
\begin{tikzpicture}[>=latex]
    \draw (0,0) node (n3) {$S_3$};
    \draw [dashed, red] (n3.east) |- (n3.south) -| (n3.west);
    \draw [red, fill=red] (n3.south) circle (2pt);
    \draw [red, fill=red] (n3.south east) circle (2pt);
    \draw [red, fill=red] (n3.south west) circle (2pt);

    \draw [dashed, blue] (0,0) ++(-.5,0) arc (180:360:.5cm);
    \draw [blue, fill=blue] (n3) ++(-90:.5cm) circle (2pt);
    \draw [blue, fill=blue] (n3) ++(-45:.5cm) circle (2pt);
    \draw [blue, fill=blue] (n3) ++(-135:.5cm) circle (2pt);
\end{tikzpicture}
%
\end{document}

节点周围的极坐标

相关内容