首頁  >  文章  >  Java  >  如何在不同縮放等級的 Mandelbrot 集中保持色彩鮮豔度?

如何在不同縮放等級的 Mandelbrot 集中保持色彩鮮豔度?

Linda Hamilton
Linda Hamilton原創
2024-11-03 14:17:02279瀏覽

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

為大範圍縮放的Mandelbrot 集著色

問題:
使用最大迭代次數為Mandelbrot 集著色的標準方法導致縮小時顏色缺乏,放大時顏色過飽和。挑戰在於創建一種著色方案,在不同的縮放等級下保持多種顏色。

解:

1。基於直方圖的顏色映射:

  • 使用直方圖更有效地分佈顏色漸變,而不是在未使用的索引上浪費顏色。
  • 採用視覺上令人愉悅的漸變函數,例如可見光譜的 RGB 值。

2.小數迭代計數(Mandelbrot 轉義):

  • 以浮點精度計算迭代以獲得小數轉義值。
  • 使用這些小數值從自訂漸層計算顏色旨在提供多種顏色的功能。

其他增強功能:

  • 多次重新著色:執行多次傳遞以實現顏色漸變之間的平滑和連續過渡。
  • 可調式迭代計數:讓使用者調整最大迭代計數,影響細節等級和顏色分佈。
  • 動態縮放:實現動態縮放功能,以探索不同尺度的 Mandelbrot 集並始終保持色彩活力。

範例實作:

// 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);
}

結果:

這種方法結合了基於直方圖的著色、分數迭代計數和多遍重新著色,以實現生動且色彩豐富的表示Mandelbrot 設定在所有縮放等級。

以上是如何在不同縮放等級的 Mandelbrot 集中保持色彩鮮豔度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn