Rumah > Java > javaTutorial > Bagaimana untuk Mencapai Warna-warna Bersemangat dalam Set Mandelbrot Sepanjang Zum?

Bagaimana untuk Mencapai Warna-warna Bersemangat dalam Set Mandelbrot Sepanjang Zum?

Susan Sarandon
Lepaskan: 2024-11-03 16:58:30
asal
385 orang telah melayarinya

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

Mengapa Warna Zum Kusam?

Dalam kod anda di bawah, anda meningkatkan max_iteration untuk mendapatkan lebih banyak warna. Walau bagaimanapun, pendekatan itu memberikan beberapa warna pada pembesaran 1x dan variasi yang lebih luas apabila dizum masuk. Ini berlaku kerana tiada warna sebenar dalam set Mandelbrot "sebenar", dan dengan meningkatkan lelaran_maks, anda hanya mendekati ideal itu.

Cara Mencapai Warna Cerah Sepanjang Proses Zum:

Untuk mencapai ini, anda perlu mengira lelaran titik pecahan, yang juga dikenali sebagai Mandelbrot Escape. Daripada membazirkan banyak warna secara seragam pada indeks yang tidak digunakan, anda mengedarkan warna kecerunan dengan lebih berkesan dengan menggunakan pendekatan histogram dan fungsi kecerunan khusus yang menarik secara visual.

Melaksanakan Lelaran Titik Terapung:

Untuk mengira lelaran titik terapung, anda boleh menggunakan yang berikut formula:

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

Di manakah n ialah kiraan lelaran anda dan Z(n) ialah subhasil domain kompleks bagi persamaan yang anda sedang lelaran.

Menggunakan Fractional Escape kepada GLSL Mandelbrot Shader:

Kod yang disediakan menunjukkan GLSL Mandelbrot shader dengan pelarian pecahan dan pewarnaan semula berbilang warna:

Penekap Puncak:

<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>
Salin selepas log masuk

Penerkap Serpihan:

<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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Warna-warna Bersemangat dalam Set Mandelbrot Sepanjang Zum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan