基于Qt OpenGL的图形绘制系统的设计与开发

该文档详细介绍了使用Qt界面工具和OpenGL图形库设计的一个图形绘制系统,包括直线、圆、椭圆、多边形等基本图形的绘制,以及贝塞尔曲线、B样条曲线等复杂图形的实现。系统支持图形裁剪、旋转、缩放、颜色和线宽设置等功能,并能保存为.bmp格式的文件。
摘要由CSDN通过智能技术生成

目 录
1功能要求 1
1.1 系统基本要求 1
1.2 系统功能 1
1.2.1 功能设计 1
1.2.2 功能结构 3
1.2.3 基础图元数据结构 4
2实现方法与技术 5
2.1 实现技术 5
2.2 实现方法 5
2.2.1 直线 5
2.2.2 圆 6
2.2.3 椭圆 8
2.2.4 贝塞尔曲线 9
2.2.5 B样条曲线 10
2.2.6 多边形 11
2.2.7 平行四边形 11
2.2.8 矩形 11
2.2.9 圆角矩形 12
2.2.10 填充矩形和填充多边形 12
2.2.11 裁剪 14
2.2.12 旋转 15
2.2.13 缩放 15
2.2.14 移动 15
2.2.15 选取图元和反向选取图元 16
2.2.16 上一步、下一步 16
2.2.17 更换颜色 16
2.2.18 画笔粗细 16
2.2.19 文件打开、保存、新建 16
2.2.20 画布 17
2.2.21 橡皮擦 17
3运行截图 18
3.1 初始界面 18
3.2 画点 18
3.3 直线 19
3.4 贝塞尔曲线 20
3.5 B样条曲线 21
3.6 圆 22
3.7 椭圆 23
3.8 矩形 24
3.9 多边形 25
3.10 填充矩形 26
3.11 填充多边形 27
3.12 平行四边形 28
3.13 圆角矩形1 29
3.14 圆角矩形2 30
3.15 矩形区域裁剪 31
3.16 多边形区域裁剪 33
3.17 移动 34
3.18 旋转 35
3.19 缩放 37
3.20 上一步、下一步 39
3.21 颜色 41
3.22 线宽 42
3.23 文件 44
3.24 橡皮擦 46
4设计结论和心得 48
4.1 设计结论 48
4.2 心得体会 48

1功能要求
1.1系统基本要求
(1) 设计并实现一个图形绘制系统。
(2) 系统具有可视化界面,具有功能菜单;
(3) 系统包含的绘图功能:基本图形的绘制(直线、圆、椭圆、矩形、平行四边形、圆角矩形等)、多边形的绘制、曲线的绘制(Bezier曲线、二次B样条曲线等)、图形的裁剪、图形属性(线宽、线型)的设置、图形的擦除、图形的保存等功能。
1.2系统功能
界面设计采用Qt开发工具,而绘图算法采用OpenGL实现。Qt作为目前比较流行的图形界面开发工具,对于设计者来说,各界面模块拖拽、操控方便,便于理解,其信号-槽机制也十分高效。OpenGL则是非常经典的图形编程语言,其渲染功能强大,不少游戏开发语言都是以OpenGL为内核渲染的。总体来看,需要实现的系统的主要功能为通过交互,绘制图形,并保存为.bmp 格式的文件。而无论是哪种绘图算法,本质上来说,都是在决定哪些位置的像素点应该被置为当前画笔的颜色。
1.2.1功能设计
以下简单说明系功能所需操作和算法。
(1)直线。采用Bresenham算法。用户点击画板上两点绘制直线。
(2)圆。采用中点Bresenham画圆算法。用户点击画板上两点绘制圆,第一点为圆心,第二点为圆上一点。
(3)椭圆。采用中点Bresenham画椭圆圆算法。用户点击画板上三点绘制椭圆,第一点为椭圆圆心,第二点为长轴上的一个端点,第三点为短轴上的一个端点。
(4)矩形。相当于用Bresenham算法绘制多条直线。用户点击画板上两点绘制矩形,第一点为对角线起点,第二点为对角线终点。
(5)平行四边形。相当于用Bresenham算法绘制多条直线。用户点击画板上两点绘制平行四边形,第一点为对角线起点,第二点为对角线终点。
(6)圆角矩形。相当于Bresenham算法绘制直线与中点Bresenham画圆算法结合。用户点击画板上两点绘制圆角矩形,第一点为对角线起点,第二点为对角线终点。
(7)多边形。相当于用Bresenham算法绘制多条直线,最后闭合。单击即为选定一个顶点,直到按下右键为止并至少有三个顶点将开始画多边形。
(8)Bezier曲线。利用三次贝塞尔曲线数学公式通过四个控制点拟合。单击四次即为选择了四个点,选择了四个点后自动画曲线。
(9)B样条曲线。利用三次B样条曲线数学公式通过四个控制点拟合。单击四次即为选择了四个点,选择了四个点后自动画曲线。
(10)图形填充。采用有效边表算法。包含填充矩形和填充多边形,操作方法和画矩形和多边形一致。
(11)图形裁剪。采用中点分割算法。包含矩形裁剪和多边形裁剪,操作方法和画矩形和多边形一致,画出裁剪区域后按下删除键进行裁剪。
(12)线宽设置。通过用户设置画笔粗细参数实时改变画点大小。
(13)颜色设置。调用系统调色板获取R,G,B分量设置。
(14)选取图元。左键点击需要选择的图元的轮廓来选择一个同时画好的基本图元,被选中区域被标记为黑色。
(15)图形旋转。根据用户设置角度,改变点的坐标,绕图元中心旋转。
(16)图形缩放。根据用户设置缩放倍数,改变点的坐标,以图元为中心缩放
(17)图形擦除。用户选择图元进行删除或利用橡皮擦(本质是白色画笔)擦除。
(18)文件打开保存。根据BMP格式实现文件的打开与保存。
(19)画面清除。通过新建画布实现。
(20)撤销和恢复。点击上一步撤销,下一步恢复。

/****************************************************************************
** Meta object code from reading C++ file 'OpenGLWindow.h'
**
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.6.2)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "../../DrawingBoard/OpenGLWindow.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qmetatype.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'OpenGLWindow.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.6.2. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

QT_BEGIN_MOC_NAMESPACE
struct qt_meta_stringdata_OpenGLWindow_t {
    QByteArrayData data[1];
    char stringdata0[13];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
    qptrdiff(offsetof(qt_meta_stringdata_OpenGLWindow_t, stringdata0) + ofs \
        - idx * sizeof(QByteArrayData)) \
    )
static const qt_meta_stringdata_OpenGLWindow_t qt_meta_stringdata_OpenGLWindow = {
    {
QT_MOC_LITERAL(0, 0, 12) // "OpenGLWindow"

    },
    "OpenGLWindow"
};
#undef QT_MOC_LITERAL

static const uint qt_meta_data_OpenGLWindow[] = {

 // content:
       7,       // revision
       0,       // classname
       0,    0, // classinfo
       0,    0, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       0,       // signalCount

       0        // eod
};

void OpenGLWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
    Q_UNUSED(_o);
    Q_UNUSED(_id);
    Q_UNUSED(_c);
    Q_UNUSED(_a);
}

const QMetaObject OpenGLWindow::staticMetaObject = {
    { &QOpenGLWidget::staticMetaObject, qt_meta_stringdata_OpenGLWindow.data,
      qt_meta_data_OpenGLWindow,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};


const QMetaObject *OpenGLWindow::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}

void *OpenGLWindow::qt_metacast(const char *_clname)
{
    if (!_clname) return Q_NULLPTR;
    if (!strcmp(_clname, qt_meta_stringdata_OpenGLWindow.stringdata0))
        return static_cast<void*>(const_cast< OpenGLWindow*>(this));
    if (!strcmp(_clname, "QOpenGLFunctions"))
        return static_cast< QOpenGLFunctions*>(const_cast< OpenGLWindow*>(this));
    return QOpenGLWidget::qt_metacast(_clname);
}

int OpenGLWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QOpenGLWidget::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    return _id;
}
QT_END_MOC_NAMESPACE

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值