Heim >Java >javaLernprogramm >Wie erzielt man im gesamten Zoombereich lebendige Farben in einem Mandelbrot-Set?

Wie erzielt man im gesamten Zoombereich lebendige Farben in einem Mandelbrot-Set?

Susan Sarandon
Susan SarandonOriginal
2024-11-03 16:58:30398Durchsuche

How to Achieve Vibrant Colors in a Mandelbrot Set Throughout Zoom?

Warum sind Zoomfarben langweilig?

In Ihrem Code unten erhöhen Sie max_iteration, um mehr Farben zu erhalten. Allerdings liefert dieser Ansatz bei 1-facher Vergrößerung nur wenige Farben und beim Vergrößern eine größere Vielfalt. Dies liegt daran, dass es in der „wahren“ Mandelbrot-Menge keine tatsächlichen Farben gibt und Sie durch Erhöhen von max_iteration diesem Ideal nur näher kommen.

So erzielen Sie lebendige Farben während des gesamten Zoomvorgangs:

Um dies zu erreichen, müssen Sie gebrochene Punktiterationen berechnen, die ist auch als Mandelbrot-Flucht bekannt. Anstatt viele Farben gleichmäßig auf nicht verwendete Indizes zu verschwenden, verteilen Sie die Farbe des Farbverlaufs effektiver, indem Sie einen Histogrammansatz und eine bestimmte optisch ansprechende Farbverlaufsfunktion verwenden.

Implementieren von Gleitkomma-Iterationen:

Um Gleitkomma-Iterationen zu berechnen, können Sie die folgende Formel verwenden:

mu = m + frac = n + 1 - log(log|Z(n)| / log2)

Wo n ist Ihre Iterationsanzahl und Z(n) ist das komplexe Domänen-Teilergebnis der Gleichung, die Sie iterieren.

Anwenden von Fractional Escape auf GLSL Mandelbrot Shader:

Der bereitgestellte Code demonstriert einen GLSL-Mandelbrot-Shader mit fraktioniertem Escape und mehrfarbig Neufärbung:

Vertex-Shader:

<code class="glsl">// Vertex
#version 420 core
layout(location = 0) in vec2 pos; // glVertex2f <-1,+1>
out smooth vec2 p; // texture end point <0,1>
void main()
{
    p = pos;
    gl_Position = vec4(pos, 0.0, 1.0);
}</code>

Fragment-Shader:

<code class="glsl">// Fragment
#version 420 core
uniform vec2 p0 = vec2(0.0, 0.0); // mouse position <-1,+1>
uniform float zoom = 1.000; // zoom [-]
uniform int n = 100; // iterations [-]
uniform int sh = 7; // fixed point accuracy [bits]
uniform int multipass = 0; // multi pass?
in smooth vec2 p;
out vec4 col;

const int n0 = 1; // forced iterations after escape to improve precision

vec3 spectral_color(float l) // RGB <0,1> <- lambda l <400,700> [nm]
{
    float t;
    vec3 c = vec3(0.0, 0.0, 0.0);
    
    // Spectral color calculation based on wavelength
    
    if ((l >= 400.0) && (l < 410.0)) {
        t = (l - 400.0) / (410.0 - 400.0);
        c.r = +(0.33 * t) - (0.20 * t * t);
    }
    else if ((l >= 410.0) && (l < 475.0)) {
        t = (l - 410.0) / (475.0 - 410.0);
        c.r = 0.14 - (0.13 * t * t);
    }
    else if ((l >= 545.0) && (l < 595.0)) {
        t = (l - 545.0) / (595.0 - 545.0);
        c.r = +(1.98 * t) - (t * t);
    }
    else if ((l >= 595.0) && (l < 650.0)) {
        t = (l - 595.0) / (650.0 - 595.0);
        c.r = 0.98 + (0.06 * t) - (0.40 * t * t);
    }
    else if ((l >= 650.0) && (l < 700.0)) {
        t = (l - 650.0) / (700.0 - 650.0);
        c.r = 0.65 - (0.84 * t) + (0.20 * t * t);
    }
    if ((l >= 415.0) && (l < 475.0)) {
        t = (l - 415.0) / (475.0 - 415.0);
        c.g = +(0.80 * t * t);
    }
    else if ((l >= 475.0) && (l < 590.0)) {
        t = (l - 475.0) / (590.0 - 475.0);
        c.g = 0.8 + (0.76 * t) - (0.80 * t * t);
    }
    else if ((l >= 585.0) && (l < 639.0)) {
        t = (l - 585.0) / (639.0 - 585.0);
        c.g = 0.84 - (0.84 * t);
    }
    if ((l >= 400.0) && (l < 475.0)) {
        t = (l - 400.0) / (475.0 - 400.0);</code>

Das obige ist der detaillierte Inhalt vonWie erzielt man im gesamten Zoombereich lebendige Farben in einem Mandelbrot-Set?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn