【发布时间】:2020-03-03 11:31:28
【问题描述】:
我需要一个八面体中的随机点,均匀分布。我将八面体定义为所有点都满足abs(x) + abs(y) + abs(z) <= 1 的体积,其中 abs 给出绝对值。 IE:六个顶点中的每一个都在一个轴上,距离 0,0,0 1。也许你可以称它为单位八面体。
考虑到定义,我可以天真地生成一个点,如下所示:
val x: Double = nextDouble() // 0-1 range
val y = nextDouble(1.0 -x) // 1-x is upper bound, probably <1
val z = nextDouble(1.0 -(x+y))
问题在于这倾向于较小的 y 值和较小的 z 值。显然不是均匀分布。同样清楚的是,所有这些点都在八个象限之一中。
我避免使用 discard 方法,因为这个函数会被大量调用,而且看起来我应该能够做得比丢掉大部分分数更好。
请注意,dual of the octahedron 是立方体。正因为如此,我有一个暗示,可能存在一个简单的函数来将立方体内的任何点转换为八面体内,但这只是我仍在探索的直觉。
【问题讨论】: