-1

如果我在一个球体周围有一组随机浮点数(0.0f - 1.0f)(甚至在 2D 网格上也可以),每个浮点数与它们的邻居仅相差约 0.1f,有没有办法转换这些浮动到,比如说颜色,每个颜色的 RGB 值也只与它们的邻居相差大约 0.1f,其方式(基本上)获得任何颜色的可能性相同(所以某些颜色不会偏向于其他颜色)?

我使用的方法是这样,在每个顶点的最终偏移完成后,我将所有偏移缩小到从 0.0 到 1.0 的浮点值,其中这些浮点值仍然反映值的初始分布。如果有帮助,我可以发布代码片段,或者如果您只是好奇,它们正在编辑中。

这是一个潜在的答案,谢谢 Hot Licks!不过,提供更均匀分布的东西可能会很好。尽管如此,这是一个开始(而且它本身有点酷),是的,谢谢!

Random randomGen = new Random();

int randomOne = randomGen.nextInt(256);
int randomTwo = randomGen.nextInt(256);
int randomThree = randomGen.nextInt(256);

float offsets[] = new float[vertices.length];

... // Calcuate the offsets via the method described in that article (code is in the edits if you're curious)

for(int i = 0; i < vertices.length; i++)
{
    float randomFloat = offsets[i];

    float r = (float)((int)(offsets[i]*255.0) ^ randomOne)/255.0f;
    float b = (float)((int)(offsets[i]*255.0) ^ randomTwo)/255.0f;
    float g = (float)((int)(offsets[i]*255.0) ^ randomThree)/255.0f;
}

编辑:删除了很多额外的东西,并得到了问题的实质。如果您对代码片段或其他相关信息感到好奇,您可以看到编辑,但这确实是我要问的大部分内容。

编辑编辑:添加(部分)解决方案代码片段。

4

3 回答 3

0

有没有办法可以将单个浮点值转换为 n 个浮点值,每个浮点值(基本上)彼此无关并反映相同的分布?

不,要求是矛盾的。

如果您采用单个浮点值并以确定的方式从中生成 N 个其他浮点数,那么它们将按定义相关。并且也是高度可预测的......给定第一个值。

我唯一能想到的就是尝试找到一个更便宜的随机数生成器。(例如,使用 SecureRandom 生成器将是一个错误……如果这是您当前正在做的事情。)


随机性的关键是生成随机数不是问题(我使用的是一个非常快速的随机数生成器),它在球体上以平滑的分布生成它们,所以加速它并不是真正的我认为不会降低分发质量的选项。我的随机方法非常优化,本质上它很慢。

好吧,我仍然认为答案是一样的……除非你能找到某种方法来加速“球体周围的分布”问题。(显然,您可以利用旋转对称性......但同样明显的是,这会产生明显的非随机结果。)

于 2013-01-27T04:05:24.887 回答
0

嗯,我想你想要的是 nextGaussian()。

另一种选择是,从类别剧本中取出一页,将颜色视为代表光谱上的一个点,然后您获取一个随机数并在一次操作中找到相应的颜色。因此,为了论证,假设您从 RGB 值中制作了 100 种颜色,其中第一种颜色是 R:256 G:0 B:0 到 R:0 G:0 B:256。如果有 100 个,那么你得到你的随机 #,并说它是 0.56,你去得到数组中的第 56 个 #。

于 2013-01-27T04:23:12.030 回答
-1

我不知道您在分布方面需要什么,但我会考虑将连续随机数的分数位模式异或在一起,或者可能只是将随机数与 10 个固定随机模式异或。

但我怀疑这只有在您处理均匀分布时才有效。

于 2013-01-27T04:14:08.073 回答