TikZ에서 육각형 구조를 그리는 가장 좋은 방법은 무엇입니까3D로? 예를 들어,흑연 결정, 육각형으로 정렬된 보강재로 만들어진 벌집 또는 안정된 랙.
나는 이미 이 좋은 해결책을 찾았습니다.육각형 그리기. 그러나 이것은 2D 육각형에만 해당됩니다.
현재는 (x,y,z) 좌표를 사용하여 모든 노드를 별도로 기록하고 있습니다. 그러나 이것은 (a) 매우 짜증나고, (b) 연결 선이 레이어에 신경 쓰지 않는다는 단점이 있습니다. (평면 1과 3을 연결하면 선이 평면 2 "뒤로" 가지 않고 단지 맨 위에 그려집니다.) .
실현하는 가장 좋은 방법은 무엇인가3D레이어를 관리하고 모든 좌표를 손으로 입력하지 않고 알고리즘으로 입력하는 TikZ의 육각형 구조가 있습니까?
답변1
regular polygon
라이브러리 에서 이 시간을 사용하는 또 다른 옵션이 있습니다 shapes
. 각 명령에는 \hexgrid...
두 개의 필수 인수가 있습니다. 첫 번째 인수는 그리드에 이름을 지정하고 두 번째 인수는 수직 이동을 제어합니다. 선택적 인수를 사용하면 추가 옵션을 전달할 수 있습니다.
\documentclass{article}
\usepackage{tikz}
\usepackage{siunitx}
\usetikzlibrary{arrows,positioning,shapes}
\newcommand\xsla{-1.2}
\newcommand\ysla{0.505}
\newcommand\hexgridv[3][]{%
\begin{scope}[%
#1
xscale=-1,
yshift=#3,
yslant=\ysla,
xslant=\xsla,
every node/.style={anchor=west,regular polygon, regular polygon sides=6,draw,inner sep=0.5cm},
transform shape
]
\node (A#2) {};
\node (B#2) at ([xshift=-\pgflinewidth,yshift=-\pgflinewidth]A#2.corner 1) {};
\node (C#2) at ([xshift=-\pgflinewidth]B#2.corner 5) {};
\node (D#2) at ([xshift=-\pgflinewidth]A#2.corner 5) {};
\node (E#2) at ([xshift=-\pgflinewidth]D#2.corner 5) {};
\foreach \hex in {A,...,E}
{
\foreach \corn in {1,...,6}
\draw[fill=white] (\hex#2.corner \corn) circle (2pt);
}
\end{scope}
}
\newcommand\hexgridiv[3][]{%
\begin{scope}[%
#1,
xscale=-1,
yshift=#3,
yslant=\ysla,
xslant=\xsla,
every node/.style={anchor=west,regular polygon, regular polygon sides=6,draw,inner sep=0.5cm},
transform shape
]
\node (A#2) {};
\node (B#2) at (A#2.corner 5) {};
\node[xscale=-1] (C#2) at (B#2.corner 4) {};
\node (D#2) at (C#2.corner 4) {};
\foreach \hex in {A,...,D}
{
\foreach \corn in {1,...,6}
\draw[fill=white] (\hex#2.corner \corn) circle (2pt);
}
\end{scope}
}
\begin{document}
\begin{tikzpicture}[>=latex]
% the three grids
\hexgridv{a}{0}
\hexgridiv[xshift=0.43cm]{b}{-60}
\hexgridv{c}{-160}
% the red lines
\foreach \corn in {2,4}
\draw[ultra thick,red!80!black] (Aa.corner \corn) -- (Ac.corner \corn);
\draw[ultra thick,red!80!black,opacity=0.4] (Aa.corner 6) -- (Ac.corner 6);
\draw[ultra thick,red!80!black] (Da.corner 4) -- (Dc.corner 4);
\foreach \hexg in {a,c}
\draw[thick,red!80!black] (A\hexg.corner 2) -- (A\hexg.corner 4) -- (D\hexg.corner 4);
\foreach \hexg/\opac in {a/1,c/0.4}
\draw[thick,red!80!black,opacity=\opac] (A\hexg.corner 2) -- (A\hexg.corner 6) -- (D\hexg.corner 4);
% the red vertices
\begin{scope}[ yslant=\ysla,xslant=\xsla]
\foreach \hex/\corn in {Aa/2,Aa/4,Aa/6,Ab/3,Ac/2,Ac/4,Da/4,Cb/6,Cb/4,Dc/4}
\draw[fill=red!80!black] (\hex.corner \corn) circle (2pt);
\draw[fill=red!80!black,fill opacity=0.4] (Ac.corner 6) circle (2pt);
\draw[fill=red!80!black,fill opacity=0.4] (Cb.corner 2) circle (2pt);
\end{scope}
% The arrows and labels
\draw[help lines]
(Aa.corner 2) -- +(2.5,0) coordinate[pos=0.75] (aux1);
\draw[help lines]
(Ac.corner 2) -- +(2.5,0) coordinate[pos=0.75] (aux2);
\draw[<->,help lines]
(aux1) -- node[pos=0.25,fill=white,font=\footnotesize] {\SI{6.708}{\angstrom}} (aux2);
\draw[help lines]
(Ab.corner 2) -- +(1,0) coordinate[pos=0.5] (aux3);
\draw[<->,help lines]
(aux3) -- node[fill=white,font=\footnotesize,align=center] {b\\\SI{3.354}{\angstrom}} (aux3|-aux2);
\draw[help lines]
(Ac.corner 3) -- +(0,-0.45) coordinate[pos=0.5] (aux4);
\draw[help lines]
(Ac.corner 4) -- +(0,-0.4) coordinate[pos=0.5] (aux5);
\draw[<->,help lines]
(aux4) -- node[fill=white,font=\footnotesize,align=center,below=1pt] {a\\\SI{1.421}{\angstrom}} (aux5|-aux4);
\end{tikzpicture}
\end{document}
코드는 여전히 개선점을 인정하지만, 주요 요점은 육각형 그리드를 쉽게 정의하는 출발점으로 사용할 수 있다는 것입니다. 그만큼siunitx
패키지는 단위를 조판하는 데 사용되었습니다(덕분에스벤 트베스케그알림용).
답변2
3차원 육각형 구조를 그리는 방법은 여러 가지가 있기 때문에 정확히 무엇을 원하는지 모르겠습니다. 여기에 tkz-berge의 예가 있습니다.
다음 코드를 조정할 수 있습니다.
\documentclass{article}
\usepackage{tkz-berge}
\usetikzlibrary{3d}
\newcommand\pgfmathsinandcos[3]{%
\pgfmathsetmacro#1{sin(#3)}%
\pgfmathsetmacro#2{cos(#3)}%
}
\begin{document}
\pgfmathsetmacro\angFuite{155}
\pgfmathsetmacro\coeffReduc{1}
\pgfmathsinandcos\sint\cost{\angFuite}
\begin{tikzpicture}[current plane/.estyle=%
{cm={1,0,\coeffReduc*\cost,-\coeffReduc*\sint,(0,#1)}}]
\GraphInit[vstyle=Shade]
\begin{scope}[current plane=0 cm]
\SetGraphShadeColor{white}{teal}{gray}
\grEmptyCycle[Math,prefix=a]{6}
\end{scope}
\begin{scope}[current plane=6 cm]
\SetGraphShadeColor{white}{teal}{gray}
\grEmptyCycle[Math,prefix=b]{6}
\end{scope}
\SetGraphShadeColor{white}{teal}{gray}
\EdgeIdentity*[style={opacity=.3}]{a}{b}{3,4}
\EdgeInGraphSeq{a}{0}{1}
\EdgeInGraphSeq[style={opacity=.3}]{a}{1}{4}
\Edge(a0)(a5)
\EdgeInGraphLoop{b}{6}
\EdgeIdentity*{a}{b}{0,1,2,5}
\end{tikzpicture}
\end{document}
이 다른 예(저자: Andreas Menge)는 tkz-berge와 함께 다른 방법을 사용하며 적응하기 쉽습니다.
\documentclass[10pt]{article}
\usepackage{tkz-berge}
\newcommand{\myGlobalTransformation}[2]
{
\pgftransformcm{1}{0}{0.6}{0.2}{\pgfpoint{#1cm}{#2cm}}
}
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}
\GraphInit[vstyle=Art]
\begin{scope}
\myGlobalTransformation{0}{0}
\grCycle[prefix=a]{5}
\end{scope}
\begin{scope}
\myGlobalTransformation{0}{2}
\grCycle[prefix=b]{5}
\end{scope}
\EdgeIdentity{a}{b}{5}
\begin{scope}
\myGlobalTransformation{0}{-2}
\Vertex{x}
\end{scope}
\begin{scope}
\myGlobalTransformation{0}{4}
\Vertex{y}
\end{scope}
\EdgeFromOneToAll{x}{a}{}{5}
\EdgeFromOneToAll{y}{b}{}{5}
\end{tikzpicture}
\end{document}
답변3
여기에 없는 또 다른 답변이 있습니다 tkz-berge
. 나는 Gonzalo 코드의 큰 부분을 사용했지만 없이 xslant,yslant
스타일을 사용했습니다 current plane
. 이 스타일은 어떤 평면에 어떤 객체를 그리고 싶은지 정의합니다. 각도(angle de fuite French terme inspective)를 정의해야 합니다. 이 각도를 변경하면 일부 측면의 불투명도를 변경해야 하는 경우가 있습니다.
여기서는 175° 각도를 사용한 다음 145° 각도를 사용합니다.
업데이트
몇 가지 스타일 show
과 hidden
. 더 읽기 쉽습니다.
\documentclass{article}
\usepackage{tikz,fullpage}
\usetikzlibrary{arrows,positioning,shapes}
\newcommand\hexgridv[2][]{%
\begin{scope}[%
#1,
every node/.style={anchor=west,regular polygon, regular polygon sides=6,draw,inner sep=0.5cm},transform shape
]
\node (A#2) {};
\node (B#2) at ([xshift=-\pgflinewidth,yshift=-\pgflinewidth]A#2.corner 1) {};
\node (C#2) at ([xshift=-\pgflinewidth]B#2.corner 5) {};
\node (D#2) at ([xshift=-\pgflinewidth]A#2.corner 5) {};
\node (E#2) at ([xshift=-\pgflinewidth]D#2.corner 5) {};
\foreach \hex in {A,...,E}
{
\foreach \corn in {1,...,6}
\draw[fill=white] (\hex#2.corner \corn) circle (2pt);
}
\end{scope}
}
\newcommand\pgfmathsinandcos[3]{%
\pgfmathsetmacro#1{sin(#3)}%
\pgfmathsetmacro#2{cos(#3)}%
}
\begin{document}
\pgfmathsetmacro\angFuite{145}
\pgfmathsetmacro\coeffReduc{.75}
\pgfmathsinandcos\sint\cost{\angFuite}
\begin{tikzpicture}[scale=2,
current plane/.estyle={cm={1,0,\coeffReduc*\cost,-\coeffReduc*\sint,(0,#1)}},
show/.style={ultra thick,red!80!black,opacity=1},
hidden/.style={ultra thick,red!80!black,opacity=.4,dashed}]
\begin{scope}[current plane=0 cm]
\hexgridv[color=blue]{a}
\draw[blue!20] (-1,-2) grid (5,2);
\end{scope}
\begin{scope}[current plane=3 cm]
\draw[orange!20] (-1,-2) grid (5,2);
\hexgridv[color=orange]{c}
\end{scope}
\begin{scope}[current plane=3 cm]
\foreach \hex/\corn in {Ac/2,Ac/4,Dc/4}
\draw[fill=red!80!black] (\hex.corner \corn) circle (2pt);
\draw[fill=red!80!black,fill opacity=0.4] (Ac.corner 6) circle (2pt);
\end{scope}
% the red lines
\draw[hidden] (Aa.corner 4) -- (Ac.corner 4);
\draw[hidden] (Da.corner 4) -- (Aa.corner 4) -- (Aa.corner 2) ;
\draw[show] (Ac.corner 2) -- (Ac.corner 6) -- (Dc.corner 4) -- (Ac.corner 4) -- (Ac.corner 2);
\draw[show] (Aa.corner 2) -- (Aa.corner 6) -- (Da.corner 4)
(Da.corner 4) -- (Dc.corner 4);
\foreach \corn in {2,6}
\draw[show] (Aa.corner \corn) -- (Ac.corner \corn);
% the red vertices
\begin{scope}[current plane=0 cm]
\draw[hidden] (Ac.corner 6) circle (2pt);
\foreach \hex/\corn in {Aa/2,Aa/4,Aa/6,Da/4}
\draw[show] (\hex.corner \corn) circle (2pt);
\end{scope}
\end{tikzpicture}
\end{document}
답변4
의 코드를 적용하여수락된 답변에게육각형 그리기Qrrbrbirlbel의 조언에 따라 다음을 수행할 수 있습니다.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\newcommand\hexagonalstructure[1]{ \begin{scope}[%
yshift=#1,
yslant=0.5,%
xslant=-1.7,%
]
\foreach \i in {0,...,2}
\foreach \j in {0,...,2} {
\foreach \a in {0,120,-120} \draw (3*\i,2*sin{60}*\j) -- +(\a:1);
\foreach \a in {0,120,-120} \draw (3*\i+3*cos{60},2*sin{60}*\j+sin{60}) -- +(\a:1);}
\end{scope}
}
\begin{document}
\begin{tikzpicture}[scale=.5]
\hexagonalstructure{0}
\hexagonalstructure{-170}
\hexagonalstructure{-340}
\end{tikzpicture}
\end{document}