【发布时间】:2018-04-05 16:29:22
【问题描述】:
我正在努力让分形着色背后的数学变得更加舒适,并更好地理解着色算法。我是以下论文:
http://jussiharkonen.com/files/on_fractal_coloring_techniques%28lo-res%29.pdf
论文给出了每个函数的具体参数,但是当我使用相同的参数时,我的结果并不完全正确。我不知道会发生什么。
我正在使用迭代计数着色算法启动并使用以下 julia 集:
c = 0.5 + 0.25i and p = 2
使用着色算法:
The coloring function simply returns the number of
elements in the truncated orbit divided by 20
还有调色板功能:
I(u) = k(u − u0),
where k = 2.5 and u0 = 0, was used.
调色板在 0 和 1 处为白色,并在中间插入黑色。
并遵循这个算法:
- 设置z0对应复平面中像素的位置。
- 通过迭代公式 zn = f(zn−1) 开始计算截断轨道 从 z0 直到 • |zn| > M,或 • n = Nmax, 其中 Nmax 是最大迭代次数。
- 使用着色和颜色索引函数,映射生成的截断 轨道到颜色索引值。
- 使用调色板函数确定像素的 RGB 颜色
使用这个我的代码如下所示:
float izoom = pow(1.001, zoom );
vec2 z = focusPoint + (uv * 4.0 - 2.0) * 1.0 / izoom;
vec2 c = vec2(0.5f, 0.25f) ;
const float B = 2.0;
float l;
for( int i=0; i<100; i++ )
{
z = vec2( z.x*z.x - z.y*z.y, 2.0*z.x*z.y ) + c;
if( length(z)>10.0) break;
l++;
}
float ind = basicindex(l);
vec4 col = color(ind);
并具有以下索引和着色功能:
float basicindex(float val){
return val / 20.0;
}
vec4 color(float index){
float r = 2.5 * index;
float g = r;
float b = g;
vec3 v = 0.5 - 0.5 * sin(3.14/2.0 + 3.14 * vec3(r, g, b));
return vec4(1.0 - v, 1.0) ;
}
论文提供了以下图片: https://imgur.com/YIZMhaa
虽然我的代码生成: https://imgur.com/OrxdMsN
我通过使用 k = 1.0 而不是 2.5 得到了正确的结果,但是我更愿意了解为什么我的结果不正确。当将此扩展到平滑着色算法时,我的结果仍然不正确,所以我想先弄清楚这一点。
如果这不是此类问题的正确位置,请告诉我,我可以将其移至数学堆栈交换。我不确定哪个地方更合适。
【问题讨论】:
-
两张图片在视觉上是相同的...
-
另外,如果您了解您使用的语言,那就太好了。我不知道长度(z)是什么意思,复数半径?
-
拍摄,对于“我的图像”,上传了 4 张图像。右边的那个是从白色到黑色,然后又变回白色的那个。将在几分钟内更新。
-
这也是 glsl。长度只是向量 (sqrt(x * x +y * y)) 的大小,其中 x 是实部,y 是虚部。我相信这是复杂的半径
-
是的,似乎需要进一步澄清。我几乎无法辨认出透视代码并识别它,更不用说语言了。但是,我对 Julia 集的摆弄得出的结论是,有无数种方法可以为它们着色,其中一些可能看起来很整洁。