Heim >Java >javaLernprogramm >Wie erzielt man im gesamten Zoombereich lebendige Farben in einem Mandelbrot-Set?
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!