在 TikZ 中绘制布里渊区

在 TikZ 中绘制布里渊区

我正在尝试让 TikZ 绘制二维晶格的布里渊区,但到目前为止,我尝试过的所有方法都没有成功。布里渊区基本上是晶格中距离该点最近的点周围的空间区域,因此类似于Voronoi 图您可以在以下图像中看到它们的样子,其中绘制了第一、第二和第三布里渊区: 前三个布里渊区
(来源: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 中实现(但实际上不应该)。它有点“黑客”,因为这个描述实际上并没有暗示着色的“封闭公式”(也许没有)。

我认为下面的应该可行。并且这个陈述是基于算法的归纳性质的。

  1. 计算垂直平分线。
  2. 计算每对角线的交点(如果有的话)。
  3. 创建一个数据结构它按交叉点进行索引,并为每个交叉点创建一个列表,其中包含经过它的线。
  4. k=0从内部正方形(正方形)创建边列表。设k=1
  5. 根据边列表和交叉点(这里是向量及其叉积的无穷乐趣) 从船体上的每条边开始顺时针(如果是偶数,则逆时针) ,每次都k向最左边(如果是偶数,则向最右边)移动,直到返回。现在您有一个区域。对每条边执行此操作。存储新的(船体)边列表,并在下一次迭代中使用它。您可以使用在步骤 3 中创建的索引来确定从交叉点可以去哪里以及哪个是最左边(最右边)。kk
  6. 每次增加k一,并根据需要重复 5-6 次。

这可以通过多种方式在算法上进行改进,但应该可以帮助您入门。

成功计算数据点后,您可以使用 tikz 命令绘制形状,如下所示:\fill[red] (0,-1) -- (1,0) -- (0,1) -- (-1,0) -- cycle;

另一种可能性是使用线条并逐像素计算 (位图) 图像的颜色。如果您的k图片很大但很小,这种方法会更好。


我已经为您的问题提供了悬赏,希望能找到比上述更好的方法。但没有成功。

相关内容