
我正在嘗試讓 TikZ 為二維晶格繪製布里淵區,但到目前為止我嘗試過的任何事情都沒有太多運氣。布里淵區基本上是晶格中最接近該點的點周圍的空間區域,因此類似於沃羅諾伊圖。您可以在該圖像中看到它們的樣子,其中繪製了第一、第二和第三布里淵區:
(來源:eelvex.net)
如果我要手繪它,我會透過從晶格中的中心點到每個點的距離為 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 中實現(但實際上不應該)。這有點“hacky”,因為這個描述並不真正暗示著色的“封閉公式”(也許不存在)。
我認為以下應該有效。而這種說法是基於演算法的歸納性質。
- 計算垂直平分線。
- 計算每對平分線的交集(如果有)。
- 創建一個資料結構它由交叉點索引,並且每個交叉點都有一個列表以及穿過它的線。
- 從內部正方形(
k=0
square)建立一個邊列表。讓k=1
。 - 基於邊列表和交叉點(這裡是向量及其叉積帶來無限樂趣)從船體的每條邊開始順時針(順時針)(如果是偶數則逆時針),每次都
k
走到最左邊(如果是偶數則最右邊),直到你回來。k
現在你有了一個區域k
。對每個邊緣都這樣做。儲存新的(外殼)邊緣列表,並在下一次迭代中使用它。您可以使用步驟 3 中建立的索引來決定從交叉路口可以去哪裡以及哪一個是最左邊(最右邊)。 - 增加
k
1 次,然後根據需要重複 5-6 次。
這可以透過多種方式在演算法上進行改進,但應該可以幫助您入門。
成功計算資料點後,您可以使用 tikz 指令繪製形狀,如下所示:\fill[red] (0,-1) -- (1,0) -- (0,1) -- (-1,0) -- cycle;
另一種可能性是擁有線條並逐像素計算(點陣圖)影像的顏色。如果您有一張大k
而小的圖片,這會更好。
我對你的問題提供了懸賞,希望能找到比上述更好的方法。沒有運氣。