跳转到内容

分形/复平面迭代/原子域

来自维基教科书,自由的教科书,面向自由的世界
  • 周期域
  • 原子域.[1][2]
  • BOF61(见《分形的美丽》第 61 页)[3][4]
  • 轨道陷阱 at (0,0) [5]
  • mclosetime

在曼德布罗特集 (参数平面) 的情况下,原子域是参数平面中具有相同索引 p 的部分。

  • 它是正整数
  • 对于 p=1,域是整个平面,因为在算法中,复数模的值与无穷大进行比较
  • 它等于
    • 曼德布罗特集的双曲分量的周期,该分量在域内
    • 临界点迭代时 z 的模在迭代过程中最小化的迭代次数

请注意 

  • 原子域是重叠的
  • "原子域包围着相同周期的双曲分量,并且通常比分量本身大得多"[6]
  • "这些域完全包围着相同周期的双曲分量"
  • "原子域完全在其自己的牛顿盆地内,并且也比相应的组件大得多"[7]

原子域包含 

    • 周期为 n 的曼德布罗特集的分量 mv
    • 该分量的外部
    • 一些其他分量

重要性

[编辑 | 编辑源代码]

它可以用于 

  • 快速查找(近似)曼德布罗特集的周期为 n 的分量及其中心,(域大于分量,这使得它们在查找分量时很有用)

整个参数平面

[编辑 | 编辑源代码]
// code from :
// http://mathr.co.uk/blog/2014-11-02_practical_interior_distance_rendering.html
// C program by Claude Heiland-Allen
complex double z = 0;
      complex double dc = 0;
      double minimum_z2 = infinity; // atom domain
      int period = 0;

      // iteration 
      for (int n = 1; n <= maxiters; ++n) {
        dc = 2 * z * dc + 1;
        z = z * z + c;
        double z2 = cabs2(z);

        if (z2 < minimum_z2) {
          minimum_z2 = z2;
          period = n;}}

Shadertoy

这是《分形的美丽》这本书第 63 页描述的方法,但图像在第 61 页。

点的颜色与 

  • z 达到最小值所需的时间成正比
  • 临界点的迭代使轨道最接近原点
  • 索引 (c) 是轨道点最接近原点的迭代次数。由于可能存在多个最接近点,因此索引(c) 是最小的一个。

该算法显示了具有相同索引(c) 的域的边界[8][9]

代码片段 : Gnofract4d 中的 fractint.cfrm [10]

bof61 {
 init:
       int current_index = -1 ; -1 to match Fractint's notion of iter count
       int index_of_closest_point = -1
       float mag_of_closest_point = 1e100
 loop:
       current_index = current_index + 1
       float zmag = |z|
       if zmag < mag_of_closest_point
               index_of_closest_point = current_index
               mag_of_closest_point = zmag
       endif
 final:
       #index = index_of_closest_point /256.0
}

Cpp 函数

//       function is based on function mclosetime
//       from mbrot.cpp 
//       from program mandel by Wolf Jung 
//      http:www.iram.rwth-aachen.de/~jung/indexp.html  
////8 = iterate =  bof61
// bailout2=4 
int mclosetime(std::complex<double> C , int iter_max,  int bailout2)
{ int j, cln = 0;
  double x = C.real(), y = C.imag(), u, cld = 4;
  for (j = 0; j <= iter_max; j++)
  { u = x*x + y*y; 
    if (u > bailout2) return j;
    if (u < cld) {cld = u;cln = j; }
 
    u = x*x - y*y + C.real();
    y = 2*x*y + C.imag();
    x = u;
  }
  return iter_max + cln % 15; //iterate, bof61
  
}

它可以用于 

// compute escape time  
              int last_iter= mclosetime(C,iter_max,bailout2);
              //  drawing code */
              if (last_iter>=iter_max) { putpixel(ix,iy,last_iter - iter_max);} // interior
                                else putpixel(ix,iy,WHITE); // exterior
原子域 : 请注意,原子域会重叠,并且“完全包围着相同周期的双曲分量”[11]

请注意,这种方法可以应用于外部和内部。它被称为原子域。[12] 它也可以被修改[13]

原子域的大小

[编辑 | 编辑源代码]

大小估计[14]

用于从核 c 和其周期 p 计算原子域大小估计的函数 

// code by Claude Heiland-Allen
// from http://mathr.co.uk/blog/2013-12-10_atom_domain_size_estimation.html
real_t atom_domain_size_estimate(complex_t c, int_t p) {
  complex_t z = c;
  complex_t dc = 1;
  real_t abszq = cabs(z);
  for (int_t q = 2; q <= p; ++q) {
    dc = 2 * z * dc + 1;
    z = z * z + c;
    real_t abszp = cabs(z);
    if (abszp < abszq && q < p) {
      abszq = abszp;
    }
  }
  return abszq / cabs(dc);
}

参考文献

[编辑 | 编辑源代码]
  1. 罗伯特·穆纳福的原子域
  2. 克劳德·海兰德-艾伦的实用内部距离渲染
  3. 英文维基百科中的分形之美
  4. 维基教科书中的Bof61算法
  5. 霍博德在(0,0)处的轨道陷阱
  6. 克劳德的misiurewicz_domains
  7. 克劳德·海兰德-艾伦的曼德博集合牛顿盆
  8. 诺埃尔·吉芬的Fractint 文档
  9. 帕特里克·哈恩的曼德博集合中的一系列螺旋湾
  10. gnofract4d
  11. 克劳德·海兰德-艾伦的实用内部距离渲染
  12. 来自曼德博集合词汇表和百科全书的原子域,作者罗伯特·穆纳福
  13. 克劳德·海兰德-艾伦的修改后的原子域
  14. 克劳德·海兰德-艾伦的原子域大小估计
华夏公益教科书