Trình tạo tiếng ồn của tôi trong C #, dựa trên điều này :
static class NoiseGenerator
{
public static int Seed { get; private set; }
public static int Octaves { get; set; }
public static double Amplitude { get; set; }
public static double Persistence { get; set; }
public static double Frequency { get; set; }
static NoiseGenerator()
{
Random r = new Random();
//LOOOL
NoiseGenerator.Seed = r.Next(Int32.MaxValue);
NoiseGenerator.Octaves = 8;
NoiseGenerator.Amplitude = 1;
NoiseGenerator.Frequency = 0.015;
NoiseGenerator.Persistence = 0.65;
}
public static double Noise(int x, int y)
{
//returns -1 to 1
double total = 0.0;
double freq = NoiseGenerator.Frequency, amp = NoiseGenerator.Amplitude;
for (int i = 0; i < NoiseGenerator.Octaves; ++i)
{
total = total + NoiseGenerator.Smooth(x * freq, y * freq) * amp;
freq *= 2;
amp *= NoiseGenerator.Persistence;
}
if (total < -2.4) total = -2.4;
else if (total > 2.4) total = 2.4;
return (total/ 2.4);
}
public static double NoiseGeneration(int x, int y)
{
int n = x + y * 57;
n = (n << 13) ^ n;
return (1.0 - ((n * (n * n * 15731 + 789221) + NoiseGenerator.Seed) & 0x7fffffff) / 1073741824.0);
}
private static double Interpolate(double x, double y, double a)
{
double value = (1 - Math.Cos(a * Math.PI)) * 0.5;
return x * (1 - value) + y * value;
}
private static double Smooth(double x, double y)
{
double n1 = NoiseGeneration((int)x, (int)y);
double n2 = NoiseGeneration((int)x + 1, (int)y);
double n3 = NoiseGeneration((int)x, (int)y + 1);
double n4 = NoiseGeneration((int)x + 1, (int)y + 1);
double i1 = Interpolate(n1, n2, x - (int)x);
double i2 = Interpolate(n3, n4, x - (int)x);
return Interpolate(i1, i2, y - (int)y);
}
}
Nó không được bình luận, nhưng các phần chính:
Hạt giống là một giá trị được sử dụng để làm cho nó ngẫu nhiên - vì vậy bạn không tạo ra cùng một thứ mỗi lần. Ở đây tôi đã đặt nó trong NoiseGenerator.
Biên độ, tần số, tính bền bỉ và Octaves được giải thích trong bài viết - về cơ bản chúng ảnh hưởng đến những gì tiếng ồn kết quả trông như thế nào.
NoiseGenerator
Hàm có nghĩa đen là một PRNG - cung cấp cho nó một đầu vào và nó tạo ra một số ngẫu nhiên với số đó là một hạt giống.
Noise
là những gì bạn gọi để có được một giá trị tiếng ồn. Tôi tìm thấy các giá trị là khoảng -2,4 đến 2,4 (thực tế là khoảng 2.40032483 hoặc một cái gì đó để chúng được kẹp) và tôi đã sửa chúng thành hai lần giữa -1 and 1
.
Tôi không có bất kỳ vấn đề tốc độ với điều này. Tôi đã kết xuất một lưới 400x400 gồm các họa tiết 1x1 với các giá trị được đặt bởi điều này và chỉ nhận được độ trễ nhỏ (và đó là tính toán lại nhiễu mỗi khung hình).
Đối với thế hệ đảo, hãy xem câu hỏi này - đặc biệt, liên kết này gần như chính xác những gì bạn muốn, mặc dù trong AS3.