
Ich versuche, TikZ dazu zu bringen, Brillouin-Zonen für zweidimensionale Gitter zu zeichnen, aber bisher hatte ich mit nichts, was ich versucht habe, viel Glück. Brillouin-Zonen sind im Grunde der Raumbereich um einen Punkt im Gitter, der diesem Punkt am nächsten ist, und ähneln daherVoronoi-Diagramme. Wie diese aussehen, können Sie in diesem Bild sehen, auf dem die erste, zweite und dritte Brillouin-Zone eingezeichnet ist:
(Quelle:eelvex.net)
Wenn ich dies von Hand zeichnen würde, würde ich die erste Brillouin-Zone konstruieren, indem ich eine Linie vom Mittelpunkt des Gitters zu jedem der Punkte zeichne, die eine Distanz von 1 (wobei die Gitterpunkte durch eine Einheitsdistanz getrennt sind) vom Mittelpunkt entfernt sind, also die Punkte nördlich, östlich, südlich und westlich davon. Dann würde ich die Mittelsenkrechten (in der Physiksprache sind dies Bragg-Ebenen) jeder dieser Linien nehmen. Die erste Brillouin-Zone wäre dann der Bereich, der von den Mittelsenkrechten umschlossen wird (und ist der grau schattierte Bereich im Bild oben). Die höheren Zonen werden auf die gleiche Weise konstruiert; eine leicht abweichende Erklärung wird gegebenauf dieser Seite. Es hat auch Code in Asymptote, aber dieser scheint fest codiert zu sein.
Gibt es eine Möglichkeit, dies in TikZ zu tun, und gibt es eine Möglichkeit, dies sowohl für ein beliebiges Gitter als auch für eine beliebige Anzahl von Brillouin-Zonen zu tun? Ich habe ein paar Ansätze erfolglos ausprobiert, darunter mehrere Versuche, es mit Lua zu tun (was ich sehr unbeherrsche), aber das einzige, was bei mir wirklich funktioniert, ist eine Möglichkeit, die Gitterpunkte zu zeichnen, die ich hier für ein quadratisches Gitter eingefügt habe, aber es ist nicht allzu schwierig, dies zu ändern, um ein hexagonales Gitter zu erhalten.
\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}
Antwort1
Gibt es eine Möglichkeit, dies in TikZ durchzuführen, und gibt es eine Möglichkeit, dies sowohl für jedes beliebige Gitter als auch für eine beliebige Anzahl von Brillouin-Zonen durchzuführen?
Kurze Antwort:Ja!
Längere Antwort:NEIN!Diese Aufgabe kann bei hohen Werten sehr rechenintensiv sein. Sie sollten die Berechnung von der Anzeige trennen, da Sie (vermutlich) nicht jedes Mal bei der Kompilierung von vorne beginnen möchten. Und wenn Sie das separat tun, warum verwenden Sie dafür nicht ein besser geeignetes Tool, das zuvor berechnete Daten für jedes beliebige Gitter problemlos speichern und verwenden kann?!
Längere Antwort auf die"Ja"-Teil. Hier ist ein Algorithmus, der vielleicht funktioniert und in LaTeX implementiert werden kann (aber eigentlich nicht sollte). Er ist ein bisschen „hackig“, weil diese Beschreibung nicht wirklich eine „geschlossene Formel“ für die Farbgebung impliziert (und vielleicht gibt es auch keine).
Ich denke, das Folgende sollte funktionieren. Und diese Aussage basiert auf der induktiven Natur des Algorithmus.
- Berechnen Sie die Mittelsenkrechten.
- Berechnen Sie den Schnittpunkt (sofern vorhanden) für jedes Winkelhalbierende-Paar.
- Ein ... kreierenDatenstrukturwelches nach den Schnittpunkten indiziert ist und für jeden eine Liste mit den durch ihn verlaufenden Linien enthält.
- Erstellen Sie eine Kantenliste aus dem inneren Quadrat (
k=0
Quadrat). Lassen Siek=1
. - Basierend auf der Kantenliste und den Schnittpunkten (hier kommt dieendloser Spaß mit Vektoren und ihren Kreuzprodukten) Beginnen Sie an jeder Kante des Rumpfs im Uhrzeigersinn (CCW, wenn
k
gerade ist) und gehen Siek
jedes Mal ganz nach links (ganz nach rechts, wenn gerade ist), bis Sie zurückkommen. Jetzt haben Sie einen Bereich fürk
. Machen Sie das für jede Kante. Speichern Sie die neue (Rumpf-)Kantenliste und verwenden Sie diese in der nächsten Iteration. Sie können entscheiden, wohin Sie von einer Kreuzung aus gehen können und welche die am weitesten links (am weitesten rechts) ist, indem Sie den in Schritt 3 erstellten Index verwenden. - Erhöhen Sie
k
um eins und wiederholen Sie 5–6, so lange Sie möchten.
Dies kann algorithmisch auf verschiedene Weise verbessert werden, sollte Ihnen aber den Einstieg erleichtern.
Nachdem Sie die Datenpunkte erfolgreich berechnet haben, können Sie die Formen einfach mit Tikz-Befehlen wie diesen zeichnen:\fill[red] (0,-1) -- (1,0) -- (0,1) -- (-1,0) -- cycle;
Eine andere Möglichkeit besteht darin, die Linien zu haben und Pixel für Pixel eine Farbe für das (Bitmap-)Bild zu berechnen. Dies kann viel besser sein, wenn Sie ein großes, k
aber ein kleines Bild haben.
Ich habe für Ihre Frage eine Belohnung ausgesetzt, in der Hoffnung auf eine bessere Lösung als die oben genannte. Kein Glück.