(大一课设)使用c++组件实现简单的画板

2.1.1 功能分析

问题的描述(功能要求):为了实现用户对基本图形的绘制和图形移动、复制、缩放,删除功能。本系统采用可视化开发界面,通过按钮选择所要绘制的图形名称,由用户输入数据坐标,随后自动绘制初等图形,随后通过键盘控制移动缩放,待得到满意的图形后可实现图形的填充和复制,包含音乐、橡皮擦、灵魂画笔、全清、引入图片、保存画板的功能,可实现用户对绘制的基本需求。

2.1.2 算法设计及程序设计中技术重点

一、主要知识点:

     该程序由一个源cpp和八个类组成,主要运用了面向对象中类与对象、继承与派生、组合类、文件的输入与输出流、全局变量、sort库函数的使用和大量的EasyX画图、颜色、样式、鼠标、键盘操作函数。

  • 关键技术和功能实现

     简单矢量图处理系统的关键技术在于图形类的制作、图形的移动、复制、缩放、删除、按钮的设置、音乐功能、橡皮擦功能、引入图片功能、线的样式与颜色选择功能、保存画板功能、全清功能,灵魂画笔功能的实现。以下是如何实现该功能的具体步骤:

1.图形类的设置:该系统一共设置了点(Spot)、线(Line)、折线(TwoLine)、圆(Circle)、椭圆(myEllipse)、矩形(myRectangle)和多边形(Polyon)七个图形类,其中Spot是Line、Circle、myEllipse和myRectangle的基类,Line是TwoLine的基类。其中线、圆、椭圆和矩形的主要数据成员为Spot所构成的组合,折线的主要数据成员为Line所构成的组合,用组合类可以实现代码的精简。每一个图形类都包含拷贝构造函数:便于实现后面的复制功能。Drawn函数:包括图形坐标数据点的键盘输入从而绘制基本图形,也包括图形的移动和缩放模块,用户可以通过上下左右键来实现图形的移动,通过+,-键来实现图形的缩放。Delete函数:应用了删除功能,用户可以通过键盘上backspace键对所绘制的图形进行删除。对于圆、椭圆、矩形、多边形此类有面积的图形类还添加了fill填充函数:该函数主要运用Switch()函数,对用户输入的数据进行判断,如果用户输入的是0,则会调用fill....(例如 圆的fillcircle())函数进行有边框填充,若为1,则会调用soild....函数进行无边框填充。填充颜色由用户输入颜色的色度(例如:白色为255,255,255)进行设置。

2.button类的设置:由于系统功能的实现都是由点击按钮实现的,为了实现代码的精简,设置button类。类中主要定义六个数据成员:int类型的x,y是矩形按钮左上角的坐标,用来确定按钮的位置。int类型的Width,Height分别对应着矩形按钮的长和宽。COLORREF类型的colour对应着按键的颜色。Char指针类型的str对应着按键上面的字。button类主要的成员函数有其构造函数:对x、y、Width、Height、colour、str数据成员进行初始化。和drawbutton()函数:包括用setfillcolour设置按键颜色,setteststyle设置字体样式和颜色,fillrectangle画矩形按钮,outtestxy来显示按钮上的字体。

3.移动功能的实现:该系统在每一个类的Drawn函数里都有一个移动功能模块。

移动模块主要有一个while循环和5个判断语句构成,GetAsyncKeyState()函数用来获取键盘信息,如果是上键,纵坐标减小,如果是下键,纵坐标增加,左右键分别对应着横坐标的减少和增加。通过改变坐标的方式重新绘制图形,删除原有图形来实现图形视觉上的移动,其中实现删除图形是一个重难点(下文提到),如果用户调整好自己图形的位置后,可以按esc键退出,从而继续其他功能。

4.图形删除的实现:图形的删除十分重要,可以运用于缩放和移动模块。自己也作为一个单独的模块功能。经过多天的测试,EasyX图形库中clearellipse(),clearCirlce()等函数只能清除内部区域,对边框没有清除功能,只能清除自己的内部部分,而且对于填充好的图形根本不起作用。后来想到可以用大于所绘制图形的矩形来进行删除,对于圆,矩形,椭圆来说,十分便于确定最小相切矩形的坐标,而对于线,折线,多边型来说,要想确定最小相切矩形,由于用户输入的坐标随机,横纵坐标可以先大后小,也可以先小后大,对于这种情况,我们引入两个动态数组分别存储x坐标和y坐标,然后用算法库里的sort()函数,将坐标从小到大排好序,从而获取最左上角的点和最右下角的点来实现最小相切矩形,最小相切矩形的实现可以避免删除时边角料的存留,从而实现移动缩放时不留痕迹。

5.图形的缩放:缩放模块的实现放在移动的后面,都属于Drawn函数,也是由while语句和三个判断语句构成,由键盘上的+,-键来控制图形的缩放,如何获取键盘上的+,-号信息呢,本小组采用的是_getch()函数,它返回的是一个数字,键盘上的每一个键都有着自己数字代码,其中+键为61,-键为45,用if语句判断键盘信息从而控制图形的缩放。圆的缩放主要是改变半径来解决,而矩形、椭圆的缩放是将左上角的坐标向左上角(右下角)移动,右下角的坐标向右下角(左上角)移动从而实现图形的放大(缩小),对于线和折线的缩放就比较难,对于线和折线的缩放由于要维持一定的比例,所以要确定x,y之间的函数关系,通过改变其中的某一个坐标,成比例的改变另外一个,从而达到不改变折线的角度的缩放。图形的缩放的实现和移动差不多,获取新坐标后,绘制图形,对原来的图形进行删除,由于使用循环语句,程序运行过快,所以看不到先删后添的过程,从而实现图形的缩放。

6.设置样式样式和颜色功能:设置样式和颜色功能模块专门占取一个按钮,当用户点击按钮时,显示台上跳出样式,颜色,粗度的选择,后台根据setlinestyle()函数和setlinecolour()函数对所输入的数据进行匹配,从而设置样式和颜色。

7.复制功能:通过在用户画好一个图形后是否按v键来判断用户是否需要复制,复制功能的实现主要运用类的拷贝构造函数,用已经存在的图形来给新的对象赋值,从而达到数据的复刻,画出一个一模一样的图形。

8.全局变量的使用:由于在删除图形时需要考虑到线的粗度,于是将线的粗度设置为全局变量,由用户输入后一直存在,直到程序结束。

9.音乐的播放:音乐的播放由mciSendString()函数实现,在函数内输入存储音乐的地址文件,通过鼠标操作来控制open和stop,注意填写音乐的地址文件时歌曲名之间是不能有空格的。

10.照片的引入:照片的引入有loadimage()和putimage()两个函数实现,loadimage()中填写存储文件的地址信息,putimage()中输入在画板中放置的位置,从而实现照片的引入,同时也在这个模块加入缩放和移动模块,方便用户。

11.图形的保存:图形保存用saveimage()函数实现,在该函数中输入保存的地址,便可以将图形以图片的形式存储在文件中。

12.橡皮擦功能:利用移动模块,设置一个用白色填充的圆,通过键盘控制圆的移动来实现对废弃图形的处理。

13.灵魂画笔功能:以未完全清理干净边框的球形移动做画笔,从而画出立体感。

14.屏幕的稳定:由于该系统中调用了大量的无限循环,图形移动和缩放时可能会出现闪屏的问题,在EasyX中有解决该问题的函数FlushBatchDraw(),在循环中加入该函数具有稳定屏幕的功能。

2.2 程序中涉及的类的关系图和主要流程图或框图

程序中类之间的关系:

图2.1 各类关系

程序流程图: 

图2.2 程序流程图

2.3 程序运行

程序运行时,首先出现进入界面,由用户点击“点击开始作画”即可进入主界面。

 

图2.6程序运行进入界面

 

主界面如图2.7所示。

 

图2.7程序运行主界面

 

 

点击“线”按钮,可得到输入线的属性界面,并输入相关属性,如图2.8所示。

 

图2.8输入线属性的界面

 

按回车,即可得到绘制好的线,如图2.9所示。

图2.9 得到的线的图形界面

点击“折线”按钮,可得到输入折线的属性界面,并输入相关属性,如图2.11所示。

图2.11 输入折线属性的界面

 按回车,即可得到绘制好的折线,如图2.12所示。

图2.12 得到的折线图形界面

按上下左后方向键,可得到移动后的折线图形,如图2.13所示。

图2.13 移动后的折线图形

点击“圆”按钮,可得到输入圆的属性界面,并输入相关属性,如图2.14所示。

图2.14 输入圆属性的界面

按回车,即可得到绘制好的圆,如图2.15所示。

图2.15 绘制好的圆的图形界面

按“v”键,可以实现图形的复制,效果如图2.16所示。

图2.16 复制后的圆图形界面

点击“椭圆”按钮,可得到输入椭圆的属性界面,并输入相关属性,如图2.17所示。

图2.17 输入椭圆属性的界面

按回车,即可得到绘制好的椭圆,如图2.18所示。

图2.18 绘制好的椭圆的图形界面

点击“矩形”按钮,可得到输入矩形的属性界面,并输入相关属性,如图2.19所示。

图2.19 输入矩形属性的界面

按回车,即可得到绘制好的矩形,如图2.21所示。

图2.21 绘制好的矩形图形的界面

按“+”和“-”可以实现图形的缩放,效果如图2.22所示。

图2.22 矩形放大以后所得到的界面

  点击“多边形”按钮,得到输入多边形的属性界面,并输入相关属性,如图2.23示。

图2.23 输入多边形属性的界面

按回车,即可得到绘制好的矩形,如图2.24所示。

图2.24 绘制好的多边形界面

可根据数据台上的要求,引入对应图片,如图2.25。

图2.25源代码界面

点击“引入图片”按钮,得到图片,如图2.26所示

图2.26引入的图片界面

按“↑”、“↓”、“←”、“→”键实现图片的移动,如图2.27所示

图2.27 图片的移动界面

按“+”、“-”实现图片的放大和缩小,如图2.28所示

图2.28图片的放大和缩小界面

点记“保存”按钮,可得到shab1,确认图片已保存在规定的路径,如图2.29。

图2.29确认图片保存界面

保存在规定的文件路径里,如图2.30所示。

图2.30图片存储的文件路径

源代码界面,如图2.31所示。

图2.31源代码的界面

点击“橡皮擦”,可实现擦除功能,如图2.32所示

图2.32橡皮擦功能实现的界面

点击“全清按钮”,实现屏幕全清功能,如图2.34所示。

图2.34 全清以后的界面

3章 课程设计总结

在一年的c++课程与c++面向对象学习后,了解了基本的语法知识,此次课设能够巩固我的学习成果,系统的完成也让我颇具有成就感,在这两周里,我就像一位父亲一样,悉心呵护我的程序,每天跟中了邪一样研究代码、查询资料、实验直到完成时看着自己所实现的程序,感觉这一年的努力并没有白费。本次课设也让我懂得了一些道理,这些将陪伴我继续我的学习之路。

  1. 永远永远要对新的知识充满渴望:此次课程设计需要具备许多的新的知识,如EasyX绘制图形的函数、填充函数、颜色设置函数、鼠标操作函数、键盘操作函数等,要实现可视化开发,需要自学知识。没有对知识的渴望是难以完成的
  2. 永远永远要和队友学会合作,与队友参与讨论:本次课设我作为小组组长,要实现主要代码的开发,开发过程中总会遇到一些难题,经过网络查询无果后,决定与队友进行商量,没想到队友一下就找出了原因,难题得以解决,所以永远要和队友讨论,因为你的队友的脑子里存着无限可能。
  3. 学会并合理利用网上的资源:网上有着大量的学习和借鉴资料,如果会合理的使用网络,将帮助你在短期内进步。
  4. 学会对新的知识先做实验再搬上项目:网络上找到的代码有时并不靠谱,如果直接搬入项目,将会提高代码的bug率,不仅修改起来难度大,而且会让心情烦躁,影响效率,所以在搬入项目之前,先进行测试实验是十分有必要的。
  5. 要有扎实语法知识,对编译器功能有透彻的了解:扎实的语法知识可以为你的代码提供理论基础,从而更好的理解代码,更容易实现创新,了解编译器的功能,可以帮助你快速的找到你代码的错误,提高你写代码的效率。。

参考文献

  1. 沈显君 杨进才 张勇 编著.《C++语言程序设计》.北京:清华大学出版社 2006.4
  2. EasyX参考文档
  3. 需要完整源码和设计报告的可联系作者(天下没有免费的午餐哦)qq:1938933758
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值