
Estoy intentando que TikZ dibuje zonas Brillouin para redes bidimensionales, pero hasta ahora no he tenido mucha suerte con nada de lo que he probado. Las zonas de Brillouin son, básicamente, el área del espacio alrededor de un punto de la red que está más cerca de ese punto y, por lo tanto, son similares aDiagramas de Voronoi. Puedes ver cómo se ven en esta imagen, que tiene dibujadas la primera, segunda y tercera zonas de Brillouin:
(fuente:eelvex.net)
Si tuviera que dibujar esto a mano, construiría la primera zona de Brillouin dibujando una línea desde el punto central en la red hasta cada uno de los puntos a una distancia de 1 (tomando los puntos de la red separados por una unidad de distancia). desde el punto central, por lo que serían los que están al norte, este, sur y oeste del mismo. Luego tomaría las bisectrices perpendiculares (en el lenguaje físico, estos son planos de Bragg) de cada una de estas líneas. La primera zona de Brillouin sería entonces el área encerrada por las bisectrices perpendiculares (y es el área gris sombreada en la imagen de arriba). Las zonas más altas se construyen de la misma forma; se da una explicación ligeramente varianteen este sitio. También tiene código en asíntota, pero parece que simplemente está codificado.
¿Hay alguna manera de que esto se pueda hacer en TikZ, y hay alguna manera de que se pueda hacer tanto para cualquier red determinada como para cualquier número de zonas Brillouin? Probé algunos enfoques, sin éxito, incluidos varios intentos de hacerlo con Lua (en el que no soy muy competente), pero lo único que realmente tengo funcionando es una forma de dibujar los puntos de la red, que he Se incluye aquí para una red cuadrada, pero no es demasiado difícil modificar esto para obtener una red hexagonal.
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
%%% For a square lattice
\begin{tikzpicture}
\foreach \x in {-2, ..., 2}{
\foreach \y in {-2, ..., 2}{
\fill [black] (\x, \y) circle (0.1);
}
}
\end{tikzpicture}
\end{document}
Respuesta1
¿Hay alguna manera de que esto se pueda hacer en TikZ, y hay alguna manera de que se pueda hacer tanto para cualquier red determinada como para cualquier número de zonas Brillouin?
Respuesta corta:¡Sí!
Respuesta más larga:¡No!Esta tarea puede resultar muy costosa desde el punto de vista computacional para valores elevados. Deberías separar el cálculo de la visualización porque (supongo) no quieres empezar desde cero cada vez que compilas. Y si lo hace por separado, ¿por qué no utiliza una herramienta más adecuada que pueda almacenar y usar fácilmente elementos previamente calculados para cualquier red determinada?
Respuesta más larga en elParte "sí". Aquí hay un algoritmo que podría funcionar y implementarse en LaTeX (pero en realidad no debería). Es un poco "truco" porque esta descripción en realidad no implica una "fórmula cerrada" para colorear (y tal vez no la haya).
Creo que lo siguiente debería funcionar. Y esta afirmación se basa en la naturaleza inductiva del algoritmo.
- Calcula las bisectrices perpendiculares.
- Calcula la intersección (si la hay) para cada par de bisectrices.
- Crear unestructura de datosque está indexado por las intersecciones y tiene una lista para cada una con las líneas que la atraviesan.
- Cree una lista de bordes a partir del cuadrado interior (
k=0
cuadrado). Dejark=1
. - Basado en la lista de bordes y las intersecciones (aquí viene elDiversión sin fin con vectores y sus productos cruzados.) comience en cada borde del casco en el sentido de las agujas del reloj (en el sentido de las agujas del reloj) (en el sentido contrario a las agujas del reloj si
k
es par), y vaya más a la izquierda (más a la derecha sik
es par) todas y cada una de las veces, hasta regresar. Ahora tienes un área parak
. Haz eso para cada borde. Almacene la nueva lista de bordes (casco) y úsela en la siguiente iteración. Puede decidir adónde puede ir desde una intersección y cuál es la más a la izquierda (la más a la derecha) utilizando el índice creado en el paso 3. - Aumenta
k
en uno y repite 5-6 tanto tiempo como quieras.
Esto se puede mejorar algorítmicamente de varias maneras, pero debería servirle para empezar.
Una vez que hayas calculado con éxito los puntos de datos, puedes simplemente dibujar las formas usando comandos tikz como este:\fill[red] (0,-1) -- (1,0) -- (0,1) -- (-1,0) -- cycle;
Otra posibilidad es tener las líneas y calcular un color píxel a píxel para la imagen (mapa de bits). Esto puede ser mucho mejor si tienes una k
imagen grande pero pequeña.
Ofrecí una recompensa por su pregunta con la esperanza de encontrar un enfoque mejor que el anterior. Sin suerte.