跳轉到內容

分形/複平面迭代/軌道陷阱

來自華夏公益教科書

在數學中,軌道陷阱是一種根據用於建立分形的迭代函式接近稱為“陷阱”的幾何形狀的方式對分形影像進行著色的方法。 軌道陷阱通常用於對錶示覆平面的二維分形進行著色。


典型的陷阱是

  • 點 (Pnt)
  • 圓形 (Cir 和 Cr2)
  • 花形
  • 甚至是光柵影像。
  • 超十字 (Hyp)
  • 十字或“加號” (Pls)
  • 矩形 (Rct)
  • 螺旋形 (Spi)。


使用十字形和點形軌道陷阱組合渲染的曼德博集。

基於點的

[編輯 | 編輯原始碼]

基於點的軌道陷阱根據函式的軌道接近單個點(通常是原點)的程度對點進行著色。

基於線的

[編輯 | 編輯原始碼]

基於線的軌道陷阱根據函式的軌道接近一條或多條線(通常是垂直或水平線(x=a 或 y=a 線))的程度對點進行著色。 皮克弗莖是基於線的軌道陷阱的一個例子,它使用兩條線。

曼德博集細節中的皮克弗莖示例

皮克弗莖 [1]是在分形幾何研究中,經驗性地在曼德博集的特定位置中發現的某些細節。 [2] 它們以研究人員克利福德·皮克弗的名字命名,他的“epsilon 十字形”方法在它們的發現中起著重要作用。 “epsilon 十字形”是一種十字形軌道陷阱。

根據 Vepstas(1997 年)的觀點,“皮克弗偶然發現了一個新穎的概念,即觀察內部點的軌道與 x 軸和 y 軸的接近程度。 在這些圖片中,點越接近,顏色範圍越高,紅色表示最接近的程度。 對距離取對數可以突出細節”。 [3]

生物形態

[編輯 | 編輯原始碼]
皮克弗演算法產生的生物形態的示例。

生物形態是看起來像生物的皮克弗莖。 [4] 在 1980 年代末,皮克弗開發了類似於朱利亞集和分形曼德博集的生物反饋生物。 [5] 根據皮克弗(1999 年)的總結,他“描述了一種演算法,可用於建立類似於無脊椎動物的各種複雜形式。 這些形狀很複雜,很難在實際進行對映實驗之前預測。 他希望這些技術能夠鼓勵其他人進一步探索並意外地發現處於科學與藝術邊緣的新形式”。 [6]

皮克弗開發了一種演算法(它既不使用隨機擾動也不使用自然規律)來建立類似於無脊椎動物的非常複雜的形狀。 對數學變換進行迭代或遞迴來生成生物形態。 他稱之為“生物形態”。 與此同時,他在創造這些圖案時創造了“生物形態”這個詞,著名的進化生物學家理查德·道金斯用這個詞來指代他自己的生物形狀,這些形狀是透過完全不同的程式得到的。 更嚴格地說,皮克弗的“生物形態”包括透過對“朱利亞集”理論領域中的傳統收斂測試進行微小改變而建立的一類有機形態。 [6]

皮克弗的生物形態在不同尺度上表現出自相似性,這是具有反饋的動力系統的常見特徵。 現實世界的系統,如海岸線和山脈,在某些尺度上也表現出自相似性。 二維引數 0L 系統可以“看起來”像皮克弗的生物形態。 [7]

演算法

[編輯 | 編輯原始碼]

軌道陷阱通常與基於迭代函式的一類二維分形一起使用。 建立這種分形的程式根據這些點在一定次數內透過函式時的行為對每個畫素(代表複平面中的離散點)進行著色。

這種分形最著名的例子是曼德博集,它基於函式 zn+1 = zn2 + c。 對曼德博影像進行著色的最常見方法是使用達到某個逃逸值的迭代次數,然後為該值分配一個顏色。 這稱為逃逸時間演算法。

使用基於點的軌道陷阱對曼德博集進行著色的程式將為每個畫素分配一個“距離”變數,該變數在第一次分配時通常非常高。

double distance = 10e5

當程式將複數值透過迭代函式傳遞時,它將檢查軌道中每個點與陷阱點的距離。 距離變數的值將是迭代過程中找到的最短距離。

private double getDistance(Complex c,
                           Complex point,
                           int maxIteration)
{        
    double distance = 1e20;
    Complex z = new Complex(0, 0);
        
    for(int i=0; i<maxIteration; i++)
    {
        //Perform Mandelbrot iteration
        z = z.multiply(z);
        z = z.add(c);
               
        //Set new distance dist = min( dist, |z-point| )
        Complex zMinusPoint = new Complex(z);
        zMinusPoint = zMinusPoint.subtract(point);
            
        double zMinusPointModulus = zMinusPoint.magnitude();
        if(zMinusPointModulus < distance)
            distance = zMinusPointModulus;
    }
        
    return distance;
}

程式碼

[編輯 | 編輯原始碼]
// Created by inigo quilez - iq/2013
// https://www.youtube.com/c/InigoQuilez
// https://iquilezles.org/articles/ftrapsbitmap/
// https://www.shadertoy.com/view/4slGWH
// Instead of using a pont, circle, line or any mathematical shape for traping the orbit
// of fc(z), one can use any arbitrary shape. For example, a NyanCat :)
//
// I invented this technique more than 10 years ago (can have a look to those experiments 
// here https://iquilezles.org/articles/ftrapsbitmap).

vec4 getNyanCatColor( vec2 p, float time )
{
	p = clamp(p,0.0,1.0);
	p.x = p.x*40.0/256.0;
	p.y = 0.5 + 1.2*(0.5-p.y);
	p = clamp(p,0.0,1.0);
	float fr = floor( mod( 20.0*time, 6.0 ) );
	p.x += fr*40.0/256.0;
	return texture( iChannel0, p );
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 p = (2.0*fragCoord-iResolution.xy)/iResolution.y;
    
    float time = max( iTime-5.5, 0.0 );
    
    // zoom	
	p = vec2(0.5,-0.05)  + p*0.75 * pow( 0.9, 20.0*(0.5+0.5*cos(0.25*time)) );
	
    vec4 col = vec4(0.0);
	vec3 s = mix( vec3( 0.2,0.2, 1.0 ), vec3( 0.5,-0.2,0.5), 0.5+0.5*sin(0.5*time) );

    // iterate Jc	
	vec2 c = vec2(-0.76, 0.15);
	float f = 0.0;
	vec2 z = p;
	for( int i=0; i<100; i++ )
	{
		if( (dot(z,z)>4.0) || (col.w>0.1) ) break;

        // fc(z) = z² + c		
		z = vec2(z.x*z.x - z.y*z.y, 2.0*z.x*z.y) + c;
		
		col = getNyanCatColor( s.xy + s.z*z, time );
		f += 1.0;
	}
	
	vec3 bg = 0.5*vec3(1.0,0.5,0.5) * sqrt(f/100.0);
	
	col.xyz = mix( bg, col.xyz, col.w );
    
    col *= step( 2.0, iTime );
    col += texture( iChannel1, vec2(0.01,0.2) ).x * (1.0-step( 5.5, iTime ));
	
	fragColor = vec4( col.xyz,1.0);
}

參考文獻

[編輯 | 編輯原始碼]
  • Carlson, Paul W. (1999), "Two artistic orbit trap rendering methods for Newton M-set fractals", Computers & Graphics, 23 (6): 925–931, doi:10.1016/S0097-8493(99)00123-5.
  • Lu, Jian; Ye, Zhongxing; Zou, Yuru; Ye, Ruisong (2005), "Orbit trap rendering methods for generating artistic images with crystallographic symmetries", Computers & Graphics, 29 (5): 787–794, doi:10.1016/j.cag.2005.08.008.

參考文獻

[編輯 | 編輯原始碼]
  1. wikipedia : 拾取莖
  2. Peter J. Bentley 和 David W. Corne (2001)。創造性進化系統。摩根·考夫曼。第 354 頁。
  3. Linas Vepstas (1997)。"內部素描本日記"。2008 年 7 月 8 日檢索。
  4. Paul Nylander。 Mandelbrot 集生物形態。2005 年 2 月。2008 年 7 月 8 日檢索。
  5. Edward Rietman (1994)。創世紀重現: 創造人工生命的實驗。Windcrest/McGraw-Hill。第 154 頁。
  6. a b Clifford A. Pickover (1991) "意外、進化和藝術"。YLEN 時事通訊,第 12 卷,第 19 卷,1999 年 11 月/12 月。
  7. Alfonso Ortega、Marina de la Cruz 和 Manuel Alfonseca (2002)。“引數化二維 L 系統和遞迴分形影像: Mandelbrot 集、Julia 集和生物形態”。在: 計算機與圖形 第 26 卷,第 1 期,2002 年 2 月,第 143-149 頁。
  8. Malin Christersson 建立的軌道陷阱
華夏公益教科書