分形/复平面迭代/原子域
外观
< 分形
-
动画
-
bof61 的 3D 视图
-
BOF61 的 2D 视图
在曼德布罗特集 (参数平面) 的情况下,原子域是参数平面中具有相同索引 p 的部分。
- 它是正整数
- 对于 p=1,域是整个平面,因为在算法中,复数模的值与无穷大进行比较
- 它等于
- 曼德布罗特集的双曲分量的周期,该分量在域内
- 临界点迭代时 z 的模在迭代过程中最小化的迭代次数
请注意
原子域包含
- 周期为 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) 是最小的一个。
代码片段 : 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
请注意,这种方法可以应用于外部和内部。它被称为原子域。[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);
}