Skip to content

Latest commit

 

History

History
249 lines (202 loc) · 10.4 KB

File metadata and controls

249 lines (202 loc) · 10.4 KB

🎨 Fractal Explorer - OpenGL Visualization

Интерактивное приложение для визуализации и исследования фракталов с использованием OpenGL (JOGL).

🌟 Реализованные фракталы

1. Множество Мандельброта (Mandelbrot Set)

  • Формула: z(n+1) = z(n)² + c
  • Итерации: до 1000
  • Зум: до 1e-15
  • Интересные точки:
    • Главное множество: (-0.5, 0.0)
    • Хвост морского конька: (-0.75, 0.1)
    • Долина двойной спирали: (-0.16, 1.0405)

2. Множество Жюлиа (Julia Set)

  • Формула: z(n+1) = z(n)² + c (константный c)
  • Предустановки:
    • Дендриты: c = -0.7 + 0.27015i
    • Кролик Дуади: c = -0.123 + 0.745i
    • Дракон: c = -0.8 + 0.156i
    • Спираль: c = 0.285 + 0.01i

3. Дерево Пифагора (Pythagoras Tree)

  • Рекурсивная структура из квадратов
  • Глубина: до 12 уровней
  • Анимация угла ветвления (30-60°)
  • VBO оптимизация для производительности

4. Снежинка Коха (Koch Snowflake)

  • Кривая Коха на треугольнике
  • Рекурсия: 0-7 уровней
  • VBO для линий
  • Элегантная геометрия

5. Треугольник Серпинского (Sierpinski Triangle)

  • Рекурсивное вычитание центрального треугольника
  • Глубина рекурсии: 0-8 уровней
  • Самоподобная структура
  • Оранжевая цветовая схема

6. Фрактальный ландшафт (Fractal Landscape)

  • Алгоритм Midpoint Displacement
  • Сетка 129x129 точек
  • Изометрическая проекция
  • Цветовая схема по высоте (вода→песок→трава→горы→снег)
  • Параметр шероховатости (roughness): 0.1-1.5

7. Фрактал Ляпунова (Lyapunov Fractal)

  • Показатель Ляпунова для логистического отображения
  • Последовательность переключения параметров (AB, AABB, AAAB и т.д.)
  • Формула: x(n+1) = r * x(n) * (1 - x(n))
  • Цветовая схема: синий (устойчивость) → красный (хаос)
  • 5 интересных предустановок последовательностей

🎮 Управление

Мышь

  • Колесико: Зум in/out (1.2x)
  • Левая кнопка + движение: Панорамирование (drag)
  • Двойной клик: Центрирование на точке

Клавиатура

  • R: Сброс к начальным параметрам
  • +/-: Увеличить/уменьшить итерации (±32)
  • Space: Анимация (для Дерева Пифагора)
  • ESC: Выход из приложения

UI Панель

  • Fractal Selector: Переключение между фракталами
  • Reset: Сброс параметров
  • Iter+/Iter-: Настройка качества
  • FPS Counter: Отображение производительности
  • Info: Текущие параметры фрактала

🏗️ Архитектура

fractals/
├── core/
│   └── Fractal.java            # Базовый абстрактный класс
├── renderers/
│   ├── MandelbrotSet.java      # Множество Мандельброта
│   ├── JuliaSet.java           # Множество Жюлиа
│   ├── PythagorasTree.java     # Дерево Пифагора
│   ├── KochSnowflake.java      # Снежинка Коха
│   ├── SierpinskiTriangle.java # Треугольник Серпинского
│   ├── FractalLandscape.java   # Фрактальный ландшафт
│   └── LyapunovFractal.java    # Фрактал Ляпунова
└── FractalExplorer.java        # Главное приложение

⚡ Оптимизации

Производительность

  1. Адаптивная детализация: Автоматическое уменьшение шага рендеринга при зуме
  2. Early escape: Проверка убегания точек для ускорения вычислений
  3. VBO: Vertex Buffer Objects для геометрических фракталов
  4. MSAA 4x: Сглаживание для улучшения качества

Масштабируемость

  • Модульная архитектура: каждый фрактал - отдельный класс
  • Единый интерфейс через абстрактный класс Fractal
  • Легкое добавление новых фракталов
  • Централизованное управление параметрами

🚀 Запуск

Требования

  • Java 8+
  • JOGL 2.3+
  • OpenGL 2.0+

Компиляция и запуск

# Через Maven
mvn clean compile exec:java -Dexec.mainClass="fractals.FractalExplorer"

# Напрямую через Java
javac -cp ".:jogl-all.jar:gluegen-rt.jar" fractals/**/*.java
java -cp ".:jogl-all.jar:gluegen-rt.jar" fractals.FractalExplorer

🎨 Цветовые схемы

Мандельброт и Жюлиа

  • Градиент HSV по итерациям
  • Черный цвет для точек множества
  • Плавные переходы для эстетики

Дерево Пифагора

  • Зелено-коричневая палитра (натуральное дерево)
  • Градиент по глубине рекурсии

Снежинка Коха

  • Голубые оттенки (лед/снег)
  • Четкие линии

Треугольник Серпинского

  • Оранжевый цвет
  • Единая заливка для всех треугольников

Фрактальный ландшафт

  • Градиент по высоте:
    • < 0.3: Синий (вода)
    • 0.3-0.5: Жёлтый (песок/берег)
    • 0.5-0.7: Зелёный (трава)
    • 0.7-0.85: Коричневый (горы)
    • 0.85: Белый (снег)

  • Чёрные контуры полигонов

Фрактал Ляпунова

  • Синий градиент: отрицательный показатель (устойчивость)
  • Красно-жёлтый градиент: положительный показатель (хаос)
  • Чёрный: неустойчивые орбиты

📊 Производительность

Тесты (Intel i7, NVIDIA GTX 1060)

  • Мандельброт (1920x1080, 256 iter): 60 FPS
  • Жюлиа (1920x1080, 256 iter): 60 FPS
  • Дерево Пифагора (глубина 12): 60 FPS
  • Снежинка Коха (уровень 6): 60 FPS
  • Треугольник Серпинского (глубина 8): 60 FPS
  • Фрактальный ландшафт (129x129): 60 FPS
  • Фрактал Ляпунова (200 iter): 45-55 FPS (более вычислительно затратный)

🔮 Планируемые расширения

  • Фрактал Серпинского (Треугольник) ✅
  • Фрактальные ландшафты (Midpoint Displacement) ✅
  • Фрактал Ляпунова ✅
  • Ковёр Серпинского
  • Шейдеры GLSL для GPU ускорения
  • Сохранение скриншотов высокого разрешения
  • Экспорт видео анимаций
  • Preset галерея интересных мест
  • Полноэкранный режим

📝 Примеры использования

Исследование Мандельброта

MandelbrotSet mandelbrot = new MandelbrotSet();
mandelbrot.setIterations(512);       // Высокая детализация
mandelbrot.setZoom(1000.0);         // Глубокий зум
mandelbrot.setOffset(-0.75, 0.1);   // Морской конек
mandelbrot.gotoInterestingPoint(1); // Или через preset

Анимация Дерева Пифагора

PythagorasTree tree = new PythagorasTree();
tree.setMaxDepth(12);
tree.setAngle(45);
tree.toggleAnimation();  // Запуск анимации

Генерация Фрактального ландшафта

FractalLandscape landscape = new FractalLandscape();
landscape.setRoughness(0.7f);    // Шероховатость
landscape.setSeed(System.currentTimeMillis()); // Случайное зерно
landscape.regenerate();          // Пересоздать ландшафт

Исследование Фрактала Ляпунова

LyapunovFractal lyapunov = new LyapunovFractal();
lyapunov.setSequence("AABAB");   // Последовательность переключения
lyapunov.loadPreset(3);          // Или загрузить предустановку
lyapunov.setIterations(200);     // Точность вычислений

🐛 Известные проблемы

  • При очень глубоком зуме (>1e-14) может проявляться потеря точности double
  • На старых GPU без MSAA могут быть "зазубрины"

📚 Математика

Мандельброт

Для каждого пикселя (x, y):
  c = complex(x, y)
  z = 0
  for i in range(max_iterations):
    z = z² + c
    if |z| > 2:
      return i  // Точка убегает
  return max_iterations  // Точка в множестве

Дерево Пифагора

Рекурсия:
  1. Нарисовать квадрат
  2. На двух верхних вершинах построить
     два меньших квадрата под углами ±α
  3. Повторить для новых квадратов

👨‍💻 Автор

Разработано как демонстрация возможностей OpenGL в Java для образовательных целей.

📄 Лицензия

MIT License - свободное использование в учебных проектах.