返回列表 回复 发帖
肖老师,后面的几张和前面的相比的话,您改变了算法?
221# lnszdzg
杜老师好,是的,虽然都是画线,但前者所有点的线是一样长(两个像素),起点则由势函数平滑后的et确定,后者则是直上直下的,囚集的长度固定,逃逸集的长度如前由势函数平滑后的et确定。前者变的是线(没有直接描点是考虑算法扩展的需要)的起点,后者变的是线的长度。
两种算法均不成熟,一直没有详细说明和贴出代码,柳烟老师也有关注过,礼拜六回家后整理好了再请各位老师指点,在此一并谢过。
218# 柳烟
柳老师好,我用的是榕坚老师“分形奇图共评赏” 449#的算法,只是作了一点点的修改:

    function(e) //e为迭代轨迹
    {
        et=e.length-1,ex=e[et].x,ey=e[et].y
        t=ln(abs(m)),r=abs(ln(sqrt(ex*ex+ey*ey)))
        ac=sqrt(e[0].x*e[0].x+e[0].y*e[0].y)
        az=0,lb=0,f=0,dist=0,sumEt=0,sumEt_1=0
        co=[255,255,255]
        if(et%eT||coInner)  //et Mod eT不等于0则属于逃逸集,coInner 为内部着色
        {
            for(var i=1;i<e.length;i++)
            {
                sumEt_1=sumEt
                var zr=e[i].x-e[0].x,zi=e[i].y-e[0].y
                az=sqrt(zr*zr+zi*zi),lb=abs(az-ac)
                sumEt+=(sqrt(e[i].x*e[i].x+e[i].y*e[i].y)-lb)/(az+ac-lb)
            }
            sumEt/=et,sumEt_1/=et-1,f=1+(ln(ln(eM)/2)-ln(r))/t
            dist=sqrt(sumEt_1+(sumEt-sumEt_1)*f)
            r=ln(r/t)/t,et=dist*(et-r)/(2*pi)
            co[0]=128*(1-sin(et))
            co[1]=128*(1+cos(et))
            co[2]=128*(1-cos(et))
        }
        return co;
    }
不过,真要刻画(1-z^2)/(z-z^2cosz)+c 的内部结构,得另找算法。我只能使用et分层的方法来观察一下大致的结构,下面贴上几幅平面图:
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
function(e)
    {
        var et=e.length-1,ex=abs(e[et].x),ey=abs(e[et].y)
        var co=[255,255,255,255]
        if(et%eT||coInner)
        {
            co[0]=128*(1-cos(ex*ey))
            co[1]=128*(1-cos(ex*ex))
            co[2]=128*(1-cos(ey*ey))
        }
        if(eTime)
        {
            if(potential)
            {
                var t=ln(abs(m)),r=abs(ln(sqrt(ex*ex+ey*ey)))/t .......1<m<2
                r=ln(r)/t,et=abs(et-r)
            }
            co[3]=255*sqrt(et/eT)
        }
        return co
    }
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
218# 柳烟
柳烟老师好:我在学习复分形时,对于特定的迭代模型并没有特定的算法,除常规的迭代外,其他的各种修饰、渲染功能都是独立于模型的,不是刻意为之,而是因为我缺乏专业的数学知识,没法从几何或代数的角度来诠释复变分形。下面这个分形确实很刁钻,可能会要用几个帖子,我尽量简短一些,看能不能说的明白,如有不妥,还请多包涵。
先用单一的 et 来表示着色的深浅:
迭代模型:(1-z^2)/(z-z^2cosz)+c
function(x,y,a,b)
    {
        if(M==1)x=1.5445654699195,y=0;// M...1 为 M 集,0 为 J 集
        var i=-1,e=[{x:x,y:y}],zr,zi;
        while(++i<eT&&((zr=x*x)+(zi=y*y))<eM) // eT、eM 逃逸时间、逃逸半径
        {
            var r2=zr-zi,i2=2*x*y;
            var cr=cos(x)*cosh(y),ci=-sin(x)*sinh(y);
            var x1=1-r2,y1=-i2;
            var x2=x-r2*cr+i2*ci,y2=y-r2*ci-i2*cr;
            var r=x2*x2+y2*y2;
            var xnew=(x1*x2+y1*y2)/r+a,ynew=(x2*y1-x1*y2)/r+b;
            if(sM&&abs(x-xnew)<dem&&abs(y-ynew)<dem)i=eT; // sM 为是否加亮“黑洞”,dem=1/eM
            e.push({x:x=xnew,y:y=ynew});
        }
        return e;
    }
着色算法:
function(e)
    {
        var et=e.length-1,ex=e[et].x,ey=e[et].y;
        var co=[0,0,0,255]; //[r,g,b,alpha(0...1为不透明度)]
        if(et%eT||coInner)
        {
            if(potential)
            {
                var t=ln(abs(m)),r=abs(ln(sqrt(ex*ex+ey*ey)))/t; //1<m<2
                r=ln(r)/t,et=abs(et-r);
            }
            co[3]=255*sqrt(et/eT);
        }
        return co;
    }
eM=5,eT=40
1.jpg
加亮“黑洞”
2.jpg
eM=5,eT=84
3.jpg
eM=5,eT=145
4.jpg
几乎所有带分式的模型都是这样:逃逸集和囚集交织在一起,相互渗透,使用逃逸时间很难将其分开;并且其中还有一种区域(内部透明区域),我不知道叫什么,姑且叫“盲区”吧,如果扩大逃逸半径,“盲区”会变小,可图像将向囚集拥挤,茫然一片,这种情况下增加迭代次数基本上不起作用。
eM=12,eT=120
1.jpg
eM=120,eT=1200
2.jpg
一般的来讲,我们可以获得一个记录迭代过程的迭代轨迹,依据这个迭代轨迹,可以获得一些相关的数据,其中最基本的有三个,即:逃逸时间、逃逸方向和逃逸距离,既然逃逸时间不能很好的表现其结构,那就应该考虑逃逸方向和逃逸距离,不管怎样,任何真相都可以被描述并艺术化,只是要找到合适的方法和手段。从前面的贴图可以看出,三角不等式着色法层次感比较好一点。
eM=120,eT=120
3.jpg
eM=12000000,eT=120
4.jpg
杜老师推荐的网页:很细腻,但不知道算法:
5.jpg
关于这个分形,关键在于必须使用内部着色,我实在是无能为力,请老师们指点!
在二维空间内,对复分形的图像进行各种各样的渲染处理,能产生令人匪夷所思的视觉效果。为此,必须解决两个问题:一是对于复动力模型最后形成的图像,能深谙其结构所传递的几何信息,二是具备高超的数理技巧来处理这些信息。可惜的是,这两点都挨不上。
    就复分形本身而言,如果能从三维的视角去解析其结构,对学习分形应该是有帮助的。从平面到空间的转换,从编程的角度来讲是很费事的,虽然最终还是要用专业的技术和手段,但我还是想先绕过去,先看看再说,如是很生硬的使用了一些业余的方法,构想了一个虚拟的伪三维空间,其维度分别为:real、image和et:
1.gif
    从图中可以看出,经过这样的处理后,有两个好处:一是绕过了那些复杂的数学计算;二是在画布的范围内,其扫描空间比原来的小了很多。因此,速度也快了很多。尽管方法和结果都不入流,但作为消遣和娱乐,足矣!
227# xklppp
就是这个分形,那位先生能用画板搞出,让我学学,这个分形我一直不知逃逸时间如何算出。
New.gif
html0708.rar (11.07 KB)
参数面板.rar (153 KB)
返回列表