版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.SaaS介绍1.1SaaS概念SaaS是Software-as-a-service(软件即服务)的简称,是随着互联网技术的发展和应用软件的成熟,而在21世纪开始兴起的一种完全创新的软件应用模式。它是一种通过Internet提供软件的模式,厂商将应用软件统一部署在自己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,软件厂商在向客户提供互联网应用的同时,也提供软件
2、的离线操作和本地数据存储,让用户随时随地都可以使用其定购的软件和服务。对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要。在这种模式下,客户不再像传统模式那样花费大量投资用于硬件、软件、人员,而只需要支出一定的租赁服务费用,通过互联网便可以享受到相应的硬件、软件和维护服务,享有软件使用权和不断升级,这是网络应用最具效益的营运模式。1.2 SaaS 专用名词1.多重租赁(Multi-tenancy)SaaS的多重租赁概念就是,多个公司将其数据和业务流程托管存放在SaaS服务商的同一服务器组上,相当于服务商将一套在线软件同时出租给多个公司,
3、每个公司只能看到自己的数据,由服务商来维护这些数据和软件。也就是说,多个公司登录到同一网站,但登录后看到的界面和数据,不同的公司大不相同。 2.单点登录(Single sign-on)这个概念应用在SaaS上,就是指把多个不同的在线应用软件服务搭建成为一种新型的整合服务。用户通常只需要登录一次就可以使用集成好的应用软件组合。 3.基础架构平台(Platform infrastructure)有时候SaaS的拥护者希望出现一种基础架构的平台来推动SaaS更好地发展。 这是因为首先得有一个平台来支撑SaaS软件应用程序的运行,如今最著名的是国外Salesforce公司的APP Exchange平台
4、,国内800CRM的800APP Native的平台与Salesforce兼容。 4. SaaS(软件作为服务)厉害的SaaS销售代表直接用SaaS就能解决你所有管理软件问题。比起其它软件,SaaS软件更便宜,灵活性更强,能省掉更多的麻烦。5 SaaS成熟度模型(SaaS Maturity Model) (1)Level1:定制开发这是最初级的成熟度模型,其定义为Ad Hoc/Custom,即特定的/定制的,对于最初级的成熟度模型,技术架构上跟传统的项目型软件开发或者软件外包没什么区别,按照客户的需求来定制一个版本,每个客户的软件都有一份独立的代码。不同的客户软件之间只可以共享和重用的少量的可
5、重用组件,库以及开发人员的经验。最初级的SaaS应用成熟度模型与传统模式的最大差别在于商业模式,即软硬件以及相应的维护职责由SaaS服务商负责,而软件使用者只需按照时间,用户数,空间等逐步支付软件租赁使用费用即可。(2)Level2:可配置第二级成熟度模型相对于最初级的成熟度模型,增加了可配置性,可以通过不同的配置来满足不同客户的需求,而不需要为每个客户进行特定定制,以降低定制开发的成本。但在第二级成熟度模型中,软件的部署架构没有发生太大的变化,依然是为每个客户独立部署一个运行实例。只是每个运行实例运行的是同一个代码,通过配置的不同来满足不同客户的个性化需求。(3)Level3:高性能的多租户
6、架构在应用架构上,第一级和第二级的成熟度模型与传统软件没有多大差别,只是在商业模式上符合SaaS的定义。多租户单实例的应用架构才是通常真正意义上的SaaS应用架构,即Multi-Tenant架构。多租户单实例的应用架构可以有效地降低SaaS应用的硬件及运行维护成本,最大化地发挥SaaS应用的规模效应。要实现Multi-Tenant架构的关键是通过一定的策略来保证不同租户间的数据隔离,确保不同租户既能共享同一个应用的运行实例,又能为用户提供独立的应用体验和数据空间。(4)Level4:可伸缩性的多租户架构在实现了多租户但单实例的应用架构之后,随着租户数量的逐渐增加,集中式的数据库性能就将成为整个
7、SaaS应用的性能瓶颈。因此,在用户数大量增加的情况下,无须更改应用架构,而仅需简单的增加硬件设备的数量,就可以支持应用规模的增长。不管用户多少,都能像单用户一样方便地实施应用修改。这就是第四级也是最高级别的SaaS成熟度模型所要致力解决的问题。5.独立软件开发者(ISV)开发软件的个人或者公司,ISV通过平台来出售自己的软件6.软件入口ISV出售软件时,提供给用户使用的接口,即ISV开发的软件的进入网址。7.创建子版本ISV根据软件的功能,版软件分成几个不同的子版本,用户可以根据所需运用购买不同的版本,其工作有isv完成8.租户购买了软件的个人或者公司。9.注册序列号isv注册软件时获得的序
8、列号,是isv软件唯一不可变更的序列号,可不计入数据库,单必须保存在isv软件的配置文件中。10.免登陆由平台跳到isv软件时,不需进行再登陆,isv软件根据传过来的用户信息,直接初始化用户信息。11.Token身份验证令牌,在saas平台跳到isv软件时使用,用于验证跳转用户的合法性。Token动态生成,为了安全,其生命长度只有10-20秒。12免登入接口由平台提供的一组验证程序,修改其中的注册序列号后绑定到isv软件,以实现用户的免登入。13参与的软件不是自己购买开发的软件,而是由别人购买并添加,其所有软件显示为参与的软件。14AssP软件互联平台,在这既SaaS平台SaaS平台功能软件注
9、册2.1.1 业务流程图图1 软件注册流程图业务详细说明用户先注册一个平台的帐号,登录后,点击我的软件(即开发的软件)进入,后点击注册软件,填写相关信息,提交成功后,会产生一个软件注册序列号,此序列号为核对客户软件的凭证。最后还需通过平台管理员审核,该软件才会出现在软件商城中,才可供平台用户购买。功能描述注册软件主要是用于给想在该平台上出售软件的第三方客户(软件提供商)提供软件入口,同时填写软件相关详细信息,图片,类别等。注意:注册软件时需要客户填写软件入口,即客户所提供软件的发布网址,当平台上的客户购买了软件后,点击进入使用时,将通过该软件入口进入软件。用例图图2软件审核用例图图3注册软件用
10、例图2.2 软件编辑2.2.1业务流程图图4软件编辑流程图2.2.2业务详细说明软件注册成功并通过审核后,即可在我的软件(开发的软件)中查看,编辑或删除该软件信息,同时还可为软件进行版本分类,可创建,查看,删除子版本。2.2.3功能描述在我的软件中可查看,编辑,删除该软件信息,同时还可为软件进行版本分类,可创建,查看,删除子版本。2.2.4用例图图5软件编辑用例图2.3软件购买2.3.1业务流程图图6软件购买流程图2.3.2业务详细说明用户在软件商城可查看所有平台已通过审核的软件,若用户已登录并未购买过该软件,则可点击购买进行购买软件;点击查看详细信息,可查看软件的详细信息,点击购买可进行购买
11、(前提是用户已登录并未购买过该软件),若此用户已购买过该软件则会提示已购买并跳到购买的软件页面,用户可点击进入使用,若此用户未登录,则提示请先注册并登录。添加用户:若租户购买的授权个数大于1,则可添加其他用户使用软件,添加用户有两种方式:若用户已存在,即添加已在平台上注册的用户,则可通过注册时填写的电子邮件地址进行查找,并添加,添加成功后,对方即可在参与的软件中使用该软件。若用户不存在,即添加还未在平台上注册的用户,则可通过创建新用户来进行添加,并把创建的信息告知对方,对方即可在参与的软件中使用该软件。若不在想让某用户使用该软件,可通过删除操作来删除。续费:租户可根据仅追加使用授权个数,仅追加
12、购买授权期限或同时追加个数和权限来进行续费2.3.3功能描述软件商城显示所有注册了并通过审核的软件,平台上已注册并登录的用户充值后可选择相应的软件根据授权个数和授权时间进行购买。购买成功后即可在购买的软件中查看并使用,同时还可进行续费,添加用户等操作。添加用户用于租户添加自己所购买软件的使用人员,也可根据需要进行删除。注意:授权个数即可使用该软件的人数,客户购买了软件后即成为租户,租户可通过添加用户操作添加用户。 授权时间即该软件可使用的时间,若租户想增加授权个数或增加授权人数,即可通过续费来完成。2.3.4用例图图7软件购买用例图2.4参与软件2.4.1业务流程图无业务流程图。2.4.2业务
13、详细说明通过软件购买中的添加用户可添加用户,成功后,用户点击参加的软件中相应软件的进入使用,可使用包括自己购买的和通过其他租户添加进去使用的软件2.4.3功能描述参加的软件中显示用户可使用的软件列表,包括自己购买的和通过其他租户添加进去使用的软件2.4.4用例图图8参与软件用例图2.5账户与个人信息2.5.1业务流程图无业务流程图。2.5.2业务详细说明用户可根据需要查看余额,进行充值,查看个人信息,修改密码等2.5.3功能描述帐户与个人信息可查看用户的余额,可进行充值,查看个人信息,修改密码等操作2.5.4用例图图9帐户与个人信息用例图02.6 SaaS平台免登陆接口2.6.1业务流程图图
14、1-6-1 免登陆接口的处理流程2.6.2业务详细说明用户请求访问购买的SaaS软件:用户请求使用用户购买的SaaS软件时,平台会将用户ID(User_ID), 软件ID(Application_ID), 购买此软件的租户ID(Renter_ID), 防止重传的Token 这4个参数传值提供软件提供商提供的网址。同时将此时生成的Token序列和时间与访问的用户id,软件id一起保存在数据库里,Token的有效时间理应当设为10秒到20秒左右。SaaS软件访问CheckLogin.aspx 调用免登陆接口:SaaS软件在注册时候会获得一个独有的软件序列号,软件提供商在软件开始运行的代码中加入请求
15、,访问平台判断此用户和本软件是否是合法的软件和用户,SaaS软件应该将软件序列号,时间戳(系统当前时间),请求的接口名,与传送过来的四个值用md5加密生成一个新的sipsign的值,再把sipsign,时间戳,请求的接口名和传送过来的四个值传给平台的CheckLogin.aspx页面请求调用免登陆接口。(如图1-6-2 和 图1-6-3)图 1-6-2 sipsign验证的生成图 1-6-3 请求接口的URL判断请求接口的名称:请求接口理应当分为很多类型,所以在处理页面上应当做分类处理,当然目前只实现的免登陆接口,但为了以后的扩展这种业务流程上的判断不能少(接口名称的命名规则建议为:公司名.模
16、块名.功能名,这样可以用split做分类操作)。如果不存在此名称的接口,则返回一个错误信息。获取请求的数据:根据接口类型的不同,获取不同名称的数据参数。如果获取的某一个数据参数为空,则返回一个错误信息。判断是否重传:根据传送过来的Token序列号和用户id,从数据库读出相应的Token记录,并比较Token中的时间与平台上的当前时间是否超出了Token防重传的时间限制。如果超出了防重传的时间限制,则返回一个错误信息。如果根据Token从数据库读不出任何数据,也返回一个错误信息。Token存取的流程如图1-6-4:图1-6-4 Token存取流程判断参数的合法性:根据传送过来的参数,和平台从数据
17、库读出相应的软件序列号重新做一次sipsign的运算,再将运算结果和SaaS软件传送过来的值做比较,如果相同则合法,如果不相同则返回一个错误信息。处理接口调用请求,返回结果数值:通过一系列的合法判断,最后执行接口的处理请求,不同的接口处理方式不同,需要返回结果由&特殊字符拼接成一个字符串返回给SaaS软件(也可以返回一个xml),如果不需要返回结果的,可以返回一个成功信息。(这部分还需要对安全性进行考虑)2.6.3功能描述接口的实现主要是针对SaaS软件与SaaS平台之间的关联矛盾。因为用户数据与买卖交易数据都存放在SaaS平台之中。当SaaS软件需要获得买卖此软件的某些合法的用户数据的时候就
18、需要和平台进行一定的交互,此时候就要通过接口来实现此种交互。目前SaaS平台上只实现了免登陆的接口,免登陆接口实现用户从平台到第三方软件的链接不需要二次登陆,只需要在平台上购买了此软件,则可以从平台上直接登陆第三方软件使用。接口的种类可以有很多种,如果要扩展的话还可能要有获取购买此软件用户授权的接口,查询购买此软件的用户信息的接口,以及其他等等。2.6.4用例图接口模块不存在用例图。2.7 SaaS软件用户初始化2.7.1业务流程图图 1-7-1 SaaS软件初始化流程2.7.2业务详细说明用户在平台登陆:基于SaaS平台的SaaS软件的用户都是在平台上实现注册登陆的,这样平台上管理多个Saa
19、S软件的时候就可以一次登陆免去多个二次登陆的麻烦。用户在平台通过单点登陆(SSO)链接到SaaS软件上。选择购买的软件进入:用户可以拥有多个软件,不同的软件有不同的软件入口地址。SaaS软件调用免登陆接口:所有的软件一开始都应当判断进入用户的合法性。判断用户所属租户是否存在初始化租户信息:先查看本地数据库中是否存在与此租户是否存在,如果不存在则需要初始化租户及相关的数据,所谓的初始化租户及相关的数据不止是将租户的信息加入到本地数据库,而且要初始化SaaS软件的默认配置。譬如说SaaS软件本身具有默认的几个角色,但由于SaaS软件的特性是由多个不同的租户使用,不同的租户定义的角色有所不同,但又具
20、有相同的系统默认的角色,在这种情况下就需要在初始化租户的时候初始化SaaS软件的默认配置,将系统本身默认的角色与此租户关联起来。还有一点要注意的是,SaaS软件本地数据库里的租户id就是用户在平台上的用户id,通过这样才能判断平台上的用户是否已经在软件本地里初始化过。判断用户是否存在初始化用户信息:如果本地数据库没有此用户信息,且此用户又是合法的,则将此用户的信息存放在数据库里。如果SaaS软件系统功能上是分角色权限的,则需要把给此用户赋予一个最低的权限,再由系统管理员(即是租户)提升此用户的权限。载入登陆用户的权限,信息:当一切判断结束后,如果用户合法且系统初始化信息完毕则用户获得一个具有他
21、在此系统的权限和信息的Session。2.7.3功能描述SaaS软件初始化的过程也即是为了解决平台与SaaS软件之间的关联矛盾问题。但不同的是此部分必须要由软件提供者完成,也就是软件提供者需要在用户登陆的时候就需要判断初始化数据(尽管从流程上看很繁琐,但必不可少)。这个初始化的过程可以解决不同租户在软件中配置不同且又都保留系统默认配置的问题。在初始化的设计我们采用的是一对一的设计方式:图 1-7-2 初始化方式这种初始化方式即是每个用户就需要经历初始化判断的过程,且只有判断后才能把用户数据添加到本地数据库里。即是一个租户买了软件后添加了用户,租户可以不先登陆,用户可以先登陆(因为所有的用户都会
22、触发初始化过程),然而只有登陆过的用户才能出现在SaaS软件的本地数据库中。这种初始化过程是采用分别初始化,一一对应的方式。(至于基于组织结构方式进行初始化方式,我们在改进的功能点与方案中再进行描述讨论)2.7.4用例图此模块无用例图。3SaaS平台需改进的功能点与方案3.1 基于组织机构的软件用户管理方式3.1.1 原功能描述SaaS平台的设计是基于用户的软件使用方式,也就是说每个用户在平台上都是平级的,当用户购买了软件之后他就成了这个软件的一个特定的租户,当用户想要其他的用户使用自己购买的软件的时候,可以把这个软件的使用授权赋予其他平台用户,至于具体的权责划分就在软件中划分,当然租户可以收
23、回赋予的软件使用授权。这样的方式是以个体用户为中心,采用平级的处理来实现软件用户管理。(这方面还需要对恶意注册进行考虑改进)3.1.2 改进后的功能描述根据新的需求,SaaS平台追加一种基于组织机构的软件用户管理方式。也就是说一个组织机构购买了一个软件后可以把软件授权赋予在所属组织机构的用户上。这样的实现方式可以让软件用户的管理更简单,组织机构当然也可以回收某个用户的使用权限,并赋予某个用户多个软件的使用权限。同时,SaaS软件初始化的过程中可以让组织中的人员角色与SaaS软件中人员角色相对应(此功能很难实现)。3.1.3 实现方案如果要添加基于组织机构的软件用户管理方式,则必须先要添加组织机
24、构的注册。也就是说注册的类型分为个人用户注册和组织机构注册。至于组织机构的里所属的用户在理念上是可以由用户自由添加和管理的(这种设计可以认为SaaS平台也具有SaaS软件的部分特点),同时组织机构里的用户也可以设置职位(职位在SaaS平台中并没有太大的作用,但此类信息在组织机构的初始化过程中可能要用到,详细信息在基于组织机构的软件用户初始化方式中讨论说明)。那么一个基于组织机构的软件用户管理方式可以看成是一个简单的管理系统,如图3-1-1:图 3-1-1 组织机构的软件用户管理方式既然组织机构里有属于此组织机构独有的用户,那么出于安全与系统设计上的考虑我们需要让组织机构中的用户与普通的个体用户
25、分别独立开来,所以我们要加一张组织机构用户表来专门存储组织机构用户数据,同时必须要有一个数据字段来记录组织的id,如图3-1-2:图3-1-2 组织机构用户数据结构用户数据信息里可以存放用户的账号,密码,职位等其他用户信息。而组织机构用户是可以由组织机构随意添加的,但组织机构用户只能有其所属的组织机构管理(此部分存在一个恶意注册的问题,可以考虑每个组织机构有个添加用户的上限)。当然,组织机构用户与普通的个体用户在平台上的功能也应该有所不同,且他们涉及到的关系业务逻辑也应当有所不同,具体的设计想法如下:1, 个体用户与组织机构间没有任何关系,即是和组织机构用户没有任何关系,个体用户购买的软件授权
26、是不可以赋予组织机构的用户的。2, 个体用户是一个平级的概念,组织机构用户有上下级关系。3, 个体用户可以通过购买软件成为一个租户,组织机构用户永远都是隶属于组织机构这个租户下的用户,同时也不具有购买软件的功能。4, 个体用户和组织机构用户登陆后所看到的页面应当是不同的。5, 个体用户只能由平台的系统管理员管理,而组织机构用户可以由组织机构管理。软件使用授权的使用分配,其具体的实现方式因为个体用户与组织机构的分类而进行分类处理的,普通个体用户的软件授权是赋予其他的普通个体用户,这个个体用户可以由用户自己添加也可以查找现有的个体用户的账号,这种授权方式简单但操作起来麻烦又不便管理。至于组织机构的
27、授权方式,就是组织机构购买的软件授权赋予组织机构下的组织机构用户,这种选取方式更灵活,如图3-1-3 :图 3-1-3 组织机构软件授权方式为了更好的管理组织下的用户,组织机构也需要设定一个层级关系,如图:3-1-4图3-1-4 组织机构人员层级关系又由于组织机构用户是与组织机构与个体用户的数据表是分开的,所以组织机构管理员对组织机构用户的添加,删除,修改都是可以的,且不会影响平台用户的操作和数据。要实现这部分功能,要添加组织机构表,组织机构用户表,方便层次管理的部门表。如果要自定义角色的话还要添加个组织机构角色表。3.2 基于组织机构的软件用户初始化方式3.2.1 原功能描述原来平台上的用户
28、都是个体用户,且都是平级的,初始化的方式是采用分别初始化,一一对应的方式。也就是说每个可以使用此软件的用户只有第一次登陆到SaaS软件中去才能在SaaS软件中初始化用户数据。这种初始化方式每次初始化的流量小,且每个用户的登陆都能触发租户信息的初始化,但不方便的是需要每个用户登陆到软件中。3.2.2 改进后的功能描述由于出现了基于组织结构的软件用户管理方式,相应的也应当增加基于组织机构的初始化方式。基于组织机构的初始化方式不同于普通的个体用户初始化方式,其应当采用的是组织机构管理员登陆一次性初始化这种方式。也就是说,当组织机构购买了此软件的时候需要组织机构管理员登陆SaaS软件以便于初始化。而且
29、这种触发方式只应当由组织机构管理员来触发实现,当组织机构管理员未触发此初始化事件的时候,其他组织机构用户是无法访问SaaS软件的。(这种初始化方式一次性要传送大量的数据,如果发生网络冲突或中断的话,要利用一些方法进行修正,当然也可以沿用原来的初始化方式,不过这样就大大降低了组织机构的灵活性)3.2.3 实现方案方式一从最直接的实现方式入手就是当组织机构管理员登陆软件的时候传送大量的数据,从而使得整个组织结构的系统初始化。此方式如图3-2-1:图3-2-1 组织机构初始化方式1由于存在一个网络冲突的原因,有可能在第一次初始化的过程中失败。所以基于这部分的考虑,在设计上我们在组织管理员初始化之后需
30、要每个组织机构用户在登陆SaaS软件的时候都需要通过少量的数据交互与平台核对一下用户是否完成全部初始化完成,也就是说平台上的组织机构用户的数量与软件上的组织机构用户数量进行核对比较,如果不符合的话就应当调用平台上的提供的接口重新初始化。方式如图3-2-2:图 3-2-2 组织机构防初始化失败方式这种方式的实现需要在平台添加一个重新初始化接口,同时SaaS软件的初始化代码也要有所更改。还有一点非常重要,就是在SaaS软件中默认配置的初始化一定要放在用户初始化的前面(因为判断的时候只是判断用户数量是否初始化完成)。方式二(强烈不推荐)这种方式是继续沿用原来的初始化方式,也就是分别初始化,一一对应的
31、方式,此实现方式要考虑个体用户和组织机构所构成的租户id重叠问题(因为SaaS软件本地的数据库的租户id是和平台上的用户id相关联的,现在又多了组织结构表和组织机构用户表,即是组织机构管理员也可以成为租户,这样id就可能相同)。我们可以让个体用户的租户id用数字表示,而组织机构的租户id用数字字母形成的序列号表示。当然,如果采用这种方式的话,SaaS软件的id模式就可能不统一了。也可以在初始化过程中指明初始化类型是组织结构方式的,从而用一种算法替换id数值,这种方式也可以解决个体用户与组织机构用户的id冲突问题。总的来说,这种实现方式不利于管理,使得组织结构方式的软件用户管理灵活性大大下降,但
32、实现起来比方式1更简单(更改的代码量少)。附录资料:不需要的可以自行删除 C语言曲线函数像素函数putpixel() 画像素点函数 getpixel()返回像素色函数 直线和线型函数line() 画线函数 lineto() 画线函数 linerel() 相对画线函数 setlinestyle() 设置线型函数 getlinesettings() 获取线型设置函数 setwritemode() 设置画线模式函数 多边形函数HYPERLINK /view/553113.htmrectangle() 画矩形函数 bar() 画条函数 bar3d() 画条块函数 drawpoly() 画多边形函数 圆
33、、弧和曲线函数getaspectratio()获取纵横比函数 circle()画圆函数 arc() 画圆弧函数 ellipse()画HYPERLINK /view/36981.htm椭圆弧函数 fillellipse() 画椭圆区函数 pieslice() 画扇区函数 sector() 画椭圆扇区函数 getarccoords()获取圆弧坐标函数 填充函数setfillstyle() 设置填充图样和颜色函数 setfillpattern() 设置用户图样函数 floodfill() 填充闭域函数 fillpoly() 填充多边形函数 getfillsettings() 获取填充设置函数 get
34、fillpattern() 获取用户图样设置函数 图像函数imagesize() 图像存储大小函数 getimage() 保存图像函数 putimage() 输出图像函数 图形和图像函数对许多图形HYPERLINK /view/330120.htm应用程序,直线和HYPERLINK /view/400.htm曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然如果没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。 (一) 像素函数putpixel() 画像素点函数功能: 函数putpixel() 在图形
35、模式下屏幕上画一个像素点。 用法: 函数调用方式为void putpixel(int x,int y,int color); 说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。 此函数相应的HYPERLINK /view/668911.htm头文件是graphics.h 返回值: 无 例: 在屏幕上(6,8)处画一个红色像素点: putpixel(6,8,RED); getpixel()返回像素色函数功能: 函数getpixel()返回像素点颜色值。 用法: 该函数调用方式为int getpixel(int x,int y); 说明: 参数x
36、,y为像素点坐标。 函数的返回值可以不反映实际彩色值,这取决于HYPERLINK /view/1120949.htm调色板的设置情况(参见setpalette()函数)。 这个函数相应的头文件为graphics.h 返回值: 返回一个像素点色彩值。 例: 把屏幕上(8,6)点的像素颜色值赋给变量color。 color=getpixel(8,6); (二) 直线和线型函数有三个画直线的函数,即line(),lineto(),linerel()。这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断;如果clip为假,即使终点坐标
37、或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限。 有两种线宽及几种线型可供选择,也可以自己定义线图样。下面分别介绍直线和线型函数。 line() 画线函数功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。 用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy); 说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。 此函数相应的头文件为graphics.h 返回值: 无 例: 见函数60.liner
38、el()中的实例。 lineto() 画线函数功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。 用法: 此函数调用方式为void lineto(int x,int y); 说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。 该函数对应的头文件为graphics.h 返回值: 无 例: 见函数60.linerel()中的实例。 linerel() 相对画线函数功能: 函数linerel() 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。 用法: 这个函数调用方式为void linerel(int
39、dx,int dy); 说明: 参数dx,dy分别是水平偏移距离和垂直偏移距离。 函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是(8,6),调用函数linerel(10,18)后,当前位置为(18,24)。 返回值:无 例: 下面的程序为画线函数调用实例: #i nclude void main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,); setcolor(15); line(66,66,88,88); lineto(100,100); linerel(36,64); getch()
40、; restorecrtmode(); setlinestyle() 设置线型函数功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。 用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int wigth); 说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示。 参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的
41、像素显示,因此,pattern=0 xFFFF,则画实线;pattern=0 x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0 xFF00和0 xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。 参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。 若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。 Turbo C提供的线型与线宽定义在头文件graphic
42、s.h中,表1-10和1-11分别列出了参数的取值与含义。 表1-10 线型 名称取值含义SOLID_LINE0实线DOTTED_LINE1点线CENTER_LINE2中心线DASHED_LINE3虚线USERBIT_LINE4用户自定义线型表1-11 线宽 名 称取 值说 明NORM_WIDTH(常宽)1一个像素宽(缺省值)THICK_WIDTH(加宽)3三个像素宽这个函数的头文件是graphics.h 返回值: 无 例: 下面的程序显示了BC中所提供的线型图样: #i nclude void main() int driver,mode;i; driver=DETECT; mode=0;
43、initgraph(&driver,&mode,); for(i=0;i4;i+) setlinestyle(i,0,1); line(i*50,200,i*50+60,200) ; getch(); restorecrtmode(); getlinesettings() 获取线型设置函数功能: 函数getlinesettings() 用当前设置的线型、线图样和线宽填 写linesettingstype型结构。 用法: 函数调用方式为void getlinesettings(struct linesettingstype *info); 说明: 此函数调用执行后,当前的线型、线图样和线宽值被装
44、入info指向的结构里,从而可从该结构中获得线型设置。 linesettingstype型结构定义如下: struct linesettingstype int linestyle; unsigned upattern; int thickness; ; 其中linestyle用于存放线型,线型值为表1-10中的各值之一。 upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭。 thickness为线宽值存放的变量,可参见表1-11。 getlinesettings()函数对应的头文件为graphics.h 返回值: 返回的线型
45、设置存放在info指向的结构中。 例: 把当前线型的设置写入info结构: struct linesettingstype info; getlinesettings(&info); setwritemode() 设置画线模式函数功能: 函数setwritemode() 设置画线模式 用法: 函数调用方式为 void setwritemode()(int mode); 说明: 参数mode只有两个取值0和1,若mode为0,则新画的线将覆盖屏幕上原有的图形,此为缺省画线输出模式。如果mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输出到屏幕上,使用这种画线输出模式
46、,第二次画同一图形时,将擦除该图形。调用setwritemode()设置的画线输出模式只影响函数line(),lineto(),linerel(),recangle()和drawpoly()。 setwritemode()函数对应的头文件是graphics.h 返回值: 无 例: 设置画线输出模式为0: setwritemode(0); (三)、多边形函数对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便。最常见的多边形有矩形、矩形块(或称条形)、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形(块)。下面直接介绍画多边形
47、的函数。 rectangle() 画矩形函数功能: 函数rectangle() 用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形)。 用法: 此函数调用方式为void rectangle(int left,int top,int right,int bottom); 说明: 参数left,top是左上角点坐标,right,bottom是右下角点坐标。如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真(1),那么调用该函数后,只有在图形视口内的矩形部分才被画出。 这个函数对应的头文件为graphics.h 返回值: 无 例: 下面的程序画一些矩形实例: #
48、i nclude void main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode,); rectangle(80,80,220,200); rectangle(140,99,180,300); rectangle(6,6,88,88); rectangle(168,72,260,360); getch(); restorecrtmode(); bar() 画条函数功能: 函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线)。 用法
49、: bar()函数调用方式为void bar(int left,int top,int right,int bottom); 说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。 注意此函数只画没有边线的条形,如果要画有边线的的条形,可调用下面的函数bar3d()来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。 这 应的头文件为graphics.h 返回值: 无 例: 见函数bar
50、3d()中的实例。 bar3d() 画条块函数功能: 函数bar3d() 使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填 充色填充该三维条块的表面。 用法: 此函数调用方式为void bar3d(int left,int top,int right,int bottom,int depth,int topflag); 说明: 参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算。深度方向通过屏显纵横比调节为约45度(即这时x/y比设置为1:1)。 参数topfl
51、ag相当于一个HYPERLINK /view/46060.htm布尔参数,如果设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。 要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 )。 bar3d()函数对应的头文件为graphics.h 返回值: 无 例: 下面的程序画一个条形和条块: #i nclude void main() int driver,mode; driver=DETECT; mode=0; initgraph(&driver,&mode
52、,); setfillstyle(SOLID-FILL,GREEN); bar(60,80,220,160); setfillstyle(SOLID-FILL,RED); bar3d(260,180,360,240,20,1); getch(); restorecrtmode(); drawpoly() 画多边形函数功能: 函数drawpoly() 用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形。 用法: 此函数调用方式为void drawpoly(int pnumber,int *points); 说明: 参数pnumber为多边形的顶点数;参数points指向整型HYPERLIN
53、K /view/209670.htm数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐标。 drawpoly()函数对应的头文件为grpahics.h 返回值: 无 例: 下面的程序画一个封闭星形图与一个不封闭星形图: #i nc
54、lude void main() int driver,mode; static int polypoints118=100,100,110,120,100,130,120,125,140,140,130,120, 140,110,120,115,100,100; static int polypoints218=180,100,210,120,200,130,220,125,240,140,230,120, 240,110,220,115,220,110; driver=DETECT; mode=0; initgraph(&driver,&mode,); drawpoly(9,polypoi
55、nts1); drawpoly(9,polypoints2); getch(); restorecrtmode(); (四)、 圆、弧和曲线函数在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比。纵横比是指像素的水平方向大小与垂直方向大小的比值。如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000。 为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变。计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio()获得。 getaspectratio()获取
56、纵横比函数功能: 函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。 用法: 此函数调用方式为void getaspectratio(int xasp,int yasp); 说明: 参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数。通常y方向比例系数为10 000, x方向比例系数不大于10 000(这是因为大多数屏幕像素高比宽长)。 注意纵横比自动用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。但用ellipse()函数画椭圆必须调用本函
57、数获取纵横比作为标尺因子,否则不予调整。纵横比可用于其它几何图形,目的是校正和显示图形。 getaspectratio()函数对应的头文件为graphics.h 返回值: 返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。 例: 下面的程序显示纵横比: int xasp,yasp; float aspectratio; getaspectratio(&xasp,&yasp); aspectratio=xasp/yasp; printf(aspect ratio: %f,aspectratio); circle()画圆函数功能: 函数circle()使用当前绘图色并以实线画一个完
58、整的圆。 用法:该函数调用方式为void circle(int x,int y,int radius); 说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注意,调用circle()函数画圆时不用当前线型。 不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。 此函数对应的头文件为graphics.h 返回值: 无 例: 画六个同心圆,圆心在(100,100)。 #i nclude void main() int driver,mode; driver=DETECT; mode=0; initgra
59、ph(&driver,&mode,); circle(100,100,10); circle(100,100,20); circle(100,100,30); circle(100,100,40); circle(100,100,50); circle(100,100,60); getch(); restorecrtmode(); arc() 画圆弧函数功能: 函数arc()使用当前绘图色并以实线画一圆弧。 用法: 函数调用方式为void arc(int x,int y,int startangle,int endangle,int radius); 说明: 参数x,y为圆心坐标,starta
60、ngle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度360度范围里。函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。 arc()函数对应的头文件为graphics.h 返回值: 无
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共卫生执业医师考试习题
- 高分辨率CT 对慢性中耳炎的诊断价值J
- 肥厚型心肌病
- 肺癌考试题及答案
- 防雷防静电应急预案培训与演练方案
- 耳鼻喉出科试卷及答案
- 动火作业考核试题及答案
- 动力电池l2考试题目及答案
- 出租房整房改造申请书模板
- 常用消毒剂的使用范围及浓度
- 山东齐鲁名校教育测评2026年10月高三年级学业质量检测地理+答案
- 2025年中国银行总行招聘笔试试题+答案
- 2026年6月浙江高考选考技术试卷真题(含答案详解)
- 血液肿瘤相关肠梗阻护理专家共识(2026年版)
- 2026年电机学考试复习题库及答案详解
- QMS新版标准讲解新旧比照
- 第5课《中国人民站起来了》第二课时(教学课件)
- 大学专业课学习资料-文学理论知识点
- T∕CHCIA 014-2023 液体香氛安全要求
- 殡仪馆遗体处理突发公共卫生事件应急演练脚本
- 财务调账审批制度
评论
0/150
提交评论