🎨 Графическое программирование на C#

← Вернуться к модулю 6

Урок 6.3: Процедурная генерация

Модуль 6 ⏱️ ~2 часа

Шум Перлина

Шум Перлина используется для генерации естественно выглядящих текстур и паттернов.

// Упрощенная версия шума Перлина
private float Noise(int x, int y)
{
    int n = x + y * 57;
    n = (n << 13) ^ n;
    return (1.0f - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f);
}

private float SmoothNoise(float x, float y)
{
    int intX = (int)x;
    int intY = (int)y;
    float fracX = x - intX;
    float fracY = y - intY;
    
    float v1 = Noise(intX, intY);
    float v2 = Noise(intX + 1, intY);
    float v3 = Noise(intX, intY + 1);
    float v4 = Noise(intX + 1, intY + 1);
    
    float i1 = Interpolate(v1, v2, fracX);
    float i2 = Interpolate(v3, v4, fracX);
    return Interpolate(i1, i2, fracY);
}

private float Interpolate(float a, float b, float t)
{
    return a + (b - a) * t * t * (3 - 2 * t);
}

Генерация текстур

private Bitmap GenerateTexture(int width, int height)
{
    Bitmap texture = new Bitmap(width, height);
    float scale = 0.1f;
    
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            float noise = SmoothNoise(x * scale, y * scale);
            int gray = (int)((noise + 1) * 127.5f);
            texture.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
        }
    }
    
    return texture;
}

Случайные узоры

private void GeneratePattern(Graphics g, int width, int height)
{
    Random rnd = new Random();
    
    for (int i = 0; i < 1000; i++)
    {
        int x = rnd.Next(width);
        int y = rnd.Next(height);
        int size = rnd.Next(5, 20);
        Color color = Color.FromArgb(
            rnd.Next(256), rnd.Next(256), rnd.Next(256));
        
        using (SolidBrush brush = new SolidBrush(color))
        {
            g.FillEllipse(brush, x, y, size, size);
        }
    }
}

Практика: генератор фонов

Создайте генератор фонов, который создает:

  • Градиентные фоны
  • Текстуры на основе шума
  • Абстрактные узоры
  • Возможность сохранения

Практическое задание

Задание: Процедурная генерация

  1. Реализуйте генератор текстур используя шум Перлина
  2. Создайте различные типы текстур (дерево, камень, облака)
  3. Добавьте возможность сохранения сгенерированных текстур

Проверка знаний

Ответьте на вопросы, чтобы проверить, насколько хорошо вы усвоили материал:

1. Усвоили ли вы основные концепции урока?
  • Да, материал понятен
  • Частично понятен
  • Нужно повторить
  • Не понял
2. Готовы ли вы применить изученное на практике?
  • Нет, нужно еще изучить
  • Да, готов попробовать
  • Возможно
  • Не уверен
3. Что такое шум Перлина?
  • Алгоритм генерации естественно выглядящего шума
  • Тип изображения
  • Фильтр размытия
  • Метод сжатия