C 在平面上反射晶格上的点
我有一个尺寸为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之间,具体取决于切口和反射场地的输出 把平面写成方程 我宁愿谈论这些平面的法线,而不是“斜率”。我理解你的问题的方式是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切口可以通过任
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。