Perlin Noise Generator

    • C#
    • .NET (FX) 4.5–4.8

      Perlin Noise Generator

      Hallo, ich habe neulich etwas schlau gemacht zu dem Perlin Noise Generator, da dieser oft genutzt wird um Level in spiele procendual zu generieren. Nach mehreren Fragen an ChatGPT und Optimierungen meinerseits, habe ich ein sehr brauchbares Script nun zusammen gestellt.



      C#-Quellcode

      1. private static float Noise(int x, int y, int seed)
      2. {
      3. int n = x + y * 57 + seed;
      4. n = (n << 13) ^ n;
      5. return (1.0f - ((n * (n * n * 15731 + 789221) + seed) & 0x7fffffff) / 1073741824.0f);
      6. }
      7. private static float SmoothedNoise(float x, float y, int seed)
      8. {
      9. int integer_X = (int)x;
      10. float fractional_X = x - integer_X;
      11. int integer_Y = (int)y;
      12. float fractional_Y = y - integer_Y;
      13. float v1 = Noise(integer_X, integer_Y, seed);
      14. float v2 = Noise(integer_X + 1, integer_Y, seed);
      15. float v3 = Noise(integer_X, integer_Y + 1, seed);
      16. float v4 = Noise(integer_X + 1, integer_Y + 1, seed);
      17. float i1 = Interpolate(v1, v2, fractional_X);
      18. float i2 = Interpolate(v3, v4, fractional_X);
      19. return Interpolate(i1, i2, fractional_Y);
      20. }
      21. public static float PerlinNoise(float x, float y, float persistence, int octaves, int seed)
      22. {
      23. float total = 0;
      24. float frequency = 0.1f;
      25. float amplitude = 1;
      26. float maxValue = 0;
      27. for (int i = 0; i < octaves; i++)
      28. {
      29. total += SmoothedNoise(x * frequency, y * frequency, seed) * amplitude;
      30. maxValue += amplitude;
      31. amplitude *= persistence;
      32. frequency *= 2;
      33. }
      34. return total / maxValue;
      35. }
      36. private static float Interpolate(float a, float b, float x)
      37. {
      38. float ft = x * 3.1415927f;
      39. float f = (1 - (float)Math.Cos(ft)) * 0.5f;
      40. return a * (1 - f) + b * f;
      41. }
      42. public void GenerateNoise()
      43. {
      44. int width = 256;
      45. int height = 256;
      46. int seed = int.Parse(this.textBox1.Text);
      47. Bitmap bitmap = new Bitmap(width, height);
      48. for (int y = 0; y < height; y++)
      49. {
      50. for (int x = 0; x < width; x++)
      51. {
      52. float perlinValue = PerlinNoise(x, y, 0.5f, 4, seed);
      53. Color color;
      54. color = Color.Blue;
      55. if (perlinValue > 0f)
      56. {
      57. color = Color.Green;
      58. }
      59. bitmap.SetPixel(x, y, color);
      60. Console.Write(perlinValue.ToString("0.00") + " ");
      61. }
      62. Console.WriteLine();
      63. this.pictureBox1.Image = bitmap;
      64. }
      65. }


      In der GenerateNoise methode, wird die Noisemap erstellt. Die zwei schleifen, gehen die Punkte von Oben Links, nach Unten Rechts durch. Weitere Anpassungen kann man in den Parametern und der Variabeln in der PerlinNoise methode vornehmen. So kann man z.b. die Frequenz ändern, was dafür sorgt, dass die Fragmente oder Muster größer sind.