Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 基本分形着色问题_Graphics_Glsl_Fractals - Fatal编程技术网

Graphics 基本分形着色问题

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

我正在努力让分形着色背后的数学变得更舒服,并更好地理解着色算法。我的论文如下:

本文给出了每个函数的具体参数,但是当我使用相同的参数时,我的结果并不完全正确。我不知道会发生什么

我使用迭代计数着色算法开始并使用以下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);
    
    本文提供了以下图像:

    当我的代码生成:

    通过使用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) ;
    
    }