
私はTikZを使って2次元格子のブリルアンゾーンを描こうとしているのですが、これまで試したことではあまりうまくいきませんでした。ブリルアンゾーンは基本的に、格子内の点の周りの空間領域で、その点に最も近い領域なので、ボロノイ図1 番目、2 番目、3 番目のブリルアン ゾーンが描かれた次の画像で、これらがどのように見えるかを確認できます。
(ソース:イーレベックス)
これを手で描くとしたら、格子の中心点から中心点から 1 の距離にある各点 (格子点は単位距離で離れているとする) まで線を引いて、最初のブリルアンゾーンを作成します。つまり、中心点の北、東、南、西にある点になります。次に、これらの各線の垂直二等分線 (物理学の用語ではブラッグ平面) を取ります。最初のブリルアンゾーンは、垂直二等分線で囲まれた領域 (上の画像で灰色で塗りつぶされた領域) になります。より高いゾーンも同様に作成されますが、少し異なる説明が示されています。このサイトではAsymptote にもコードがありますが、ハードコードされているだけのようです。
これを TikZ で実行する方法はありますか? また、任意の格子と任意の数のブリルアン ゾーンの両方で実行する方法はありますか? Lua (私はあまり詳しくありません) で実行しようとしたことも含め、いくつかのアプローチを試しましたが、成功しませんでした。実際に機能しているのは、格子点を描画する方法だけです。ここでは、正方格子用として示しましたが、これを変更して六角格子にすることはそれほど難しくありません。
\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}
答え1
これを TikZ で実行する方法はありますか? また、任意の格子と任意の数のブリルアンゾーンの両方で実行する方法はありますか?
短い答え:はい!
より長い答え:いいえ!このタスクは、高い値の場合、計算コストが非常に高くなる可能性があります。コンパイルするたびに最初からやり直したくないと思うので、計算と表示を分離する必要があります。また、それを別々に行う場合は、特定の格子に対して以前に計算したものを簡単に保存して使用できる、より適切なツールを使用しないのはなぜでしょうか。
より詳しい回答「はい」の部分ここに、うまく機能し、LaTeX で実装できる可能性のあるアルゴリズムを示します (ただし、実際には実装すべきではありません)。この説明は、色付けの「閉じた式」を実際に示唆するものではないため (おそらく、そのような式は存在しません)、少し「ハッキー」です。
次のようにすればうまくいくと思います。そして、この記述はアルゴリズムの帰納的な性質に基づいています。
- 垂直二等分線を計算します。
- 二等分線の各ペアの交差(存在する場合)を計算します。
- 作成するデータ構造交差点ごとにインデックスが付けられ、交差点を通過する線のリストが含まれます。
k=0
内側の正方形 ( square )からエッジ リストを作成します。 としますk=1
。- エッジリストと交差点に基づいて(ここでベクトルとその積の無限の楽しみ) は、ハル上のすべてのエッジで CW (時計回り) (
k
偶数の場合は CCW) に開始し、k
戻るまで毎回左端 (偶数の場合は右端) に進みます。これで、 の領域ができましたk
。これをすべてのエッジに対して実行します。新しい (ハル) エッジ リストを保存し、次の反復で使用します。手順 3 で作成したインデックスを使用して、交差点からどこへ移動できるか、およびどれが左端 (右端) であるかを決定できます。 - 1 つずつ増やして
k
、5 ~ 6 回を必要なだけ繰り返します。
これはアルゴリズム的にいくつかの方法で改善できますが、まずはこれで始めることができます。
データ ポイントを正常に計算したら、次のように tikz コマンドを使用して図形を描画できます。\fill[red] (0,-1) -- (1,0) -- (0,1) -- (-1,0) -- cycle;
もう 1 つの可能性は、線を取得して、(ビットマップ) イメージのピクセルごとに色を計算することです。これは、k
画像が大きくても小さい場合、はるかに効果的です。
上記よりも良いアプローチを期待して、あなたの質問に懸賞金をかけました。残念ながらダメでした。