ホームページ  >  記事  >  Java  >  マンデルブロ集合でズーム全域で鮮やかな色を実現するにはどうすればよいですか?

マンデルブロ集合でズーム全域で鮮やかな色を実現するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 16:58:30360ブラウズ

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

ズームの色はなぜくすんでいるのですか?

以下のコードでは、より多くの色を取得するために max_iteration を増やしています。ただし、このアプローチでは、1 倍の倍率ではほとんど色が表示されず、ズームインするとより多様な色が表示されます。これは、「真の」マンデルブロ集合には実際の色が存在しないために発生し、max_iteration を増やすことでその理想に近づくだけです。

Zoom プロセス全体で鮮やかな色を実現する方法:

これを実現するには、マンデルブロエスケープとしても知られる小数点反復を計算する必要があります。未使用のインデックスで多くのカラーを一律に無駄にする代わりに、ヒストグラムのアプローチと視覚的に好ましい特定のグラデーション関数を採用することで、グラデーションのカラーをより効果的に分配します。

浮動小数点反復の実装:

浮動小数点反復を計算するには、次を使用できます。式:

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

ここで、n は反復回数、Z(n) は反復している方程式の複素領域の部分結果です。

分数エスケープの適用GLSL マンデルブロ シェーダーへ:

提供されたコードは GLSL を示しています分数エスケープと多色の再カラーを備えたマンデルブロ シェーダー:

頂点シェーダー:

<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>

フラグメント シェーダー:

<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>

以上がマンデルブロ集合でズーム全域で鮮やかな色を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。