¿Cómo dibujar una estructura hexagonal 3D con TikZ?

¿Cómo dibujar una estructura hexagonal 3D con TikZ?

¿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 polygonde la shapesbiblioteca; 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}

ingrese la descripción de la imagen aquí

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. ElsiunitxSe 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}

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

Respuesta3

Aquí otra respuesta sin tkz-berge. Usé gran parte del código de Gonzalo pero sin xslant,yslantpero 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 showy 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}

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Respuesta4

Adaptando el código delrespuesta aceptadaaDibujar hexágonosy siguiendo los consejos de Qrrbrbirlbel, puedes hacer esto:

ingrese la descripción de la imagen aquí

\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}

información relacionada