Graphics 基本分形着色问题
我正在努力让分形着色背后的数学变得更舒服,并更好地理解着色算法。我的论文如下: 本文给出了每个函数的具体参数,但是当我使用相同的参数时,我的结果并不完全正确。我不知道会发生什么 我使用迭代计数着色算法开始并使用以下julia集:Graphics 基本分形着色问题,graphics,glsl,fractals,Graphics,Glsl,Fractals,我正在努力让分形着色背后的数学变得更舒服,并更好地理解着色算法。我的论文如下: 本文给出了每个函数的具体参数,但是当我使用相同的参数时,我的结果并不完全正确。我不知道会发生什么 我使用迭代计数着色算法开始并使用以下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
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处为白色,中间插入黑色
按照这个算法:
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);
本文提供了以下图像:
当我的代码生成:
通过使用k=1.0而不是2.5,我得到了正确的结果,但是我更愿意理解为什么我的结果不正确。当扩展到平滑着色算法时,我的结果仍然不正确,所以我想先弄清楚这一点
如果这不是此类问题的正确位置,请告诉我,我可以将其移动到数学堆栈交换。我不确定哪个地方更合适 您的图像完美地实现了本文中的图3.3。您发布的另一个图像使用不同的例程 您的图的顶部似乎有一些透视图代码,但是去掉这些代码,它们应该是相同的 如果您的反对意见是颜色极端值,请在代码的“0.5-0.5*…”部分设置该值。这使得在示例图像中尝试复制时,最暗的黑色最初为0.5,最暗的黑色应为1,最亮的白色应为0 使白度等于0.5的距离
如果你忽略了分形,你会得到一堆可以在0到1之间标准化的值,你会用一些特殊的方式给它们着色。很明显,您正在复制的图像是0到1之间的线性图像,因此将黑色设置为0.5是不正确的
o={
长度:500,
宽度:500,
c:[0.5,25],//c=x+iy将是[x,y]
最大迭代次数:100,
画布:空
}
功能点(位置、颜色){
var c=255-Math.round((1+Math.log(color)/Math.log(o.maxi迭))*255);
c=c.toString(16);
如果(c.length==1)c='0'+c;
o、 canvas.fillStyle=“#”+c+c+c;
o、 canvas.fillRect(位置[0],位置[1],1,1);
}
函数转换(x,y,R){
var m=R/o.宽度;
var x1=m*(2*x-o.宽度);
变量y2=m*(o.宽度-2*y);
返回[x1,y2];
}
函数f(z,c){
返回[z[0]*z[0]-z[1]*z[1]+c[0],2*z[0]*z[1]+c[1]];
}
功能abs(z){
返回Math.sqrt(z[0]*z[0]+z[1]*z[1]);
}
函数init(){
var R=(1+数学sqrt(1+4*abs(o.c))/2,
z、 x,y,i;
o、 canvas=document.getElementById('a').getContext(“2d”);
对于(x=0;xR)断裂;
i++;
}
如果(i)点([x,y],i/o.maxIterate);
}
}
}
init()代码>
这两幅图像在视觉上完全相同……同时,了解您所使用的语言也很好。我不知道长度(z)是什么意思,复杂半径?拍摄,,对于“我的图像”,上传了4张图像。右边的是从白色变为黑色,然后再变为白色的。将在几分钟内更新。这也是glsl。长度就是向量的大小(sqrt(x*x+y*y)),其中x是实部,y是虚部。我认为这是复杂的辐射是的,它似乎需要更多的澄清。我几乎无法理解透视图代码并识别它,更不用说语言了。但是,我摆弄Julia sets得出的结论是,有无数种方法可以给它们上色,其中一些可能看起来很整洁。谢谢你的评论。虽然它们非常接近,但这是一个完全不同的算法。该算法是走向平滑着色的一步,不是原始迭代计数算法。正如你在我的图片中看到的,有清晰定义的条带,而在你发布的图片中,条带要软得多。更具体地说,是“连续迭代计数”而不是“迭代计数”算法。这将影响输出的范围,这将对正在绘制的颜色产生影响。如果我使用这个算法,我的结果看起来就不再像这个图像了。那么问题是你在哪里反弹这些值。0.5-0.5*。。。比特将使两个极端都变成白色。因此,0是白色的,1是白色的。因为你让黑人基本上平等。是的,这就是我想要的。因为报纸上使用的味觉就是这样。哦,是的,这很有道理。每次迭代都是一个离散值,因此它与边界相等的点最终将是一个分数。因此,与其说需要22次迭代,不如说需要21.x才能得到边界。但这一信息由于公式的离散性而丢失。
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) ;
}