- UID
- 30376
- 帖子
- 527
- 精华
- 1
- 积分
- 6520
- 来自
- 湖南湘潭
|
169# xuefeiyang
有种叫“蜂窝陷阱”的算法,可以呈现水晶效果:
cellularTrap( e, et, em, tri )
{
let i = e.length - 1, z0 = 0;
while( Z.norm( e[ z0 ] ) == 0 ) z0 ++; 确定迭代轨迹中第一个|z|不为 0 的点的序号 z0。
let cp = Z.new( 0, 0 ), 给定捕捉点
dist = Z.norm( e[ z0 ], cp ), 迭代轨迹中第一点与捕捉点的距离
dist2 = em * dist; 设定一个比最小距离大的次小距离
for ( let k = z0 + 1; k < e.length; k ++ ) { 从z0后面的点开始计算
let trap = Z.norm( e[ k ], cp ); 计算每一点与捕捉点的距离
if( trap < dist ) dist2 = dist, dist = trap; 确保 dist 为最小距离,
else if ( trap < dist2 ) dist2 = trap; 而 dist2 为次小距离。
}
let p = .25,
a = pow( 1 - dist / dist2, p ),
rgb = tri( a );
return [ ...rgb, 255 ];
}
Z.norm( z, cp )=(z.r-cp.r)*(z.r-cp.r)+(z.i-cp.i)*(z.i-cp.i)
计算两点之间的距离因该是Z.abs(z,cp) =sqrt((z.r-cp.r)*(z.r-cp.r)+(z.i-cp.i)*(z.i-cp.i)), 用Z.norm是为了减少计算,所以,给定的逃逸半径 em 在程序中是被平方了的:em=em*em.
下面分别是169#那个模型z0=0,z0=(1/2)^/(1/3)的 M 集
|
|