不用图形库函数的仿windows画图程序.doc

不用图形库函数的仿windows画图程序.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
不用图形库函数的仿windows画图程序.doc

不用图形库函数的仿windows画图程序 这是最近做的计算机图形学实验,其界面是一个仿Windows下的窗口界面,程序具有较好的交互性。全部的图形函数都没有用C语言自带的图形库函数,所写的函数都是直接写屏实现的,模拟了大部分图形库函数的功能。但也有部分没有写出,如保存图形块的getimage()等函数。由于水平有限,还有部分功能没有实现,如保存或打开BMP图片等。等有了时间再说吧。算法什么的写的很潦草,都随便说说的,欢迎高手指点,希望与广大C语言爱好者共同学习讨论。 我的联系方式:湖北民族学院信息工程学院 邮箱:xiangyuan_122@163.com 效果图: 注:该程序最好在win98下运行,否则看不到鼠标。 一、 算法设计及流程 1. 点 不管什么样的图形归根结底到屏幕,都是由一些颜色不一的象素点组成,为提高图形的显示效率,没有用到系统的画点函数,而采用了640*480*16模式下的直接写屏技术画点,该模式下的直接写屏比320*200*256的直接写屏要复杂的多,后者的视频缓冲区是线性编址的,一个字节对应屏幕上一点的颜色,而前者的视频缓冲区被分成四个位面,屏幕上一点的颜色由每个位面上的一位组成的四位二进制数决定,由于四位二进制数的最大表示范围是16,所以在这种模式下最多可同时显示16种颜色。 在对视频缓冲区的读写时,是一个字节一个字节写的,只需要其中某一位时,就要用到位掩码屏蔽掉其他的位,位掩码就在图形控制寄存器的位屏蔽寄存器里设置。先通过向端口号为0x3ce的索引寄存器写入位屏蔽寄存器的索引号8,然后向端口号为0x3cf的寄存器写入位掩码值。设置好位掩码后,直接向视频缓冲区相应位置写入颜色即为画点函数。 取屏幕上一点颜色其实也就是画点的反操作,画点是将一个四位的二进制颜色值分配到四个位面,而取一点的颜色是将四个位面的颜色组合成一个四位二进制数。 2. 线 线其实就是由点组成的,通过连续的改变点的坐标,也就可以得到一条线。所以画线的函数归根结底也就是如何改变画点的坐标。 画线通常有DDA算法,BRESENHAM算法,这里采用的是BRESENHAM算法。这种算法从根本上讲,是通过横线与竖线的倍数关系来实现的。每次循环画点后x、y中位移大的坐标变化一个单位,而当循环次数是两者倍数关系时,x、y中位移小的坐标变化一个单位。为了使画线函数能在八个方向都能画,将增量为负的都转化正的增量。 画图程序经常要用到moveto、lineto等函数,用于把点移动到某点或从当前点画线到某点,为了模拟这些函数,设置了SX,SY两个全局变量用来作为Moveto()的目的地和Drawlineto()的起始坐标。 3. 矩形及填充矩形 矩形是通过两点确定的对角线来画的,直接连上各点的坐标就可以了。填充矩形是通过一条线一条线画的。这种算法速度比较慢,较好的方法是用Fillscreen()里面用到的方法,那是一个字节一个字节处理的。就因为画矩形并不一定是整字节开始整字节结束的,开始处和结尾处就有了问题。我也把它们单独拿出来处理,但还是没做好,等有时间了再改吧。 4. 圆及弧 画圆采用的是参数方程的方法。为了提高速度,角度的sin、cos值建立了一个表,要用时直接查表。这是因为在用BRESENHAM算法画椭圆时,效果不是很好,画的椭圆不但厚薄不一,而且不闭合。估计是程序哪里出问题了,干脆都用参数方程的方法,又简单,又省事。我这人通常是比较懒的。 弧主要是用来画圆角矩形的,且只能画圆弧。这也是用参数方程来画的,跟画圆不同的只是有了角度的限制。 5. 贝塞尔曲线 贝塞尔曲线其实主要也就是一个公式,跟参数方程画圆是一回事,只是要传入的参数要多一些。在用鼠标控制时,因为有四个点,而用鼠标对多点的采集有点不好做,于是先就初始化了一个四点的数组,用不按键、按左键、按右键分别控制三个点,左右键同时按时,确定下一条曲线。 其实用鼠标画贝塞尔曲线因该把一次、二次、三次的处理函数都写出来,在按下左键时,标记下这点,再一次按下左键时,用画一次贝塞尔曲线的函数画,按下第三次时,用画二次曲线的函数画,按下第四次时才用画三次曲线的函数画。这样就不用为每个点分配一个鼠标按键了。 6. 填充 填充也是采用的种子填充法,不过不是直接从种子开始填色,而是先从种子出发,找到种子沿x最小的边界,然后填上一点,判断这一点的上边一点和下边一点,如果不为边界并且未被填色,则压入栈中,然后x增1后判断是否到达这一行x的最大值(既边界),如不是,则循环处理这一行,直到到达边界,再弹出一个点继续循环处理。由于是一个点一个点处理,所以速度比较慢。 为了对一个图形的不同颜色边界也能填充,填色时没有传入图形的边

文档评论(0)

tangtianbao1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档