这是 问题。感谢用户的提示
奎伯比尔贝尔。我想用五个圆圈均匀地替代正五边形的每一条边。
我决定使用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}
答案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}] {};},
]{
& & & & \\
& & & & \\
& & & & \\
& & & & \\
};