返回列表 回复 发帖
12# lnszdzg
杜老师好,下图不知道说明白了没有:
1.jpg
15# lnszdzg
杜老师好,大凡遇到这种情况,也就有着一个取舍的问题。图中(X0,Y0)-(Xt,Yt)两点之间的连线,实际上并不属于 julia 粒子系统,我是模仿几何画板的几何行为,采用屏幕输入的方式来输入扫描路径上的两个端点。并且,扫描路径的连线和 julia 粒子的显示是在两个画布上进行的。只要放弃这种输入方式,那么,也就不存在画线的问题,而显示 julia 粒子系统,只需要描点就行了。html5 存储画布像素点的矩阵是一维的,比起 mathcad 的二维矩阵,计算起来要复杂一些。至于颜色,可暂不考虑,只要得到了完整的粒子系统,颜色就不是问题了。只是 html5 对象的色彩描述都有一个 alpha(不透明度)通道,可以使图像产生那种通透的感觉,不知道 mathcad 是否也有。
如果上面给出的伪代码没有问题的话,只要解决 (X0,Y0)-(Xt,Yt)两点的输入,其他就没问题了:
1.jpg
2.jpg
3.jpg
如果真要画线,月城老师的方法完全可行,依据坐标系中的两点,可以得出一个直线方程,给出定义域或值域,用描点的方式便能画出线来。不怕各位老师笑话,在 html5 之前,我弄了一套非图形方式的绘图模块,也在玩着 IFS、LS、甚至也沾一沾复分形,想起来真是苦涩不堪。
依据扫描密度 t 对粒子着色:
1.jpg
2.jpg
3.gif
21# lnszdzg
RGB是色彩模式中最简单的一种,便于计算机处理,但主观视觉上不容易把握。HSL(HSV)更符合人的习惯,而最自然的则是Lab模式。
前面的伪代码写得蛮糟糕的,加了些文字说明,看能不能好一些:
4.gif

dr←(Realmax-Realmin)/Width   
di←(Imagemax-Imagemin)/Height  【(dr,di)为画布上单位像素所对应的复平面的大小,也就是画布到复平面的缩放比,复平面到画布的缩放比则为(1/dr,1/di)】

Ca←Realmin+X0*dr ....(Zr←Ca)
Cb←Imagemin+Y0*di ..(Zi←Cb)  【(Ca,Cb)为复平面扫描路径上的初始点,迭代过程中,z 的初始点取 c 的值】
px←(Xt-X0)*dr/t
py←(Yt-Y0)*di/t  【t 为路径上的点数,(px,py)为扫描路径上的单位点所对应的复平面的大小,也就是从当前点到下一点的实轴步长 px 和虚轴步长 py】

for k∈0,1..t  【从 0 到 t 在路径上逐点扫描】
    orbit←iterator(Ca,Cb,Zr←Ca,Zi←Cb)  【迭代(c,z),返回记录迭代轨迹的数组 orbit】

    for j∈0,1..orbit.length  【遍历迭代轨迹 orbit 的所有点】
        x←(orbit[j].r-Realmin)/dr
        y←(orbit[j].i-Imagemin)/di  【轨迹上的点为复平面上的点,所以,这里将轨迹上的每一点按缩放比例还原成画布上的点】
        drawpixel(x,y)  【在画布上描出该点(x,y)】

    Ca←Ca+px
    Cb←Cb+py  【扫描路径上的下一点

iterator(Ca,Cb,Zr,Zi)  【迭代模型】
    return orbit  【返回迭代轨迹】
返回列表