Apr
28
Mandelbrot集(3):我来画画看
(yanlb2000, 2007.04.28, yanlb2000.blogcn.com)
前面两篇文章,我简单介绍了Mandelbrot集,包括定义,如何画,大概是什么样子的。
这个M集,是混沌和分形的代表性图形,有着无穷精细复杂的结构。而且,用电脑来画出来,本身也不复杂。
所以,我很久前,就尝试用电脑编程来画M集的图像了。多年来,也算写过好几个版本了。这里就总结一下吧,也算是一次有意思的回顾。
1, VAX / VMS, VT340, Fortran
我最早画M集,还是十几年以前了。那时候还是学生,因为课程需要,在系里机房有上机的机会。但那时候的机器,是一台DEC VAX主机,带着20、30个终端!操作系统是VMS。大部分终端是纯字符模式的VT220,只有少数是带有图形功能的VT340(如果还没记错的话)。使用的编程语言是Fortran,而作图指令则是VT340终端扩展的ESC指令序列。
那时候上机机会本来就不多,更难“抢”到有限的图形终端。所以,那时候只是大致画出了M集的轮廓,很不完善。后来也马上不了了之了。
2, 286 / 486, DOS, TC
后来有机会用上了286电脑,上机机会也多了,能够好好画画这个神秘的图像了。那时候的操作系统还是DOS,编程用的开发语言是Turbo C 2.0(TC,非常经典的C语言开发环境)。使用的作图子系统是TC带的BGI库(Borland Graphics Interface)。
286电脑,用的CPU当然是80286,主频大约20MHz左右,而且是不带数学协处理器的,所有浮点运算都是软件实现的。所以,当时画一个M集的全图,640*480的分辨率,竟然需要2个小时左右。那时候,为了看一副图像,是很需要耐心的!
再后来,用上了486电脑,当然是带有数学协处理器的。这时候,画一副图像的速度得以大大提高,大概需要一两分钟吧。
3, Windows GDI, Delphi
终于进入Windows时代了。我选择了Borland的Delphi(使用Pascal语言)来画M集图像。作图指令方面,调用的是VCL控件的Canvas对象,实际上就是在Windows GDI上作图。电脑性能提高相对以前提高不少了,画一个M集图像大概需要十几秒几十秒左右。
4, AutoCAD, Lisp
用AutoCAD画M集是不常见的,至少我没听说过。早期的AutoCAD的二次开发语言一直是Lisp语言,称为AutoLisp。我用AutoCAD来画M集,一方面是想画个立体的M集图像,另一方面,是因为我对Lisp语言的喜爱。
Lisp语言是与Fortran差不多“古老”的语言,擅长表处理,号称人工智能语言。其实,我一直认为Fortran、C、Pascal、Basic等语言,其实都很相像。而Lisp就与众不同!
诚然,排除硬件上的关系,这也是我所有相应软件中画M集最慢的。AutoLisp本来就是在AutoCAD下运行的解释型语言,运行是偏慢的。而且我画出来的,实际上都是3D对象。我使用了有高度的PLine对象,根据颜色的不同(也就是迭代次数的不同),使用不同的高度,类似于地图上的等高线和实际地形的关系。这样,画得慢是自然的。但画好之后,就不是简单的平面点阵图了,而是AutoCAD中真正的3D对象,可以渲染,可以变换多种角度和视角来观看。还是很有意思的。
5, Windows DirectX, VC++
为了突破低效的Windows GDI,达到更快的作图速度,甚至是动画式的实时渲染,也为了练习使用DirectX,我最近使用MS VC++和DirectX SDK重写了M集作图的程序。
Tags: Mandelbrot, 分形, 混沌