Science 版 (精华区)
发信人: qpcwth (独翅鸟), 信区: Science
标 题: 《分形艺术》32
发信站: 哈工大紫丁香 (2001年11月03日18:10:14 星期六), 站内信件
第三章 计算机上作图
3.10 微机图形功能一瞥
作者读大学本科时(1984-1988),国内微机还很少见,一般用中型机终端。我们地质
系幸好有一台8位的微机,没有硬盘,每次工作时都是在5英寸的软盘上做。当时用的高
级语言主要是BASIC和FORTRAN,少数人用PASCAL,极少人用C。给我清晰印象的是,当时
的计算机图形功能很差,描直方图、正弦曲线等简单图形,都是用“*”一类字符串连接
起来表示的。不过,当时看到计算中心用明暗不同的字符打印的“蒙娜丽莎”画像,还
是羡慕不已。当时图形功能的落后,不仅表现在硬件上,也表现在软件上。
本科毕业后因改行学了哲学,有一段时间没有接触计算机,有一日(大约是1990年)
去机电部六所我同学那里,见朋友们在有20M硬盘的8086机上玩游戏、用PASCAL编写图形
程序,大吃一惊。立即有一种念头涌上心头:等我有钱了,一定自己买一台如此棒的机
器玩玩。现在回想起来,有两点值得一提:1)那时见到的机器,现在扔了也没人要。2)
当时机器很贵,对我那样一个穷学生来说,个人买机器等于白日做梦。后来幸亏微机价
格降下来了。
我们迅速编写了一个计算芒德勃罗集的PASCAL程序,结果令那些学计算机的硕士生
们很吃惊,运算量竟如此大,200×200个象点居然要计算一顿饭功夫!后来找到当时
较先进的386机器进行计算,大约几分钟能算完。而现在用486DX80,很快就能算完640×
480大小的分形图形。计算机技术的进步的确让人振奋。
言归正传,以Turbo PASCAL 6.0为例说说做分形图时要经常考虑的“图形接口”问
题。
PASCAL提供了多种*.BGI驱动程序,通过初始化后,即可在图形界面下调用有关“函
数”、“过程”,对屏幕、内存、文件等进行若干操作。欲了解详情请参考《Turbo PA
SCAL库函数参考指南》一类书,也可以启动Turbo PASCAL的“集成开发环境”(IDE),打
开“帮助”(Help)选单学习、查询。用鼠标查询时,先将光标移至待查单词(比如InitG
raph)处,按鼠标右键,则直接进入该主题的帮助状态。
3.10.1图形方式下输出字符
程序如果要使用图形方式,程序开头应当在Uses语句中声明(Uses Graph;)。启动图
形方式用“InitGraph过程”,关闭图形方式用“CloseGraph过程”。绘完图,一定不要
忘记关闭图形方式。
在文本方式下输出字符是方便的,但在图形方式下,则必须用专门的语句向屏幕指
定的位置输出文字。常用如下几个过程:
SetBkColor(颜色号码);{设置背景颜色}
SetColor(颜色号码);{设置前景图画颜色}
SetTextStyle(字体,方向,字号);{设置字模}
OutTextXY(横坐标,纵坐标,欲输出的字符串);{输出文字}
上面的第三个过程中说的字体,存放在*.CHR文件中,此类文件与*.BGI文件的路径应当
告诉程序,否则程序找不到,不能加载。
3.10.2 描点语句
绘图中最重要的一个语句当属描点语句了,在PASCAL中需调用PutPixel过程:PutP
ixel(横坐标,纵坐标,颜色值);坐标值在计算机中当然都得用“整数”来表示,所以
如果这些值原来不是整数,在描点之前 需要把它们变成整数(用取整函数Round即可)。
3.10.3 块读与块写
为提高效率,要经常使用块读、块写过程,特别是将内存的信息写到文件中去时。
这两个过程是:
BlockRead(FromF,buf,SizeOf(buf),NumRead);
BlockWrite(ToF,buf,NumRead,NumWritten);
在读写一个文件之前必须打开这个文件,所以这两个过程通常与下述语句连用:
Assign(f, filename);{将外部文件名赋给一个文件变量}
ReWrite(f, 1);{创建并打开文件}
BlockWrite(f, win.width, sizeof(win.width));
BlockWrite(f, win.height, sizeof(win.height));
BlockWrite(f, bps, SizeOf(bps));
BlockWrite(f, pal, SizeOf(pal));
…
size:=ImageSize(0,0,299,119);
GetMem(p,size);{p是指针变量}
BlockRead(f,p^,size);
PutImage(0,0,p^,copyput);
FreeMem(p,size);
3.10.4 图形方式下在屏幕输出变量的值
在图形方式下想在屏幕输出程序计算出来的变量的值,首先应当将变量的值转化成
字符串,然后移动指针到指定的位置,再用OutText输出符号串。
Uses graph,crt;
Var
pmin:real;{定义实数变量}
ppx:string;{定义字符串变量}
…
SetTextStyle(1,0,4);
Str(pmin,ppx);{将实数转换成字符串}
OutTextXY(10,380,'pmin=');{在(10,380)处输出“pmin=”字样}
MoveTo(80,380);{将指针移到(80,380)处}
OutText(ppx);{写ppx所代表的字符串}
最后两句也可以用OutTextXY(80,380,ppx)写。
用熟了PASCAL的图形接口语句,再转到C或者C++都相当容易,只是在PASCAL中可以
随便用大小写,而C语言严格区分大小写(InitGraph与initgraph不同),不能随便用。
--
心事浩茫连广宇,于无声处听惊雷
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.914毫秒