跳转到内容

分形/复平面迭代/轨道陷阱

来自维基教科书,开放世界中的开放书籍

在数学中,轨道陷阱是一种根据用于创建分形的迭代函数接近称为“陷阱”的几何形状的方式对分形图像进行着色的方法。 轨道陷阱通常用于对表示复平面的二维分形进行着色。


典型的陷阱是

  • 点 (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 创建的轨道陷阱
华夏公益教科书