¿Cuál es la mejor manera en TikZ de dibujar una estructura hexagonal?en 3D? Por ejemplo,cristales de grafito, panales o bastidores estables hechos de refuerzos alineados hexagonales.
Ya encontré esta buena solución:Dibujar hexágonos. Pero esto es sólo para hexágonos 2D.
Actualmente solo estoy escribiendo todos los nodos por separado con coordenadas (x,y,z). Pero esto tiene las desventajas de ser (a) muy molesto, (b) a las líneas de conexión no les importan las capas (las líneas no van "detrás" del plano 2 si conecto los planos 1 y 3, simplemente se dibujan en la parte superior) .
¿Cuál es la mejor manera de realizar un3D¿Estructura hexagonal en TikZ que se encarga de las capas y no necesita que todas las coordenadas se ingresen a mano sino mediante un algoritmo?
Respuesta1
Aquí hay otra opción, usando este tiempo regular polygon
de la shapes
biblioteca; cada uno de los \hexgrid...
comandos tiene dos argumentos obligatorios: el primero le da un nombre a la grilla y el segundo controla el desplazamiento vertical; el argumento opcional permite pasar opciones adicionales:
\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}
El código admite aún mejoras, pero el punto principal es que puede usarse como punto de partida para definir fácilmente cuadrículas hexagonales. Elsiunitx
Se utilizó un paquete para componer las unidades (gracias aSvend Tveskægpara el recordatorio).
Respuesta2
No sé exactamente qué quieres porque hay varias posibilidades para dibujar una estructura hexagonal en 3D. aquí un ejemplo con tkz-berge
El siguiente código se puede adaptar:
\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}
Este otro ejemplo (Autor: Andreas Menge) utiliza otro método con tkz-berge y es fácil de adaptar.
\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}
Respuesta3
Aquí otra respuesta sin tkz-berge
. Usé gran parte del código de Gonzalo pero sin xslant,yslant
pero usé un estilo current plane
. Este estilo define en qué plano quiero dibujar algunos objetos. Es necesario definir el ángulo (ángulo de fuite término francés en perspectiva). Si cambias este ángulo, a veces necesitarás cambiar la opacidad de algunos lados.
Aquí uso un ángulo de 175° y luego 145°.
Actualizar
Agregué algunos estilos show
y hidden
. Es más legible.
\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}
Respuesta4
Adaptando el código delrespuesta aceptadaaDibujar hexágonosy siguiendo los consejos de Qrrbrbirlbel, puedes hacer esto:
\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}