C# 改进的噪波版本不断返回0
我试图在我的XNA游戏中实现改进的噪波,但改进的噪波函数始终返回0.0f。它与Ken Perlin()的代码完全相同,只是移植到了C 我尝试过重写这个类,甚至直接从站点复制和粘贴(当然,然后移植到C#),但它只会输出0以外的值 以下是我正在使用的代码:C# 改进的噪波版本不断返回0,c#,random,xna,noise,perlin-noise,C#,Random,Xna,Noise,Perlin Noise,我试图在我的XNA游戏中实现改进的噪波,但改进的噪波函数始终返回0.0f。它与Ken Perlin()的代码完全相同,只是移植到了C 我尝试过重写这个类,甚至直接从站点复制和粘贴(当然,然后移植到C#),但它只会输出0以外的值 以下是我正在使用的代码: public class PerlinNoise { private int[] permutations = new int[512]; private Random random; publ
public class PerlinNoise
{
private int[] permutations = new int[512];
private Random random;
public PerlinNoise()
: this(Environment.TickCount)
{ }
public PerlinNoise(int seed)
{
random = new Random(seed);
for (int i = 0; i < 256; i++)
{
permutations[i] = i;
}
for (int i = 0; i < 256; i++)
{
int k = random.Next(256 - i) + i;
int l = permutations[i];
permutations[i] = permutations[k];
permutations[k] = l;
permutations[i + 256] = permutations[i];
}
}
private int fastfloor(float x)
{
return x > 0 ? (int)x : (int)x - 1;
}
private float fade(float t)
{
return t * t * t * (t * (t * 6 - 15) + 10);
}
private float lerp(float t, float a, float b)
{
return a + t * (b - a);
}
public float grad(int hash, float x, float y, float z)
{
int h = hash & 15;
float u = h < 8 ? x : y,
v = h < 4 ? y : h == 12 || h == 14 ? x : z;
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}
public float noise3d(float x, float y, float z)
{
int X = fastfloor(x) & 0xff,
Y = fastfloor(y) & 0xff,
Z = fastfloor(z) & 0xff;
x -= fastfloor(x);
y -= fastfloor(y);
z -= fastfloor(z);
float u = fade(x);
float v = fade(y);
float w = fade(z);
int A = permutations[X] + Y, AA = permutations[A] + Z, AB = permutations[A + 1] + Z,
B = permutations[X + 1] + Y, BA = permutations[B] + Z, BB = permutations[B + 1] + Z;
return lerp(w, lerp(v, lerp(u, grad(permutations[AA], x, y, z),
grad(permutations[BA], x - 1, y, z)),
lerp(u, grad(permutations[AB], x, y - 1, z),
grad(permutations[BB], x - 1, y - 1, z))),
lerp(v, lerp(u, grad(permutations[AA + 1], x, y, z - 1),
grad(permutations[BA + 1], x - 1, y, z - 1)),
lerp(u, grad(permutations[AB + 1], x, y - 1, z - 1),
grad(permutations[BB + 1], x - 1, y - 1, z - 1))));
}
public float noise2d(float x, float y)
{
return noise3d(x, y, 0f);
}
} `
正如我上面所说,它总是输出0。如果所有参数都是整数,它似乎输出
0.0f
。将测试代码更改为
var input = Console.ReadLine()
.Split(' ')
.Select(s => float.Parse(s,
System.Globalization.CultureInfo.InvariantCulture))
.ToArray();
然后尝试输入,例如,4234.2123 3123.12312 423.2434
我不太确定这是否是你想要的行为,但是
x -= Math.Floor(x); // FIND RELATIVE X,Y,Z
y -= Math.Floor(y); // OF POINT IN CUBE.
z -= Math.Floor(z);
如果它们是整数,则将始终使
x
,y
和z
=0<代码>淡入度(0.0f)也始终为零。将输入乘以(1/MAX\u值)
在您的输入情况下,只需乘以1/256左右,并且永远不要给出大于该值的值。在游戏中使用时,将输入乘以(1/最大值)
,不幸的是,它仍将返回0,除非值为小数或非常极端。因为我将只对积分坐标使用柏林噪声,所以这对我来说并不适用。
x -= Math.Floor(x); // FIND RELATIVE X,Y,Z
y -= Math.Floor(y); // OF POINT IN CUBE.
z -= Math.Floor(z);