Maison > Java > javaDidacticiel > le corps du texte

Comment conserver l'éclat des couleurs dans l'ensemble de Mandelbrot à différents niveaux de zoom ?

Linda Hamilton
Libérer: 2024-11-03 14:17:02
original
292 Les gens l'ont consulté

How to Maintain Color Vibrancy in the Mandelbrot Set Across Different Zoom Levels?

Coloration de l'ensemble de Mandelbrot pour une large gamme de zooms

Problème :
La méthode standard de coloration de l'ensemble de Mandelbrot en utilisant des itérations maximales entraîne un manque de couleurs lors d'un zoom arrière et une sursaturation des couleurs lors d'un zoom avant. Le défi est de créer un schéma de couleurs qui conserve une large gamme de couleurs à travers différents niveaux de zoom.

Solution :

1. Cartographie des couleurs basée sur l'histogramme :

  • Utilisez un histogramme pour répartir les dégradés de couleurs plus efficacement au lieu de gaspiller des couleurs sur des index inutilisés.
  • Utilisez une fonction de dégradé visuellement agréable, telle que les valeurs RVB du spectre visible.

2. Nombre d'itérations fractionnaires (Mandelbrot Escape) :

  • Calculez les itérations avec une précision en virgule flottante pour obtenir des valeurs d'échappement fractionnaires.
  • Utilisez ces valeurs fractionnaires pour calculer la couleur à partir d'un dégradé personnalisé. fonction conçue pour fournir une large gamme de couleurs.

Améliorations supplémentaires :

  • Recoloration multi-passes : Effectuez plusieurs passes pour obtenir des transitions fluides et continues entre les dégradés de couleurs.
  • Nombre d'itérations réglable : Permet à l'utilisateur d'ajuster le nombre d'itérations maximum, affectant le niveau de détail et la distribution des couleurs.
  • Zoom dynamique : Implémentez des capacités de zoom dynamique pour explorer l'ensemble de Mandelbrot à différentes échelles et préserver l'éclat des couleurs tout au long.

Exemple de mise en œuvre :

// Vertex Shader
layout(location = 0) in vec2 pos;
out vec2 p;
void main()
{
    p = pos;
    gl_Position = vec4(pos, 0.0, 1.0);
}

// Fragment Shader
uniform vec2 p0;
uniform float zoom;
uniform int n;
uniform int sh;
uniform int multipass;
in vec2 p;
out vec4 col;

// Compute fractional iteration count
float mu = m + frac = n + 1 - log(log(sqrt(xx + yy)) / log(2.0));
mu *= float(1 << sh);
int i = int(mu);

// Multi-pass coloring
if (multipass != 0)
{
    // Quantize color based on iterations
    float r = (i >> 0) & 255; r /= 255.0;
    float g = (i >> 8) & 255; g /= 255.0;
    float b = (i >> 16) & 255; b /= 255.0;
    col = vec4(r, g, b, 255);
}
// Visible spectrum color gradient
else
{
    float q = float(i) / float(N);
    q = pow(q, 0.2);
    col = vec4(spectral_color(400.0 + (300.0 * q)), 1.0);
}
Copier après la connexion

Résultat :

Cette approche combine une coloration basée sur un histogramme, un nombre d'itérations fractionnaires et une recoloration multi-passes pour obtenir une représentation vive et riche en couleurs du Mandelbrot réglé à tous les niveaux de zoom.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal