- UID
- 30376
- 帖子
- 527
- 精华
- 1
- 积分
- 6520
- 来自
- 湖南湘潭
|
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
加亮“黑洞”
eM=5,eT=84
eM=5,eT=145
|
|