第2章 一个简单的交互式图形软件PPT讲稿.ppt

上传人:石*** 文档编号:43979006 上传时间:2022-09-20 格式:PPT 页数:16 大小:876.50KB
返回 下载 相关 举报
第2章 一个简单的交互式图形软件PPT讲稿.ppt_第1页
第1页 / 共16页
第2章 一个简单的交互式图形软件PPT讲稿.ppt_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《第2章 一个简单的交互式图形软件PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第2章 一个简单的交互式图形软件PPT讲稿.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第2 2章章 一个简单的交互式一个简单的交互式图形软件图形软件第1页,共16页,编辑于2022年,星期一第第2 2章章 一个简单的交互式图一个简单的交互式图形软件形软件 2.1 Turbo C2.1 Turbo C的图形函数的图形函数2.2 Turbo C2.2 Turbo C的图形初始化的图形初始化2.3 2.3 一个简单交互式图形软件一个简单交互式图形软件第2页,共16页,编辑于2022年,星期一2.1 Turbo C2.1 Turbo C的图形函数的图形函数Turbo CTurbo C的两类与图形相关的函数有两类的两类与图形相关的函数有两类1)1)字符屏幕函数字符屏幕函数基本输入输出函

2、数基本输入输出函数屏幕操作函数屏幕操作函数属性控制函数属性控制函数状态查询函数状态查询函数2)2)图形函数图形函数屏幕显示适配器模式控制函数屏幕显示适配器模式控制函数基本图形功能函数基本图形功能函数字符输出函数字符输出函数屏幕状态函数屏幕状态函数屏幕操作函数屏幕操作函数第3页,共16页,编辑于2022年,星期一2.2 Turbo C2.2 Turbo C的图形初始化的图形初始化2.2.1 2.2.1 初始化函数初始化函数在图形函数使用之前,必须把屏幕显示适配器设置为某一种图形模式。在未在图形函数使用之前,必须把屏幕显示适配器设置为某一种图形模式。在未经定义的情况下,绝大多数计算机系统都使用经定

3、义的情况下,绝大多数计算机系统都使用8080列字符模式。由于这不是图列字符模式。由于这不是图形模式,形模式,Turbo CTurbo C的图形函数不能工作。若要将显示适配器设置成图形方式,的图形函数不能工作。若要将显示适配器设置成图形方式,必须先用必须先用initgraph()initgraph()函数初始化屏幕。其原型如下:函数初始化屏幕。其原型如下:void far initgraph(int*graphdriver,int*graphgmode,char*path);void far initgraph(int*graphdriver,int*graphgmode,char*path);

4、initgraph()initgraph()函数将一个图形驱动程序装入内存,并将系统设置成图形模式。如果没函数将一个图形驱动程序装入内存,并将系统设置成图形模式。如果没有装入图形驱动软件,图形函数将不能操作。有装入图形驱动软件,图形函数将不能操作。graphdrivergraphdriver是一个整数,它指定所用的图形驱动程序。用户可以用枚举常量对是一个整数,它指定所用的图形驱动程序。用户可以用枚举常量对它赋值,这些常量定义在它赋值,这些常量定义在graphics.hgraphics.h中。中。*graphmode *graphmode是一个整数,它说明初始化图形模式。是一个整数,它说明初始化

5、图形模式。第4页,共16页,编辑于2022年,星期一示例示例2 21:1:使用图形初始化函数将显示适配器设置为使用图形初始化函数将显示适配器设置为VGAVGA高分辨率图形模式。高分辨率图形模式。#include#include main()main()int graphdriver,graphmode;int graphdriver,graphmode;graphdriver=VGA;/*graphdriver=VGA;/*选选 VGA VGA 驱动器驱动器*/*/graphmode =VGAHI;/*graphmode =VGAHI;/*选选 VGA VGA 高分辨率图形模式高分辨率图形模式

6、*/*/initgraph(&graphdriver,&graphmode,C:tc);/*initgraph(&graphdriver,&graphmode,C:tc);/*图形初始化图形初始化*/*/bar3d(200,200,400,350,50,1);/*bar3d(200,200,400,350,50,1);/*画一长方体画一长方体*/*/getch();getch();closegraph();/*closegraph();/*关闭图形模式关闭图形模式*/*/第5页,共16页,编辑于2022年,星期一大多数情况下编程者并不知道所用的图形显示适配器类型,或者需要编写在不同图形模式下均

7、能运行的图形大多数情况下编程者并不知道所用的图形显示适配器类型,或者需要编写在不同图形模式下均能运行的图形程序,程序,Turbo C Turbo C 提供了一个自动检测显示器硬件的函数提供了一个自动检测显示器硬件的函数,其函数原型为其函数原型为:void far detectgraph(int*graphdriver,*graphmode);void far detectgraph(int*graphdriver,*graphmode);示例示例2-2:2-2:自动进行硬件测试后进行图形初始化程序自动进行硬件测试后进行图形初始化程序#include#include main()main()in

8、t graphdriver,graphmode;detectgraph(&graphdriver,&graphmode);/*自动测试硬件*/printf(Detect graphics driver is%d,mode is%dn,graphdriver,graphmode);/*输出测试结果*/getch();initgraph(&graphdriver,&graphmode,“C:tc”);/*根据测试结果初始化屏幕*/bar3d(50,50,250,150,20,1);getch();closegraph();第6页,共16页,编辑于2022年,星期一2.2.2 2.2.2 屏幕长宽比

9、确定屏幕长宽比确定Turbo CTurbo C支持各种不同的视屏适配器和显示模式。支持各种不同的视屏适配器和显示模式。每一种都带有它自己的彩色范围、分辨率和每一种都带有它自己的彩色范围、分辨率和存储页面。每一种图形模式都有其特定的长宽比,即:基于每一象素的宽与高之间的比率。当存储页面。每一种图形模式都有其特定的长宽比,即:基于每一象素的宽与高之间的比率。当我们试图在屏幕上绘制一个特定大小和形状的图形时,这个比率是很重要的。例如,如果用我们试图在屏幕上绘制一个特定大小和形状的图形时,这个比率是很重要的。例如,如果用CGA CGA 320*200320*200模式,每一象素的高约为宽的两倍。模式,

10、每一象素的高约为宽的两倍。因此,如果我们画因此,如果我们画4*44*4的像素块,将得不到屏幕的像素块,将得不到屏幕上的正方形。很显然,当我们要想画一个真正的正方形而不是长方形时,就必须调整模式的高上的正方形。很显然,当我们要想画一个真正的正方形而不是长方形时,就必须调整模式的高宽比。宽比。getaspectratio()getaspectratio()函数就是为此而设的。我们将在不使用浮点数的情况下,以一种非常有效的方函数就是为此而设的。我们将在不使用浮点数的情况下,以一种非常有效的方式处理这个长宽比值。为了能用整数来表示高式处理这个长宽比值。为了能用整数来表示高h h和宽和宽w w而不降低精

11、确性,这里必须用很小的单位。在而不降低精确性,这里必须用很小的单位。在Turbo CTurbo C中这一单位是象素高的万分之一中这一单位是象素高的万分之一;换句话说,换句话说,每个象素的高度是一万个单位。我们把这种单每个象素的高度是一万个单位。我们把这种单位称为位称为“微元微元”。现在若想得到一个象素的宽和高是多少微元,可通过如下调用来得到:。现在若想得到一个象素的宽和高是多少微元,可通过如下调用来得到:getaspectratio(&h,&w);getaspectratio(&h,&w);这里这里w w和和h h是整型变量,分别表示象素的以微元为单位的宽和高。此调用执行后,是整型变量,分别表

12、示象素的以微元为单位的宽和高。此调用执行后,得到:得到:h=10000 h=10000 w 10000(w 10000(除除VGAVGA模式外,其余模式下模式外,其余模式下w w都小于都小于10000)10000)可以用可以用w:hw:h来计算屏幕的长宽比。来计算屏幕的长宽比。第7页,共16页,编辑于2022年,星期一例例2 23 3画一个正方形画一个正方形(正方形左上角点在象素坐标正方形左上角点在象素坐标50,5050,50处处)。其高。其高H H为为100100个象素,依照上个象素,依照上面的定义,我们得到其高相当于面的定义,我们得到其高相当于H*hH*h个微元,其宽也应是个微元,其宽也应

13、是H*hH*h个微元,即相当于水平方向个微元,即相当于水平方向W=H*h/wW=H*h/w个象素。个象素。例程在不同的显示适配器上都能显示出标准的正方形例程在不同的显示适配器上都能显示出标准的正方形。例例2 23:3:#include main()int driver,mode;int h,w,H,W;driver=DETECT;initgraph(&driver,&mode,);/*图形模形初始化*/getaspectratio(&w,&h);/*获取象素的高宽比*/H=100;W=(long int)H*h/w;line(50,50,50+W,50);line(50,50,50,H+50)

14、;line(50,H+50,50+W,H+50);line(50+W,50,50+W,H+50);getch();closegraph();第8页,共16页,编辑于2022年,星期一2.2.3 Turbo C2.2.3 Turbo C的图形程序的图形程序DemoDemo Bgidemo.c/*GRAPHICS DEMO FOR TURBO C 2.0 Copyright(c)1987,88 Borland International.All rights reserved.From the command line,use:tcc bgidemo graphics.lib*/第9页,共16页,

15、编辑于2022年,星期一2.2.4 2.2.4 图形坐标系统图形坐标系统 由上述分析及例程可以看出,由实际坐标变成屏幕上的图形时,为了克服不同由上述分析及例程可以看出,由实际坐标变成屏幕上的图形时,为了克服不同显示适配器宽高比之间的差异,先要将实际坐标值变为屏幕象素坐标值,再用修显示适配器宽高比之间的差异,先要将实际坐标值变为屏幕象素坐标值,再用修正后的象素坐标画图。也即,我们实际上使用了两个坐标系统:其一为象素坐标正后的象素坐标画图。也即,我们实际上使用了两个坐标系统:其一为象素坐标系统;其二为实际的用户坐标系统;其二为实际的用户坐标(即世界坐标即世界坐标)。有了这两套坐标及它们之间的相互。

16、有了这两套坐标及它们之间的相互关系,就可以编写出在任意图形模式下都能等同工作的图形软件。关系,就可以编写出在任意图形模式下都能等同工作的图形软件。但由于象素坐标决定于硬件本身,配置不同的显示器就会有不同的象素坐标。但由于象素坐标决定于硬件本身,配置不同的显示器就会有不同的象素坐标。而世界坐标因本身就是图形对象的实际坐标,也是变化的。这就导致一个问题,而世界坐标因本身就是图形对象的实际坐标,也是变化的。这就导致一个问题,当在不同显示适配器上工作或工作对象不同时,我们没有一个不变的坐标系统。当在不同显示适配器上工作或工作对象不同时,我们没有一个不变的坐标系统。然而,实际上,我们需要一个这样的不因外

17、界条件或操作对象而变的坐标系统,然而,实际上,我们需要一个这样的不因外界条件或操作对象而变的坐标系统,用来定义和确定菜单位置等。这就引出了我们要定义的第三个坐标系统:屏幕坐用来定义和确定菜单位置等。这就引出了我们要定义的第三个坐标系统:屏幕坐标系统。标系统。第10页,共16页,编辑于2022年,星期一2.2 Turbo C2.2 Turbo C的图形初始化的图形初始化象素坐标系统:仅与所配置的显示适配器有关。象素坐标的原点始终在屏幕的左上角,其轴沿水平方向向右延伸,而轴则是沿铅垂方向向下延伸。注意,在第十二章中介绍的Turbo C提供的所有标准绘图函数都是用象素坐标工作的。世界坐标系统:是用户

18、实际坐标,而在现实应用中实际上存在两种不同的世界坐标系统。屏幕坐标系统:坐标原点为屏幕左下角,设其横轴长为x_max=2000,而竖轴的长度y_max则是根据屏幕的实际长宽比由以下函数计算得到:void boundaries_uc(void)int w,h;getaspectratio(&w,&h);/*得到屏幕象素点的高宽比 */X_max=getmaxx();/*得到屏幕水平方向的象点数*/Y_max=getmaxy();/*得到屏幕竖直方向的象点数*/y_max=x_max*(float)Y_max*h/(float)X_max*w);函数中X_max、Y_max、x_max和y_max

19、均为全程变量。由此,我们便定义了一个横轴总长不变、竖轴长度根据实际屏幕象素长宽比进行调整的屏幕坐标系统,屏幕坐标系统的原点在屏幕左下角。第11页,共16页,编辑于2022年,星期一2.2.5 2.2.5 坐标系变换函数坐标系变换函数 1 1).由象素坐标转换为屏幕坐标由象素坐标转换为屏幕坐标 float xhpg(int X)return X*x_max/X_max;float xhpg(int X)return X*x_max/X_max;float yhpg(int Y)return(Y_max-Y)*y_max/Y_max;float yhpg(int Y)return(Y_max-Y)

20、*y_max/Y_max;2 2).由屏幕坐标转换为象素坐标由屏幕坐标转换为象素坐标 int Xpixel(float x)int Xpixel(float x)return(int)(long)X_max*x/x_max);return(int)(long)X_max*x/x_max);int Ypixel(float y)int Ypixel(float y)return Y_max-(int)(long)Y_max*y/y_max);return Y_max-(int)(long)Y_max*y/y_max);int Spixel(float s)int Spixel(float s)r

21、eturn(int)(long)Y_max*s/y_max);return(int)(long)Y_max*s/y_max);其中其中Spixel()Spixel()为将屏幕坐标的长度转换象素坐标的长度。为将屏幕坐标的长度转换象素坐标的长度。第12页,共16页,编辑于2022年,星期一3 3).由世界坐标转换为屏幕坐标由世界坐标转换为屏幕坐标 float world_to_pmzb_x(float x)float world_to_pmzb_x(float x)return(int)(x-offset_x)*factor);return(int)(x-offset_x)*factor);flo

22、at world_to_pmzb_y(float y)float world_to_pmzb_y(float y)return(int)(y-offset_y)*factor);return(int)(y-offset_y)*factor);float world_to_pmzb_s(float s)float world_to_pmzb_s(float s)return(s*factor);return(s*factor);4 4).由屏幕坐标转换为世界坐标由屏幕坐标转换为世界坐标float pmzb_to_world_x(float x)float pmzb_to_world_x(floa

23、t x)return(offset_x+x/factor);return(offset_x+x/factor);float pmzb_to_world_y(float y)float pmzb_to_world_y(float y)return(offset_y+y/factor);return(offset_y+y/factor);float pmzb_to_world_s(float s)return(s/factor);float pmzb_to_world_s(float s)return(s/factor);第13页,共16页,编辑于2022年,星期一2.3 2.3 一个简单交互式图

24、形软件一个简单交互式图形软件2.3.1 2.3.1 图形软件功能图形软件功能本例给出一个考虑了屏幕纵横比,并使用了象素坐标和屏幕坐标的简单交互式图形软件。图形程序可根据键盘选择画折线、画园和画矩形,方式如下:1)缺省选择为画折线将光标移至要画线的起点,用回车健选中该点,光标移动,带着一条橡皮线,再次按回车健即确定了折线上一个点,继续画折线,当选择e健时,终止该折线。2)选择字母C健为画一个由园心和半径确定的园。3)选择字母B健为画一个由两对角点确定的屏幕矩形。4)当选折Esc健(或q健)时终止图形程序运行。第14页,共16页,编辑于2022年,星期一2.3.2 2.3.2 事件驱动方式事件驱动

25、方式交互式图形软件是靠事件来驱动程序运行的。即,程序是由用户通过外部设备(本例仅有键盘设备)触发运行。处理触发事件一般都是设置一个无限循环语句,在循环体内设置测试事件的触发状态的语句,根据检测到的事件调用相应处理函数。本例中的事件触发方式为两个嵌套的while循环,外层while循环保持程序持续运行,内层while循环通过一个newposition函数监测键盘状态,当键盘触发事件发生,且满足newposition终止条件时,通过函数返回事件内容。do newposition(&x,&y,&X,&Y,&buttons);该事件驱动循环在程序会已不同方式多次出现。2.3 2.3 一个简单交互式图形软件一个简单交互式图形软件第15页,共16页,编辑于2022年,星期一2.3 2.3 一个简单交互式图形软件一个简单交互式图形软件2.3.3 2.3.3 图形程序运行图形程序运行 Example1.cExample1.c第16页,共16页,编辑于2022年,星期一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁