1

我有一个大小为 lx * ly * lz 的格子三维格子,在所有三个边上都有周期性边界条件。我的平面对称切割是两个水平和垂直平面(斜率 0 和 inf)加上两个垂直于 xy 平面、yz 平面和 xz 平面的对角线切割(斜率 -1 和 +1)。所以我一共有 9 种类型的平面,它们都通过格点而不是它们之间。

这些切口中的每一个都可以在垂直于它们的平面上的任何位置穿过。例如,垂直于 xy 平面的斜率 0 可以通过任何 ly 点。垂直于 xy 平面切割的斜率 inf 可以通过任何 lx 点。垂直于 xy 平面的斜率 +1 可以通过任何 lx 相交。垂直于 xy 平面的斜率 -1 可以通过任何 ly 相交。

现在给定点 i 在 0 和 (lx * ly * lz)-1 之间的格子上,我想反映它关于 1 和 9 之间的任意一个随机切割 c。计算反射的最快算法是什么晶格位点最好在“C”中。

该算法应采用三个输入,即站点 i、切割类型 c 以及切割通过的交叉点,介于 0 和 lx-1 或 0 和 ly-1 或 0 和 lz-1 之间,具体取决于切割和输出反射的站点。

4

1 回答 1

2

将平面写成方程

我宁愿谈论这些平面的法线,而不是“斜坡”。所以我理解你的问题的方式,你有

xy plane, slope  0 ⇒ normal (0,  1,  0)
xy plane, slope  ∞ ⇒ normal (1,  0,  0)
xy plane, slope  1 ⇒ normal (1, -1,  0)
xy plane, slope -1 ⇒ normal (1,  1,  0)
xz plane, slope  0 ⇒ normal (0,  0,  1)
xz plane, slope  ∞ ⇒ normal (1,  0,  0)
xz plane, slope  1 ⇒ normal (1,  0, -1)
xz plane, slope -1 ⇒ normal (1,  0,  1)
yz plane, slope  0 ⇒ normal (0,  0,  1)
yz plane, slope  ∞ ⇒ normal (0,  1,  0)
yz plane, slope  1 ⇒ normal (0,  1, -1)
yz plane, slope -1 ⇒ normal (0,  1,  1)

所以这9种平面将对应于法线方向

(1, 0, 0), (0, 1, 0), (0, 0, 1),
(1, 1, 0), (1, 0, 1), (0, 1, 1),
(1, -1, 0), (1, 0, -1), (0, 1, -1)

对于这些方向中的每一个,您可以取法向量(a, b, c)并将其转换为平面方程:

a*x + b*y + c*z = d

但是什么值d是允许的?对于上面的第一行,平行于其中一个坐标平面的平面,事情很简单:因为(a, b, c) = (1, 0, 0)你有0 ≤ d < lx,其他两个类似。对于对角线平面,您的(在我看来很奇怪)拦截规则成立。如果我没听错的话,这些(1, -1, 0)平面可以通过x轴上的任何点,然后再次通向0 ≤ d < lx(1, 1, 0)平面可以通过轴上的任何点,y所以你有0 ≤ d < ly. 对于其他对角线,请自行计算界限d

在这样的平面上倒影

所以现在你有了一个平面的方程,并且想要在那个平面上进行反射。Woodface 提供的链接本质上是在这里考虑的正确事情,但您可能更喜欢该想法的更简单的表述。首先将平面方程改写为

a*x + b*y + c*z - d = 0

如果左侧为零,则给定点不在平面上。在这种情况下,您获得的值与该点与平面的距离成正比。暂时假设a²+b²+c²=1. 在这种情况下,左侧的值确实是与平面的距离。将该数字乘以法线向量(a, b, c),您将获得一个从平面指向相关点的向量。相反,将数量乘以-(a, b, c)得到从点指向平面的向量,乘以-2*(a, b, c)得到从点指向其镜像的向量。

但万一a²+b²+c²≠1呢?在这种情况下,等式左侧的值将sqrt(a²+b²+c²)乘以实际距离。并且你将该距离乘以一个不是单位长度而是长度的sqrt(a²+b²+c²)向量,所以你的最终结果向量将太大a²+b²+c²,总共有一个因子。因此,您所做的就是按该因素进行扩展。

总结一下:在您计算(x, y, z)的平面上反映一个点a*x + b*y + c*z = d

(x, y, z) - 2/(a² + b² + c²)*(a*x + b*y + c*z - d)*(a, b, c)

或用 C 代码编写:

int f = 2/(a*a + b*b + c*c)*(a*x + b*y + c*z - d);
x = x - f*a;
y = y - f*b;
z = y - f*z;

您可以int在此处使用,因为对于您的法线向量,a²+b²+c²将是12,因此2/(a*a + b*b + c*c)始终是整数。

于 2015-03-15T21:53:28.380 回答