第12章C作图与图形处理.ppt

上传人:sccc 文档编号:5894045 上传时间:2023-08-31 格式:PPT 页数:43 大小:630.04KB
返回 下载 相关 举报
第12章C作图与图形处理.ppt_第1页
第1页 / 共43页
第12章C作图与图形处理.ppt_第2页
第2页 / 共43页
第12章C作图与图形处理.ppt_第3页
第3页 / 共43页
第12章C作图与图形处理.ppt_第4页
第4页 / 共43页
第12章C作图与图形处理.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《第12章C作图与图形处理.ppt》由会员分享,可在线阅读,更多相关《第12章C作图与图形处理.ppt(43页珍藏版)》请在三一办公上搜索。

1、2023/8/31,1,第十二章 C作图与图形处理,图形系统的初始化及基本框架图形系统中的像素与坐标常用图形函数图形方式下的文本输出函数屏幕操作函数及动画基本知识VRAM的读写,2023/8/31,2,第一节 图形系统的初始化及基本框架,显示器的工作方式:文本方式(默认方式)以字符为单位显示文本,一般一屏25行80列字符图形方式 以像素为单位显示图形以上两种显示方式可以互相转换,2023/8/31,3,一、图形方式的初始化,要作图,必须对显卡初始化,使之工作在图形方式:初始化函数:void initgraph(int*gdriver,int*gmode,char*driver_path)该函数

2、在“graphics.h”中定义第一个参数对应显示适配器的类型,目前绝大多数显卡都是VGA显卡第二个参数对应显示方式(表12-1所示)第三个参数用来指明显卡驱动程序的位置,若在当前目录中,可写为“”,初始化方法一:int main()int driver=VGA;/VGA其实是枚举常量 int mode=VGAHI;/高分辨率,见p141表 initgraph(,2023/8/31,4,特别说明:作图程序编译、连接后,形成可执行文件(.exe文件),此文件若拷贝到其他机器上运行,必须保证显示驱动程序在该机存在,且在指定目录中。若用:initgraph(则驱动程序应与.exe文件在同一目录通常,

3、都是把驱动程序和可执行文件一起拷贝。,2023/8/31,5,特别说明:若不想向另外机器上拷贝驱动程序,想生成一个可独立运行的exe文件,则需按下面三步进行:1.D:tcBGIOBJ EGAVGA 磁盘上将生成EGAVGA.OBJ文件2.D:tcTLIB libgraphics.lib+egavga.obj 磁盘上graphics.lib将包含驱动程序(增加4K)3.程序中,initgraph()调用前加上一行:registerbgidriver(EGAVGA_driver);,2023/8/31,6,特别说明:同样的道理,若需要不依赖于字体(英)驱动的可执行文件,也需将字体驱动连接到grap

4、hics.lib中,如:1.D:tcBGIOBJ trip D:tcBGIOBJ litt 磁盘上将生成trip.obj、litt.obj文件2.D:tcTLIB libgraphics.lib+trip.obj D:tcTLIB libgraphics.lib+litt.obj graphics.lib将包含字符驱动程序 3.程序中,initgraph()调用前加上:registerbgifont(triplex_font);registerbgifont(small_font);,2023/8/31,7,若不知道显示器的类型,可将graphdriver置为DETECT,系统将自动检测其类型

5、,将相应的驱动程序装入,并将显示模式置成最高模式初始化方法二:int main()int driver=DETECT;int mode;initgraph(return 0;,2023/8/31,8,2023/8/31,9,二、图形方式的关闭,关闭图形方式,返回文本方式的函数:void closegraph()说明:还有一个restorecrtmode()也可以返回文本方式,两者的区别:后者在内存中保留驱动程序和字符集,暂时返回文本方式,可随时用函数setgraphmode(VGAHI)切换回图形方式,而closegraph()则是完全释放驱动程序和字符集。,作图程序开始时,先要用initgr

6、aph()初始化,而在作图结束时,总要用closegraph()关闭图形方式,使屏幕转回文本方式,程序中的initgraph()和closegraph()总是成对出现的。初始化后的清屏:初始化后一般应清屏,使屏幕如同一张白纸,清屏函数的原型是:void cleardevice();,2023/8/31,10,2023/8/31,11,三、作图程序的基本框架及实例,#include/包含绘图头文件int main()int gdriver=DETECT;int gmode;initgraph(,2023/8/31,12,例12-1:画圆程序#include int main()int gdriv

7、er=DETECT;int gmode;initgraph(,2023/8/31,13,第二节 图形系统中的像素与坐标,图形方式下,屏幕被划分为一个一个的“点”,这些点被称作像素。像素是组成图像的最基本元素。像素的位置是由坐标表示的图形初始化后,系统默认的画图区域是整个屏幕,画笔的位置是(0,0)-即屏幕左上角。见图12-1(p144),像素操作函数:void putpixel(int x,int y,int color);功能:在指定位置用指定颜色画一个点作图颜色与常量之间的对应关系见表12-2(p144)int getpixel(int x,int y);功能:返回指定位置的像素颜色,20

8、23/8/31,14,2023/8/31,15,第三节 常用图形函数,函数原型及使用说明参见教材12.3在程序框架下,逐个练习每个作图函数的用法。,2023/8/31,16,第四节 图形方式下的文本输出函数,1、void outtext(char*textstring);功能:在当前位置输出字符串说明:textstring可以是指向字符串的指针变量,也可以是字符串常量如:char*p=“hello”;outtext(p);outtext(“hello”);,2023/8/31,17,2、void outtextxy(int x,int y,char*textstring);功能:在指定位置输出

9、字符串如:char*p=“hello”;outtextxy(200,100,p);或:outtextxy(200,100,“hello”);,2023/8/31,18,3、void settextstyle(int font,int derection,char size);功能:设置文本的字体、字号和输出方向4、void settextjustyle(int horiz,int vert);功能:设置文本输出的对齐方式以上两个函数的详细说明请参阅教材,2023/8/31,19,实 训,1、画一条正弦曲线(一个周期)2、在屏幕上模拟满天星、时明时灭的效果3、分别画一个圆、椭圆、矩形、条形图、扇

10、形图、三维条形图,并用不同颜色填充4、键盘输入10名学生的成绩(三科),画出总分前三名的直方图,用圆饼图画出平均分在各分数段的比例(不及格、60-69,70-79,80-89,90-100),图形中要有图例。,2023/8/31,20,第五节 屏幕操作函数及动画知识,常用的屏幕操作函数动画设计的方法动画举例,2023/8/31,21,一、屏幕操作函数,屏幕操作函数void getimage(int x1,int y1,int x2,int y2,void*bitmap);unsigned imagesize(int x1,int y1,int x2,int y2);void putimage(

11、int x1,int y1,void*bitmap,int op);void setviewport(int x1,int y1,int x2,int y2,int clipflag);void clearviewport();,2023/8/31,22,二、动画设计的方法,利用动态开辟图视口的方法利用显示页和编辑页的交替变化的方法利用画面存储再重放的方法直接写屏的方法,2023/8/31,23,三、动画设计举例,利用动态开辟图视口的方法一步步做(例12-2)利用画面存储再重放的方法一步步做(例12-3),2023/8/31,24,第六节 VRAM的读写,屏幕图形与VRAM的关系VGA显存的位

12、面结构图像存储(读VRAM)图像回放(写VRAM),2023/8/31,25,一、屏幕图形与VRAM的关系,显存中的数据(二进制数)通过显卡的一些部件转变为模拟信号后,发送到显示器上,便是我们看到的图像。由此可知:屏幕上的图像是由显存中的数据决定的。,2023/8/31,26,结论:改变显存中的数据,就可以改变图像把显存中的数据写到文件中,意味着存储了图像将文件中的数据重新写回显存,可再现原来的图像,2023/8/31,27,二、VGA显存的位面结构,VGA显存与内存统一编址,显存的起始地址是:0 xa000:0 x0000VGA显存最多256K,平均分成4部分,每部分64K,称作一个位面。,

13、2023/8/31,28,二、VGA显存的位面结构,四个位面(0、1、2、3)使用相同的地址,即:显存中的一个地址实际上对应着4个位面上的4个字节(每位面一个字节),2023/8/31,29,二、VGA显存的位面结构,4个位面上相同位置的4个二进制数,决定着显示器上一个像素的颜色。,位面3,位面0,2023/8/31,30,2023/8/31,31,三、图像存储(读VRAM),要将图像存起来,实际上就是把显存4个位面中的数据存起来,即把0 xa000:0 x0000开始的、总共640*480/8=38400个字节的4个位面的数据全部存到文件中,可用fputc()函数但是,每次只能读取一个位面上

14、的数据,如何选取位面?,2023/8/31,32,VGA显卡上有一个图形控制器,含有许多寄存器,其中有个读位面选择寄存器(口地址0 x3cf),通过给它不同的数值,可以实现对位面的选择(仅读操作时)如:outportb(0 x3cf,0);/表示要读位面0outportb(0 x3cf,1);/表示要读位面1,2023/8/31,33,但是,读位面选择寄存器和其他8个寄存器共用一个口地址,用哪个由索引寄存器决定:,2023/8/31,34,可见,前面代码“outportb(0 x3cf,0);”中的“0”送入哪个寄存器,是由索引寄存器控制的。索引寄存器的口地址是0 x3ce,当索引值是4时,表

15、示选中的是读位面选择寄存器,“0”才能被送入读位面选择寄存器,2023/8/31,35,数据:0,4,0:XX寄存器,4:读位面选择寄存器,1:XX寄存器,2:XX寄存器,3:XX寄存器,5:XX寄存器,6:XX寄存器,7:XX寄存器,索引寄存器口地址:0 x3ce,8:XX寄存器,口地址:0 x3cf,执行outport(0 x3cf,0)的过程,2023/8/31,36,因此,需要:先用下面的语句指明:口地址0 x3cf对应的是“读位面选择寄存器”outportb(0 x3ce,4);然后再选择位面:outportb(0 x3cf,0);/设要读位面0两者可以合并:outport(0 x3

16、ce,0 x0004);,2023/8/31,37,核心代码:char far*p;fp=fopen(pic.dat,wb);for(i=0;i 4;i+)outportb(0 x3ce,4);/选择读位面选择寄存器 outportb(0 x3cf,i);/选择位面i p=(char far*)0 xa0000000L;/p指向显存开头 for(j=0;j 38400L;j+)putc(*p,fp);p+;,写位面与读位面不同,可以同时写几个位面(写进每个位面的数据是相同的)。若数据不相同,需要分别写,一次写一个位面。写哪些位面,由颜色位面写允许寄存器(口地址:0 x3c5)的低4位控制,如:

17、,2023/8/31,38,四、图像回放(写VRAM),2023/8/31,39,同样:颜色位面写允许寄存器也是和其他寄存器共用一个口地址的,2023/8/31,40,可见,口地址0 x3c5对应着哪个寄存器,是由索引寄存器(口地址:0 x3c4)中的索引值决定的。当索引值为2时,表示选择了颜色位面写允许寄存器,故要用下面代码先选择颜色位面写允许寄存器:outportb(0 x3c4,2);,2023/8/31,41,核心代码:char far*p;int k=1;fp=fopen(pic.dat,“rb);for(i=0;i 4;i+)outportb(0 x3c4,2);/选择“写允许寄存器”outportb(0 x3c5,k);/选择位面n,2n=k p=(char far*)0 xa0000000L;/p指向显存开头 for(j=0;j 38400L;j+)*p=fgetc(fp);p+;k*=2;,2023/8/31,42,例12-4:用直接读写VRAM的方法实现图像的存储和回放代码参阅教材,2023/8/31,43,实 训,5、利用动画技术在屏幕上模拟两个小球的相向运动,碰撞后分开,到达边缘后改变方向继续相向运动6、利用动画技术模拟小球在桌面上不断跳动的过程说明:小球运动过程中,速度是变化的小球每次弹起的高度是递减的,直至0,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号