如何用五个圆圈均匀替代正五边形的每一条边?

如何用五个圆圈均匀替代正五边形的每一条边?

这是 问题。感谢用户的提示
奎伯比尔贝尔。我想用五个圆圈均匀地替代正五边形的每一条边。

我决定使用decorations,但我注意到圆圈替换看起来不太均匀。此外,我希望它自动发生,而无需我手动调整其shape sep。理想情况下,我希望正五边形的所有五个角都替换为圆圈。

\documentclass[tikz]{standalone}
\usetikzlibrary {decorations.shapes}

\begin{document}
\begin{tikzpicture}[decoration={
      shape backgrounds,shape=circle,shape size=2mm}]
  \draw[thick, red, decorate, decoration={shape sep=0.75cm}] (90:2)--(162:2)--(234:2)--(306:2)--(378:2)--cycle;
\end{tikzpicture}
\end{document}

在此处输入图片描述

下面是我自己写的代码,将每条线段替换成五个圆圈,满足我的要求,但是代码显得有些繁琐。

\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{calc}

\newcommand{\drawLineWithPoints}[2]{ 
  \foreach \w in {0,0.25,0.5,0.75,1} {
    \coordinate (point) at ($#1!\w!#2$);
    \draw [red] (point) circle (2pt);
  }
}

\begin{document}
\begin{tikzpicture}
\node[minimum size=2cm, regular polygon, regular polygon sides=5] (a) {};


\foreach \i in {1,...,5}{
  \pgfmathtruncatemacro{\j}{\i+1}
  \ifnum\j>5
    \pgfmathtruncatemacro{\j}{1}
  \fi
  \drawLineWithPoints{(a.corner \i)}{(a.corner \j)}
}
\end{tikzpicture}
\end{document} 

在此处输入图片描述

编辑: 使用decorations.markings

\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}

\tikzset{
  mydecoration/.style={
    decoration={
      markings,
      mark=between positions 0 and 1 step 0.25 with {
        \fill (0,0) circle (2pt);
      }
    },
    postaction={decorate}
  }
}

\begin{document}
\begin{tikzpicture}
\foreach \angle in {90, 162, 234, 306, 378}{
  \path[thick, red, mydecoration](\angle:1)--({\angle+72}:1);
  
}
\end{tikzpicture}
\end{document} 

答案1

说实话,我认为您发布的代码没有任何问题。它对我来说似乎并不麻烦。不过,如果您愿意,您可以稍微简化一下。

有多种方法可以做到这一点,并且其中一些差异取决于个人喜好。

在你发布的代码中,你实际上并不需要坐标,(point)因为你只需说

         \draw [red] ($#1!\w!#2$) circle (2pt);

您还可以减少,pgfmath但代价是使主循环的值集稍微丑陋一些。基本上,这个想法是\j直接设置并使用count循环的\i

  \foreach \j [count=\i] in {2,...,5,1}{
    \drawLineWithPoints{(a.corner \i)}{(a.corner \j)}
  }

因为我们没有计算任何东西,所以我们可以将所有内容保留为整数,而不必担心截断 TeX 算术的结果。

\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{calc}

\newcommand{\drawLineWithPoints}[2]{ 
  \foreach \w in {0,0.25,0.5,0.75,1} {
    \draw [red] ($#1!\w!#2$) circle (2pt);
  }
}

\begin{document}
\begin{tikzpicture}
  \node[minimum size=2cm, regular polygon, regular polygon sides=5] (a) {};
  
  \foreach \j [count=\i] in {2,...,5,1}{
    \drawLineWithPoints{(a.corner \i)}{(a.corner \j)}
  }
\end{tikzpicture}
\end{document}

五边形每边有 5 个圆圈

答案2

你的方法不一定有问题。我的评论只是建议你考虑其他选择。与 TikZ 一样,任何问题都有多种方法。正确的选择将取决于具体情况。

我喜欢可以在多种情况下使用但参数化的解决方案。

这是一种polygon with red circles decorated = <sides> x <circles>样式,它创建一个正多边形节点<sides>(通过形状regular polygon),该节点每边将用 装饰,<circles>从而总共有<sides>× 个<circles>圆。 在您的例子中,这是5 x 4。 圆的半径由可以与此样式一起设置的 值决定radius

另一种方法是使用polygon path = <phase>:<sides>:<radius>样式构造一个封闭的正多边形,其<sides>边长和半径为<radius>,第一个角从<phase>°开始。(请注意,minimum size形状regular polygon的指定直径。)由于此样式使用,to我们可以将every to使用的样式连接到每条边to with nodes = <nodes>,并将<nodes>等距放置在每个to段上。此样式根本不指定节点,为此我们可以使用nodes我设置的样式,以便再次放置红色圆圈。

我们甚至可以使用不同于to的路径line to

代码

\documentclass[border=1mm, tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings, shapes.geometric}
\tikzset{
  polygon path/.style args={#1:#2:#3}{% phase:n:radius
    insert path={({#1}:{#3}) foreach[parse=true] \i in {1, ..., #2-1}{
      to ({#1+\i*360/(#2)}:{#3})} to cycle}},
  to with nodes/.style={
    every to/.append style={
      edge node={node foreach \p in {1, ..., #1}[pos=\p/(#1)]{}}}},
  polygon with red circles decorated/.style args={#1x#2}{
    shape=regular polygon,
    regular polygon sides={#1},
    decorate,
    decoration={
      name=markings,
      mark=between positions 1/((#1)*(#2)) and 1 step 1/((#1)*(#2)) with {
        \draw[red] (0,0) circle[];}}}}
\begin{document}
\tikz
  \node[minimum size=2cm, polygon with red circles decorated=5x4, radius=2pt] {};

\tikz
  \path[
    to with nodes=4,
    nodes={shape=circle, draw=red, inner sep=+0pt, minimum size=+4pt},
    polygon path={90:5:1}];

\tikz[row sep=5mm, column sep=5mm]
\matrix[
  radius=2pt,
  execute at empty cell={
    \node[
      minimum size=1cm,
      polygon with red circles decorated=
        \pgfmatrixcurrentrow+2 x \pgfmatrixcurrentcolumn] {};},
]{
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
};

\tikz[row sep=5mm, column sep=5mm]
\matrix[
  radius=2pt,
  cells={nodes={shape=regular polygon, regular polygon sides=\pgfmatrixcurrentcolumn+2, draw, inner sep=+0pt, minimum size=+4pt}},
  execute at empty cell={
    \path[
      bend left,
      to with nodes=\pgfmatrixcurrentcolumn,
      polygon path={270-180/(\the\pgfmatrixcurrentrow+2):
                    \the\pgfmatrixcurrentrow+2:.5}] {};},
]{
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
};

输出

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

相关内容