请帮帮我,我试图并排绘制许多多边形,但是没有成功!
我的 MWE:
\documentclass{article}
\usepackage{xcolor}
\usepackage{pgf,tikz}
\usetikzlibrary{shapes,arrows,shadows,patterns,shapes.geometric,calc}
\begin{document}
\tikzset{poly/.style={regular polygon, regular polygon sides=6,fill=gray!10,minimum size=2 cm, draw}}
\tikzset{poly1/.style={regular polygon, regular polygon sides=6,fill=gray!30,minimum size =2cm, draw}}
\begin{tikzpicture}[scale=0.7]
\draw [help lines,gray!50,step =0.5] (-10,-10) grid (10,10);
\draw[red,-{stealth}](-10,0)--(10,0);
\draw[green!60!black,-{stealth}](0,-10)--(0,10);
\node [poly] at (2,2) {C7};
\node [poly] at (2,-0.5) {C6};
\node [poly1,rotate=-90] at (4.2,3.25) {C7};
\end{tikzpicture}
\end{document}
有什么建议吗?
答案1
如果要使用多边形节点,可以使用锚点.corner
来定位它们。以下是一组:
\documentclass[tikz,border=10mm]{standalone}
\usetikzlibrary{shapes.geometric,positioning}
\begin{document}
\tikzset{
my poly/.style={regular polygon, regular polygon sides=6,fill=gray!#1,minimum size=2cm, draw},
}
\begin{tikzpicture}[node distance=0pt, every node/.style={outer sep=0pt}]
\draw [help lines,gray!50,step =0.5] (-10,-10) grid (10,10);
\node (1-C1) [my poly=10] {C1};
\foreach \i/\j/\k/\m in {4/2/2/30,3/1/3/10,2/6/4/10,1/5/5/10,6/4/6/10,5/3/7/10}
\node (1-C\k) [my poly=\m, anchor=corner \i] at (1-C1.corner \j) {C\k};
\end{tikzpicture}
\end{document}
节点已命名,因此您可以使用外部多边形的角来放置下一个节点,依此类推。例如,(1-C1), (1-C2)...
。
扩大
事实上,如果你使用C2
作为初始节点,而不是C1
,那么你可以使用第二个外循环来定位和绘制另外 7 个六边形,构建 7×7 的整体图像。例如:
\documentclass[tikz,border=10mm]{standalone}
\usetikzlibrary{shapes.geometric,positioning}
\begin{document}
\tikzset{
my poly/.style={regular polygon, regular polygon sides=6,fill=gray!#1,minimum size=2cm, draw},
}
\begin{tikzpicture}[node distance=0pt, every node/.style={outer sep=0pt}]
\foreach \a/\b/\c/\d [count=\hexset, remember=\hexset] in {2/0/0/0,2/1/4/6,1/1/5/3}
{
\ifnum\hexset>1
\node (\hexset-C2) [my poly=30, anchor=corner \a] at (\b-C\c.corner \d) {C2};
\else
\node (1-C2) [my poly=30] {C2};
\fi
\foreach \i/\j/\k [remember=\k as \savedhex (initially 2)] in {3/5/3,2/4/4,1/3/5,5/3/6,5/1/7,3/5/1}
\node (\hexset-C\k) [my poly=10, anchor=corner \i] at (\hexset-C\savedhex.corner \j) {C\k};
}
\end{tikzpicture}
\end{document}
外循环(变量\a/\b/\c/\d
:)用于将每组 7 个六边形相对于之前的组进行定位(当前组是第一个要绘制的组时除外)。这是通过使用C2
一种锚定六边形来完成的。因此,变量指定哪个.corner
锚点应与前一组六边形中的哪个六边形C2
对齐。.corner
在示例中,{2/0/0/0,2/1/4/6,1/1/5/3}
绘制 3 组 7 个六边形:
第一组被指定为,
2/0/0/0
但是这里的值没有区别,因为没有什么可以与该组对齐。第二个是
2/1/4/6
。这意味着 C22
在新六边形集合中的角锚将与集合1
:六边形 C4
:角对齐6
,即(1-C4.corner 6)
。第三个是
1/1/5/3
。这意味着 C21
在新六边形集合中的角锚将与集合1
:六边形 C5
:角对齐3
,即(1-C5.corner 3)
。如果我们想与第二组中的某个对象对齐,我们将使用?/2/?/?
。
这允许对六边形结构进行相当简洁的规范。
答案2
这是一个选项:
代码:
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,matrix,shapes.geometric,backgrounds}
\colorlet{darkfill}{gray}
\colorlet{lightfill}{gray!60}
\tikzset{myhex/.style={
draw,
outer sep=0pt,
regular polygon,
regular polygon sides=6,
minimum size=2cm,
font=\sffamily,
% xscale=1.5
}
}
\newcommand\FillHexagon[2]{
\begin{pgfonlayer}{background}
\fill[darkfill]
(#1.corner 1) --
(#1.corner 2) --
(#1.corner 3) --
(#1.corner 4) --
(#1.corner 5) --
(#1.corner 6);
\ifdim#2pt=0pt\relax
\else
\ifdim#2pt<0.5pt\relax
\fill[lightfill]
(#1.corner 4) --
( $ (#1.corner 4)!2*#2!(#1.corner 3) $ ) --
( $ (#1.corner 5)!2*#2!(#1.corner 6) $ ) --
(#1.corner 5) -- cycle;
\else
\ifdim#2pt>0.5pt\relax
\fill[lightfill]
(#1.corner 4) --
(#1.corner 3) --
( $ (#1.corner 3)!2*#2-1!(#1.corner 2) $ ) --
( $ (#1.corner 6)!2*#2-1!(#1.corner 1) $ ) --
(#1.corner 6) --
(#1.corner 5) -- cycle;
\else
\ifdim#2pt=0.5pt\relax
\fill[lightfill]
(#1.corner 4) --
(#1.corner 3) --
(#1.corner 6) --
(#1.corner 5) -- cycle;
\else
\fi
\fi
\fi
\fi
\end{pgfonlayer}
}
\begin{document}
\begin{tikzpicture}
\foreach \Nombre/\Shift in {1/{(0:0cm)},2/{(-49.2:4.58cm)},3/{(250.8:4.58cm)}}
{
\node[myhex,shift={\Shift}]
(center\Nombre)
{C1};
\foreach \Valor
[evaluate=\Valor as \Anchor using {int(mod(\Valor+2,6)+1)}] in {1,2,3,4,5,6}
{
\node[myhex,anchor=side \Anchor]
at (center\Nombre.side \Valor)
(center\Nombre-\Valor)
{C\pgfmathprint{int(2+mod(6-mod(\Valor+5,6),6))}};
}
}
\FillHexagon{center1-1}{0}
\FillHexagon{center2-1}{0.1}
\FillHexagon{center3-1}{0.56}
\end{tikzpicture}
\end{document}
命令
\FillHexagon{<name>}{<factor>}
允许使用两种不同的颜色填充给定的六边形(如问题图像中的两个六边形)。
<factor>
允许指定将用第二种颜色填充的六边形的比例。两种颜色由lightfill
和控制darkfill
;使用0
填充六边形darkfill
,使用1
完全填充六边形lightfill
。% xscale=1.5
如果要沿 x 分量拉长六边形,请取消注释该行(并使用所需的因子)。
答案3
使用以下方式编译lualatex
\documentclass{article}
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usepackage{luacode}
\begin{document}
\begin{tikzpicture}
\begin{luacode*}
cs=math.cos(math.pi/3)
ss=math.sin(math.pi/3)
function printcoord(x,y,s)
tex.print(" (" .. x .. "," .. y .. ") " .. s )
end
function drawpoly(tlx,tly,s,c)
tex.print("\\draw[fill,color=" .. c .."] ")
ox={0,1,1+cs,1,0,-cs}
oy={0,0,-ss,-2*ss,-2*ss,-ss}
for j=1,6 do printcoord(tlx+ox[j],tly+oy[j],"--") end
tex.print("cycle; \\draw")
printcoord(tlx+0.5,tly-ss," node{C" .. s .. "};")
end
offx={ 0,0,1+cs,1+cs,0,-1-cs,-1-cs}
offy={ 0,2*ss,ss,-ss,-2*ss,-ss,ss}
col={"Beige","Green","Blue","Orange","Yellow","Magenta","Purple"}
coord= { {x=0, y=0 }, { x=1+cs, y=5*ss }, {x=3+3*cs, y=ss} }
for i,v in ipairs(coord) do for j=1,7 do drawpoly(v.x+offx[j],v.y+offy[j],j,col[j]) end end
\end{luacode*}
\end{tikzpicture}
\end{document}
答案4
对于这个特定的图表,利用一些基本的几何图形,用两个简单的循环就能让事物变得相当紧凑。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}[every hexagon/.style={
shape=regular polygon, regular polygon sides=6, inner sep=0,
minimum size=1cm, font=\sffamily, fill=gray!20, draw=white, thick},
hexagon 2/.style={fill=blue!20}]
\foreach \j in {1,...,3}
\foreach \i [evaluate={\a=210-\j*120+atan(sec(30)/6); \r=sqrt(7)/2;}]
in {1,...,7}
\node [every hexagon/.try, hexagon \i/.try, shift=(\a:\r)]
at (210-\i*60:{(\i > 1)*cos(30)}) {C\i};
\end{tikzpicture}
\end{document}