gpt4 book ai didi

c# - 改进噪声的版本不断返回 0

转载 作者:行者123 更新时间:2023-11-30 12:34:53 25 4
gpt4 key购买 nike

我试图在我的 XNA 游戏中实现改进的噪声,但我的改进的噪声函数一直返回 0.0f。它与 Ken Perlin 的代码 ( http://mrl.nyu.edu/~perlin/noise/ ) 完全相同,只是移植到 C#。

我试过重写类,甚至直接从站点复制和粘贴(当然,然后移植到 C#),但它只会输出 0 以外的任何值。

这是我正在使用的代码:

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);
}
} `

为了测试它,我只是做了:

string[] args = Console.ReadLine().Split(' '); 

PerlinNoise noise = new PerlinNoise();

int x = args[0];
int y = args[1];
int z = args[2];

Console.WriteLine(noise.noise3d(x, y, z));

正如我上面所说,它总是输出 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 如果它们是整数; fade(0.0f) 也始终为零。

关于c# - 改进噪声的版本不断返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com