接上篇基于Qt实现的算法可视化(棋盘覆盖、汉诺塔、旅行商),本篇主要给出棋盘覆盖问题的具体实现。
该篇代码给出了棋盘覆盖分治算法的动态实现过程,先是通过DAC来生成染色顺序的序列,然后通过计时器来依次将每个方格染色,并不断的更新棋盘。具体见代码注释。
头文件:
#ifndef CHESSCOVER_H
#define CHESSCOVER_H
#include <QWidget>
#include <QPushButton>
#include <QPixmap>
#include <QPainter>
#include <QMouseEvent>
#include <QLineEdit>
#include <QLabel>
#include <QTimer>
class chesscover : public QWidget
{
Q_OBJECT
public:
explicit chesscover(QWidget *parent = 0);
void return_main(); //返回主界面
void paintline(); //画线,生成未染色的棋盘
void setgrim(); //设置单元格的大小和数目
void setcolor(); //设置调色盘
void paintboard(); //填充棋盘
void DAC(int tx, int ty, int sx, int sy, int size); //分治法填充
void updateBySq(); //根据生成的染色顺序表,对棋盘进行染色
protected:
void paintEvent(QPaintEvent *ev); //绘图事件,用来绘制、更新棋盘
void mousePressEvent(QMouseEvent *ev); //鼠标点击事件,主要用于设置特殊点
signals:
void return_sign(); //返回主界面的信号
public slots:
private:
//b1为“返回主界面”按钮,b2为“绘制棋盘”按钮,b3为“填充棋盘”按钮
QPushButton b1, b2, b3;
QPixmap board = QPixmap(501, 501); //棋盘图像
QLineEdit lineEdit; //行文本编辑器,用来读取k值
QLabel label; //用于显示行文本编辑器的输入提示
int color[1200][3]; //调色器,color[i]的三个元素分别对应第i种颜色的rgb参数
int gridcolor[50][50]; //储存棋盘上各个方格的颜色
int Sqnum, tile; //Sqnum记录染色顺序,tile用于指示当前方格颜色
struct Node{
int x,y;} Sq[1200]; //以染色的先后顺序来储存各点的横纵坐标
QTimer timer; //染色计时器
int Sqnow; //染色指针
int k; //棋盘边长为2^k
double gridsize; //单位方格的大小
int gridnum; //一条边上单位方格的数量
int signx=-1, signy=-1; //特殊点的坐标
bool click, paintFlag, paintlineFlag, select; //用于辅助鼠标点击和绘图的变量
};
#endif // CHESSCOVER_H
cpp文件:
#include "chesscover.h"
#include <QPen>
#include <QBrush>
#include <QString>
#include <QDebug>
#include <QtGlobal>
#include <QMessageBox>
#include <QFont>
chesscover::chesscover(QWidget *parent) : QWidget(parent), click(false),
paintFlag(false), paintlineFlag(false), select(false)
{
//窗口设置
setWindowTitle("棋盘覆盖问题"); //设置窗口标题
resize(1000, 650); //设置窗口大小
//按钮设置
b1.setParent(this); b2.setParent(this); b3.setParent(this); //设置父类
b1.setText("返回主界面"); b2.setText("绘制棋盘"); b3.setText("填充棋盘"); //设置按钮内容
b1.move(725, 475); b2.move(725, 275); b3.move(725, 375); //设置按钮位置
b1.resize