我在OpenGL的书籍/教程中有以下C ++代码:
for (int i = 0; i < 256; i++)
{
droplet_x_offset[i] = random_float() * 2.0f - 1.0f;
droplet_rot_speed[i] = (random_float() + 0.5f) * ((i & 1) ? -3.0f : 3.0f);
droplet_fall_speed[i] = random_float() + 0.2f;
}
现在我已经尝试将其转换为Java,而且大部分都是微不足道的:
Random random = new Random();
for (int i = 0; i < 256; i++) {
dropletXSpeed[i] = random.nextFloat() * 2.0f - 1.0f;
dropletRotSpeed[i] = (random.nextFloat() + 0.5f) * ((i & 1) ? -3.0f : 3.0f);
dropletFallSpeed[i] = random.nextFloat() + 0.2f;
}
除了Java不接受((i & 1) ? -3.0f : 3.0)
并且消息:
不兼容的类型:int无法转换为boolean 。
有人可以解释一下(i & 1
)到底是做什么以及如何在Java中替换它?
答案 0 :(得分:3)
与C / C ++不同,Java条件必须求值为布尔值。
例如:
int i = 1;
if (i) { ... }
在java中无效。
你的三元组必须是:
(i & 1) != 0 ? -3.0f : 3.0f;
答案 1 :(得分:1)
使用三字符不如简单情况的公式有效。这是因为分支遗漏是如此昂贵。你也可以这样做。
(3 - 6 * (i & 1))
如果i
为偶数,则为3;如果为奇数,则为-3。
注意:因为你有一个循环,所以有一个更简单的解决方案。
for (int i = 0; i < 256; i += 2) {
dropletXSpeed[i] = random.nextFloat() * 2.0f - 1.0f;
dropletXSpeed[i+1] = random.nextFloat() * 2.0f - 1.0f;
dropletRotSpeed[i] = (random.nextFloat() + 0.5f) * 3.0f;
dropletRotSpeed[i+1] = (random.nextFloat() + 0.5f) * -3.0f;
dropletFallSpeed[i] = random.nextFloat() + 0.2f;
dropletFallSpeed[i+1] = random.nextFloat() + 0.2f;
}
BTW nextFloat()相当昂贵。如果你不需要24位随机性,你可以试试这样的东西。
public float next8bitFloat() {
return random.nextInt(256) * (1.0 / 256);
}