C 在平面上反射晶格上的点

C 在平面上反射晶格上的点,c,algorithm,math,formula,mathematical-lattices,C,Algorithm,Math,Formula,Mathematical Lattices,我有一个尺寸为lx*ly*lz的三维晶格,三面都有周期性的边界条件。 我的平面对称切割是两个水平和垂直平面(坡度0和inf)加上两个垂直于xy平面、yz平面和xz平面的对角线切割(坡度-1和+1)。我一共有9种类型的平面,它们都通过晶格点,而不是在晶格点之间 每个切口都可以在垂直于它们的平面上的任何位置穿过。例如,垂直于xy平面的坡度0切割可以通过任意ly点。垂直于xy平面的坡度inf挖方可以通过任何lx点。垂直于xy平面的坡度+1切口可以通过任何lx交点。垂直于xy平面的坡度-1切口可以通过任

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

每个切口都可以在垂直于它们的平面上的任何位置穿过。例如,垂直于xy平面的坡度0切割可以通过任意ly点。垂直于xy平面的坡度inf挖方可以通过任何lx点。垂直于xy平面的坡度+1切口可以通过任何lx交点。垂直于xy平面的坡度-1切口可以通过任意Y相交

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

该算法应采用三种输入:场地i、切口c的类型和切口通过的交点,介于0和lx-1或0、ly-1或0和lz-1之间,具体取决于切口和反射场地的输出

把平面写成方程 我宁愿谈论这些平面的法线,而不是“斜率”。我理解你的问题的方式是

xy平面,坡度0⇒ 正常(0,1,0)
xy平面、坡度∞ ⇒ 正常(1,0,0)
xy平面,坡度1⇒ 正常(1,-1,0)
xy平面,坡度-1⇒ 正常(1,1,0)
xz平面,坡度0⇒ 正常(0,0,1)
xz平面、坡度∞ ⇒ 正常(1,0,0)
xz平面,坡度1⇒ 正常(1,0,-1)
xz平面,坡度-1⇒ 正常(1,0,1)
yz平面,坡度0⇒ 正常(0,0,1)
yz平面、坡度∞ ⇒ 正常(0,1,0)
yz平面,坡度1⇒ 正常(0,1,-1)
yz平面,坡度-1⇒ 正常(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
,其他两个类似。对于对角线平面,你的(在我看来很奇怪)截距规则适用。如果我没有弄错的话,
(1,-1,0)
平面可以通过
x
轴上的任何点,从而导致
0≤ d
(1,1,0)
平面可以通过
y
轴上的任何点,因此您将拥有
0≤ d
。对于其他对角线,请自己算出
d
的界限

在这样的平面上反射 现在你有了一个平面的方程,想在这个平面上反射。这里基本上是正确的事情,但你可能更喜欢这个想法的简单表述。首先,将平面的方程改写为

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代码编写:

intf=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²
将是
1
2
,所以
2/(a*a+b*b+c*c)
将始终是一个整数。

这个问题似乎更适合于看,householder变换对这个问题来说不是一种过度的杀伤力。。。我正在寻找一个简单和优化的解决方案implementation@Woodface我想做一个关于一个随机选择的对称网站的反映。然后转到一个新的随机位置和一个新的对称。每次计算所有站点的householder矩阵是完全不必要的,并且由于内存限制,存储所有对称的householder矩阵是不可能的,因为我需要非常大的晶格尺寸。矩阵的大小为3×3。