由具有整数坐标的 3 个点定义的平面的明确可散列表示
Unambiguous hashable representation for plane defined by 3 points with integer coordinates
我需要能够将平面用作哈希映射中的键。这些平面由 3d space 中的三个不同点定义。我一直无法找到一个平面的表示,无论用它上面的哪些点来构造它都是一样的,所以它可以被散列。平面方程出来了,因为它会导致使用浮点数,不精确。
相等比较可以在没有这种表示的情况下实现,但理想情况下,不需要特殊逻辑。
问题是如何为由具有整数坐标的三个点定义的平面获得明确的可散列表示;或失败的是这样一个平面的哈希函数。代表同一平面的其他三个点应该具有相同的哈希码。
我用的是rust,伪代码没问题。性能是一个问题。
有三个点P0, P1, P2
,我们可以使用两个向量
P10 = P1 - P0
P20 = P2 - P0
并使用向量乘积获得正常值:
N = P10 x P20
N
个分量是整数。然后计算Nx, Ny, Nz
的GCD(最大公约数),将分量相除,使它们互质(如果这个ter,适用于三个值,或许“不可约”)
G = GCD(GCD(Nx, Ny), Nz)
A = Nx / G //integer division
B = Ny / G
C = Nz / G
最后找到通用平面方程的第 4 个分量,将任何点分量(比如 P0
)代入方程
A * P0x + B * P0y + C * P0z + D = 0
D = - (A * P0x + B * P0y + C * P0z)
肯定D
是整数,所有系数互为prime/irreducible,所以元组(A,B,C,D)
是一种“归一化”的平面方程
这个方程和任何带比例系数的方程都表示同一平面,可用于检查某个点 P
是否属于给定平面。
if (A * Px + B * Py + C * Pz + D == 0)...
我需要能够将平面用作哈希映射中的键。这些平面由 3d space 中的三个不同点定义。我一直无法找到一个平面的表示,无论用它上面的哪些点来构造它都是一样的,所以它可以被散列。平面方程出来了,因为它会导致使用浮点数,不精确。
相等比较可以在没有这种表示的情况下实现,但理想情况下,不需要特殊逻辑。
问题是如何为由具有整数坐标的三个点定义的平面获得明确的可散列表示;或失败的是这样一个平面的哈希函数。代表同一平面的其他三个点应该具有相同的哈希码。
我用的是rust,伪代码没问题。性能是一个问题。
有三个点P0, P1, P2
,我们可以使用两个向量
P10 = P1 - P0
P20 = P2 - P0
并使用向量乘积获得正常值:
N = P10 x P20
N
个分量是整数。然后计算Nx, Ny, Nz
的GCD(最大公约数),将分量相除,使它们互质(如果这个ter,适用于三个值,或许“不可约”)
G = GCD(GCD(Nx, Ny), Nz)
A = Nx / G //integer division
B = Ny / G
C = Nz / G
最后找到通用平面方程的第 4 个分量,将任何点分量(比如 P0
)代入方程
A * P0x + B * P0y + C * P0z + D = 0
D = - (A * P0x + B * P0y + C * P0z)
肯定D
是整数,所有系数互为prime/irreducible,所以元组(A,B,C,D)
是一种“归一化”的平面方程
这个方程和任何带比例系数的方程都表示同一平面,可用于检查某个点 P
是否属于给定平面。
if (A * Px + B * Py + C * Pz + D == 0)...