基于QT实现的基础图形绘图系统

sohot

发布日期: 2018-12-10 20:51:16 浏览量: 1106
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

摘 要

PaintWorks实现了图形数据的输入、编辑、填充、裁剪、变换、显示与保存功能。可绘制图形包括直线、圆、椭圆、多边形、曲线和3D六面体。交互界面简洁美观,操作实用方便。

本绘图系统采用了面向对象设计,以C++11为基础,交互使用了Qt,基础图形的绘制使用了OpenGL,直线绘制使用了Bresenham算法,圆的绘制使用了中点圆生成算法,椭圆绘制用了中点椭圆生成算法,曲线绘制使用了3次Bézier曲线,多边形填充使用了多边形扫描填充算法,线段裁剪使用了梁友栋-Barsky算法,多边形裁剪使用了逐边裁剪算法。

1 软件概述

1.1 软件用途

本软件主要用于基础图形绘制与保存,绘制完成之后可以对图形进行进行编辑、填充、裁剪等操作。

1.2 特点

本软件操作与显示简洁自然,简单方便。

图形越新,所在图层越高;当用户选中某一图形时会自动切换到该图形对应的绘制模式并将该图形移动到最高图层。

本软件的所有操作均可通过点击鼠标完成,其中,PaintWorks为使用频繁的操作与较为精细的操作提供了快捷键。

2 软件安装

为了免去用户安装的烦恼,PaintWorks给出了绿色免安装版,解压之后直接点击安装包中的PaintWorks.exe便可运行。(注:经过测试,不解压就运行可能会导致未知错误)

3 使用指南

3.1 图形绘制

3.1.1 画笔颜色选取

点击上方工具栏中的颜色选取工具(或按快捷键Ctrl+P),即可打开颜色选取对话框选取画笔颜色,之后线条颜色和填充色均为所选取的颜色。

若不选取颜色,则默认线条颜色为黑色,填充色为绿色。

3.1.2 2D图形

PaintWorks可以绘制直线、圆、椭圆、多边形、曲线等二维图形,并可以对圆和多边形进行填充。绘制前首先点击菜单栏中的“新建画布”(或按快捷键Ctrl+N)新建画布。

直线绘制:点击工具栏中的 按钮(或按快键键Alt+L),即可切换到直线绘制模式(软件启动默认绘制模式为直线)。点下鼠标左键并拖动,松开鼠标左键便可完成绘制,点下和松开的位置分别为直线的两端点。

圆绘制:点击工具栏中的 按钮(或按快捷键Alt+C),即可切换到圆绘制模式。点下鼠标左键并拖动,松开鼠标左键便可完成绘制,点下鼠标左键的点为圆心,拖动的距离为圆的半径。点击工具栏中的 工具(或按快捷键Ctrl+F),即可完成对圆的填充。

椭圆绘制:点击工具栏中的 按钮(或按快捷键Alt+E),即可切换到椭圆绘制模式。点下鼠标左键并拖动,松开鼠标左键便可完成绘制,拖动的横向偏移量为椭圆的横轴长度,纵向偏移量为椭圆的纵轴长度,拖动位移的中点为椭圆中心。

多边形绘制:点击工具栏中的 按钮(或按快捷键Alt+P),即可切换到多边形绘制模式。单击鼠标左键绘制多边形第一个顶点,之后多次单击绘制多边形其他顶点,若要完成绘制只需单击第一个顶点,如图7. 选择填充色为绿色然后点击工具栏中的 工具(或按快捷键Ctrl+F)。

曲线绘制:点击工具栏中的 按钮(或按快捷键Alt+V),即可切换到曲线绘制模式。先后单击4次鼠标左键绘制曲线的4个控制点,便可完成曲线的绘制。

3.1.3 3D图形

PaintWorks可以绘制3D六面体。点击点击菜单栏中的“新建3D画布”(或按快捷键Ctrl+T)新建3D画布标签页。

此时新3D标签页中已经绘制完成一个3D六面体,如图11. 按键盘上的左右方向键可以控制这个六面体旋转。

3.2 图形选中与编辑

3.2.1 图形选中

刚绘制完成的图形默认已经被选中,其关键点用蓝色圆点标记(如3.1.2中各图所示)。若要选中其他图形,只需点击想要选中的图形,该图形就会被选中且浮动到最高图层。

3.2.2 图形编辑

点击并拖动已选中图形的蓝色标记点,即可对图形形状进行编辑,操作与图形绘制时类似。

  • 直线标记点:两端点

  • 圆标记点:矩形四个端点

  • 椭圆标记点:矩形四个端点

  • 多边形标记点:各个顶点

  • 曲线标记点:四个控制点

3.3 图形变换

3.3.1 平移

在选中情况下,图形中心有一个带十字的中心标记点。点击并拖动这个中心标记点,即可拖动这个图形。

3.3.2 旋转

在选中情况下,图形中心标记点有一条蓝色的直线延长出来的一个蓝色标记点,称为旋转标记点,旋转标记点与中心标记点的连线称为handle,如图14,中心标记点上方的蓝色圆点即为旋转标记点。点击并拖动这个旋转标记点,即可旋转该图形。

  • 直线旋转:以直线中点旋转

  • 圆的旋转:以圆心旋转,但由于圆是中心对称图形,所以旋转中视觉上没有明显效果

  • 椭圆旋转:以中心旋转,但由于椭圆旋转之后可以会出现变形,所以椭圆只能进行90度旋转,即只有在handle水平或垂直时做90度的旋转

  • 多边形旋转、曲线旋转:均绕中心标记点旋转

3.3.3 缩放

用户对当前选中的图形进行放大或缩小,放缩的中心为该图形的中心标记点。点击工具栏的放大与缩小按钮分别可以进行放大与缩小(快捷键为Ctrl + + 和Ctrl + -),如下图左右两侧图为曲线缩小和放大的效果。

缩小 原图 放大

3.4 图形裁剪

用户可以使用工具栏中的 工具对当前选中的图形进行裁剪,裁剪仅限直线或多边形。

首先点击这个工具(或按快捷键Ctrl+C),这个工具会显示被按下,此时可以在画布中绘制出一个红色的虚线框作为裁剪窗口。

此时可以拖动红色虚线框的四个顶点对裁剪窗口进行调整,也可以直接重新绘制一个裁剪窗口。

确定裁剪窗口之后,再次点击 工具(或按快捷键Ctrl+C),便可完成裁剪。其中需要说明的是,裁剪之后图形会被重绘,因为当前选择的画笔颜色为绿色,所以轮廓为绿色,与填充色融为了一体(而不是轮廓消失了)。

3.5 图形删除与保存

3.5.1 删除与清空

  • 用户可以对当前选中的图形、画布进行删除或清空操作

  • 要删除当前图形,只需点击工具栏中的 (或按快捷键Delete)即可将该图形删去

  • 要清空当前画布,只需点击工具栏中的 (或按快捷键Ctrl+Delete)即可清空画布

3.5.2 保存图形

用户可以保存画布上的图形为BMP文件(普通画布与3D画布均可保存),点击菜单栏中的“文件”>“另存为…”,即可打开一个文件保存对话框。

输入文件名,选择路径,便可把当前画布的图像保存成BMP格式的文件。

3.6 出错处理

经过测试,本软件鲁棒性较好,但仍难以避免一些意外发生,如果出现了错误,重启即可。

3.7 注意事项

  • 在新图形绘制过程中不要点到原有图形上,否则会选中原有图形,中断新图形的绘制。即便如此,原先的绘制信息也不会丢失,将绘制模式切换回来就可以继续绘制了

  • 由于裁剪算法所限,在裁剪凹多边形的一些特定情况下可能会出现一些不完全正确的裁剪结果

4 系统框架设计

4.1 开发环境

操作系统 Windows 10家庭中文版
编程语言 C++ 11
外部库 Qt 5.4,OpenGL 2.7
编译器 MinGW 4.9.1 32bit
IDE Qt Creator 3.3.0

4.2 系统架构概览

用Qt向用户提供交互,用OpenGL提供底层绘制,考虑到Qt与OpenGL的兼容性,使用了继承自QWidget的子类QGLWidget实现Qt环境下的OpenGL绘制:

  • QMainWindow负责与用户交互,并以标签页的形式集成了QGLWidget

  • QGLWidget负责绘制本标签页的内容,并集成了各类FigureControl,用于将本标签页的交互信号送给不同的图形控制类

  • FigureControl负责该类型图形的交互,有LineControl、CircleControl、EllipseControl、PolygonControl等,用于分别提供不同图形的不同交互方式

  • Figure负责保存该图形的数据信息,包括顶点、圆心、半径以及轮廓点、填充点等,集成了Point类,图形绘制通过调用Point的draw函数完成

  • Point负责实现绘制单个普通点或标记点,并向上提供其他常用功能函数支持

系统核心架构图

其中GLWidget派生出一个GL3DWidget,作为3D标签页,用于3D图形的绘制;在FigureControl层有一个CutWindow类,用于绘制裁剪窗口。系统架构中的聚集关系如下图:

Point类作为轮廓和填充的构成部分聚集在Figure类中;Figure类的数组放在FigureControl中,由FigureControl处理本Figure的相关交互;CutWindow用于管理裁剪窗口;GLWidget为2D画布的标签页,GL3DWidget继承自GLWidget,作为3D画布标签页;所有标签页聚集在QMainWindow中,由QMainWindow与用户交互并向下发送消息。

4.3 图形管理类:FigureControl

图形管理类之间的关系较为简单,主要用于存储本图形的数据,并进行与本图形相关的交互,如鼠标点击、键盘按下、图形绘制、设置聚焦、裁剪当前图形等,类继承关系如下图:

4.4 图形类:Figure

Figure为所有图形的虚基类,继承关系如下图:

Figure类提供所有图形都应有的共同接口:

  • 基础绘制:绘制图形、绘制图形标记点、清空图形

  • 基础变换:平移、旋转、缩放

  • 判断某点是否在该图形上

SimpleFigure是对所有简单图形的抽象,SimpleFigure的轮廓均直接由点构成。而Polygon的边为Line,所以不属于SimpleFigure。SimpleFigure中提供了通用的draw()、clear()、isOn()。

Area是对所有可填充图形的抽象,用于填充点管理,提供了与填充相关的函数。

Line、Circle、Ellipse、Curve、Polygon分别为直线、圆、椭圆、曲线、多边形。其中由于Ellipse和Polygon与OpenGL库中命名冲突,所以在实现中命名为MyEllipse和MyPolygon,但相应代码文件名仍为Ellipse和Polygon。

上传的附件 cloud_download 基于QT实现的基础图形绘图系统.7z ( 1.11mb, 42次下载 )
error_outline 下载需要8点积分

发送私信

我想要你幸福,但我希望我是你幸福的原因

15
文章数
11
评论数
最近文章
eject