
Estou tentando fazer com que o TikZ desenhe zonas de Brillouin para redes bidimensionais, mas não tive muita sorte até agora com nada que tentei. As zonas de Brillouin são, basicamente, a área do espaço em torno de um ponto na rede que está mais próximo desse ponto e, portanto, são semelhantes aDiagramas de Voronoi. Você pode ver como são nesta imagem, que tem a primeira, a segunda e a terceira zonas de Brillouin desenhadas:
(fonte:eelvex.net)
Se eu desenhasse isso à mão, construiria a primeira zona de Brillouin desenhando uma linha do ponto central na rede até cada um dos pontos a uma distância de 1 (considerando os pontos da rede separados por uma unidade de distância) do ponto central, então seriam aqueles ao norte, leste, sul e oeste dele. Então eu pegaria as bissetoras perpendiculares (no jargão da física, são planos de Bragg) de cada uma dessas retas. A primeira zona de Brillouin seria então a área delimitada pelas bissetrizes perpendiculares (e é a área cinza sombreada na imagem acima). As zonas mais altas são construídas da mesma forma; uma explicação ligeiramente variante é dadanesse site. Ele também possui código em Asymptote, mas parece estar apenas codificado.
Existe uma maneira de fazer isso em TikZ, e existe uma maneira de fazer isso tanto para qualquer rede quanto para qualquer número de zonas de Brillouin? Eu tentei algumas abordagens, sem sucesso, incluindo várias tentativas de fazer isso com Lua (nas quais não sou proficiente), mas a única coisa que realmente tenho funcionando é uma maneira de desenhar os pontos da rede, que eu tenho incluído aqui para uma rede quadrada, mas não é muito difícil modificá-la para obter uma rede 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}
Responder1
Existe uma maneira de fazer isso em TikZ, e existe uma maneira de fazer isso tanto para qualquer rede quanto para qualquer número de zonas de Brillouin?
Resposta curta:Sim!
Resposta mais longa:Não!Esta tarefa pode ser computacionalmente muito cara para valores altos. Você deve separar o cálculo da exibição porque (suponho) você não deseja começar do zero toda vez que compilar. E se você fizer isso separadamente, por que não usa uma ferramenta mais adequada para aquela que pode facilmente armazenar e usar coisas previamente calculadas para qualquer rede?!
Resposta mais longa noparte "Sim". Aqui está um algoritmo que pode funcionar e pode ser implementado em LaTeX (mas realmente não deveria). É um pouco "hacky" porque esta descrição não implica realmente uma "fórmula fechada" para colorir (e talvez não exista).
Acho que o seguinte deve funcionar. E esta afirmação é baseada na natureza indutiva do algoritmo.
- Calcule as bissetoras perpendiculares.
- Calcule a interseção (se houver) para cada par de bissetoras.
- Criar umaestrutura de dadosque é indexado pelas interseções e possui uma lista para cada uma com as linhas que passam por ela.
- Crie uma lista de arestas a partir do quadrado interno (
k=0
quadrado). Deixark=1
. - Com base na lista de arestas e interseções (aí vem adiversão sem fim com vetores e seus produtos cruzados) comece em cada borda do casco no sentido horário (sentido horário) (sentido anti-horário se
k
for par) e vá para a esquerda (extrema direita sek
for par) todas as vezes, até voltar. Agora você tem uma área parak
. Faça isso para cada aresta. Armazene a nova lista de arestas (casco) e use-a na próxima iteração. Você pode decidir para onde ir a partir de uma interseção e qual é o mais à esquerda (mais à direita) usando o índice criado na etapa 3. - Aumente
k
em um e repita 5-6 pelo tempo que desejar.
Isso pode ser melhorado algoritmicamente de várias maneiras, mas você deve começar.
Depois de calcular com sucesso os pontos de dados, você pode simplesmente desenhar as formas usando comandos tikz como este:\fill[red] (0,-1) -- (1,0) -- (0,1) -- (-1,0) -- cycle;
Outra possibilidade é ter as linhas e calcular uma cor pixel por pixel para a imagem (bitmap). Isso pode ser muito melhor se você tiver uma k
imagem grande, mas pequena.
Ofereci uma recompensa pela sua pergunta, esperando uma abordagem melhor do que a acima. Sem sorte.