- UID
- 30376
- 帖子
- 527
- 精华
- 1
- 积分
- 6520
- 来自
- 湖南湘潭
|
233# 柳烟
柳老师好,我的画板能力实在太差,关于复变模型(1-z^2)/(z-z^2cosz)+c,所有代码都在这里,迭代算法就如模型所示,没有作任何处理,虽然使用了三角不等式着色,但也只是由它来设置画布像素点的不透明度,实际的颜色是由势函数平滑后的et来确定的,至于这个模型的真正结构,我现在还真没摸到门路。这次我将z的初始点换成了c,虽然小M集被扭曲了,但找J集要方便一些:
scanPlane()//扫描复平面c
{
for(var b=iMax,y=0,k=0;y<height;b-=dI,y++) //c平面虚轴,对应画布的y轴
for(var a=rMin,x=0;x<width;a+=dR,x++,k+=4)//c平面实轴,对应画布的x轴
{
var e=iterator(a,b,a,b)//以c为z的初始点进行迭代,返回迭代轨迹数组e
var co=setColor(e)//依据迭代轨迹e进行着色,返回颜色值co=[r,g,b,a]
for(j=0;j<4;j++)pix[k+j]=co[j]//在画布上描出该点
}
}
iterator(x,y,a,b)//迭代模型:(1-z^2)/(z-z^2cosz)+c
{
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;
}
setColor(e)//三角不等式着色
{
var et=e.length-1,ex=e[et].x,ey=e[et].y;
var t=ln(abs(m)),r=abs(ln(sqrt(ex*ex+ey*ey)))//这里的m=1.125,可以加大色差
var ac=sqrt(e[0].x*e[0].x+e[0].y*e[0].y);
var az=0,lb=0,f=0,dist=0,sumEt=0,sumEt_1=0;
var co=color[255,255,255,255];
if(et%eT||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=abs(et-r)%eT;//势函数平滑,这里仍然使用et着色
var c=et/cstp,cs=floor(c),ct=ceil(c),v=c%1,u=1-v;
co[0]=color[cs][0]*u+color[ct][0]*v;
co[1]=color[cs][1]*u+color[ct][1]*v;
co[2]=color[cs][2]*u+color[ct][2]*v;
co[3]=255*dist//三角不等式计算出来的平均距离dist只用来设置像素点的不透明度
}
return c;
}
|
|