将平面写成方程
我宁愿谈论这些平面的法线,而不是“斜坡”。所以我理解你的问题的方式,你有
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²
将是1
或2
,因此2/(a*a + b*b + c*c)
始终是整数。