如何在 Tikz 中连续绘制多个具有不同中心的半圆

如何在 Tikz 中连续绘制多个具有不同中心的半圆

我想连续画五个半圆(类似于第二张照片)。这是以点为顶点/节点的图形。我可以画一个以原点为中心的半圆(请参见第一张照片),这正是我想要的样子,但我无法在中心 (-6;0)、(-12;0)、(6;0) 和 (12;0) 复制它。我该如何绘制其他四个?

我附上了我的 LateX 代码。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,decorations.pathmorphing,backgrounds,positioning,fit,petri,calc,graphs,graphs.standard}

\begin{document}
    
     \begin{figure}[h]
        \begin{center}
            \begin{tikzpicture}
                [scale=0.6,inner sep=0.5mm, % this is the node radius
                vertex/.style={circle,draw}, % this defines the default style for the vertex class
                thickedge/.style={line width=2pt}] % this defines the default style for the thick edges
                
                \def\r{3} 
                
                \foreach \point in {(0:\r) ,(90:\r),(180:\r),(60:\r),(30:\r),(150:\r),(120:\r)} 
                \draw[fill=white] \point circle(.12);
                \node at (60:\r) {} ;
                \node at (30:\r) {} ;
                \node at (150:\r) {} ;
                \node at (120:\r) {} ;
                
                
                \node[vertex] (1) at (0,0) [fill=white] {};
                \node[vertex] (2) at (0,3) [fill=white] {};
                \node[vertex] (3) at (-3,0) [fill=white] {};
                \node[vertex] (5) at (3,0) [fill=white] {};
                
                \draw (1)--(2);
                \draw (3)--(1)--(5);
                
                \draw (0,0)+(122:3cm) arc[start angle=122, end angle=148, radius=3cm];
                \draw (0,0)+(32:3cm) arc[start angle=32, end angle=58, radius=3cm];
                \draw (0,0)+(28:3cm) arc[start angle=28, end angle=2, radius=3cm];
                \draw (0,0)+(-182:3cm) arc[start angle=-182, end angle=-208, radius=3cm];
                \draw  (0,0)+(-242:3cm) arc[start angle=-242, end angle=-268, radius=3cm];
                \draw  (0,0)+(-272:3cm) arc[start angle=-272, end angle=-298, radius=3cm];
            \end{tikzpicture}
        \end{center}
    \end{figure}
\end{document}

LateX 输出

连续 5 个半圆

答案1

欢迎来到 TeX.SE

我认为您正在寻找类似这样的东西,使用几个\foreach循环来重复半圆和点:

\documentclass[tikz,border=1.618]{standalone}

\begin{document}
\begin{tikzpicture}
\foreach\i in {0,2,...,8}
{
  \draw (\i,0) arc (180:0:1) -- cycle;
  \foreach\j in {0,30,60,...,180}
    \fill (\i+1,0) ++  (\j:1) circle (1pt);
  \draw (\i+1,0) --++ (0,1);
  \fill (\i+1,0) circle (1pt);
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

更新(白色节点):在这种情况下,我们需要在节点前画线:

\documentclass[tikz,border=1.618]{standalone}

\begin{document}
\begin{tikzpicture}
\foreach\i in {0,2,...,8}
{
  \draw (\i,0) arc (180:0:1) -- cycle;
  \draw (\i+1,0) --++ (0,1); % <-- before the nodes
  \foreach\j in {0,30,60,...,180}
    \draw[black,fill=white] (\i+1,0) ++  (\j:1) circle (1pt);
  \draw[black,fill=white] (\i+1,0) circle (1pt);
}
\end{tikzpicture} 
\end{document}

在此处输入图片描述

答案2

只是为了好玩,让我们用 来做pic。有关 的更多详细信息pic请点击此处。简而言之,它是一个 tikz 代码片段,您可以非常轻松地预定义和重用它。正如 Juan Castaño 所说:“也就是说,\pic可以使半圆更加可定制:大小、旋转、颜色”。您可以事半功倍。以下是代码:

\documentclass[border=1.618]{standalone}
\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}[
         semicircles/.pic={ 
            \draw (0,0) arc (180:0:#1) -- cycle;
            \foreach\j in {0,30,60,...,180}
                \fill (#1,0) ++  (\j:#1) circle (1pt);
            \draw (#1,0) --++ (0,#1);
            \fill (#1,0) circle (1pt);
        }   
    ]
    \foreach \j in {0,2,...,8}{
        \pic  at (\j,0){semicircles=1};
        \pic  [rotate=45,yshift=5cm] at (\j,0){semicircles=2};
    }
\end{tikzpicture}
\end{document}

结果如下。

在此处输入图片描述

编辑:根据 Juan Castaño 的建议,我们可以添加一个pic actions只能在 中部署的样式选项pic

它的实用性源于它能够添加任意样式并让我们传递<key>=<value>参数来改变某些内容的样式pic

从上一个代码开始,我们只需要改变

\fill (#1,0) circle (1pt);

进入

\fill [pic actions] (#1,0) circle (1pt);

这意味着现在任何对此的调用都pic可以像这样改变圆圈的样式:

``

\begin{tikzpicture}[
     semicircles/.pic={ 
        \draw (0,0) arc (180:0:#1) -- cycle;
        \foreach\j in {0,30,60,...,180}
            \fill (#1,0) ++  (\j:#1) circle (1pt);
        \draw (#1,0) --++ (0,#1);
        \fill [pic actions] (#1,0) circle (1pt);
        }   
    ]
    \foreach \j in {0,2,...,8}{
        \pic  at (\j,0){semicircles=1};
        \pic  [rotate=45,yshift=5cm] at (\j,0){semicircles=2};
        \pic [fill=red] at (\j,-2){semicircles=1};
    }
\end{tikzpicture}

在此处输入图片描述

相关内容