#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSql>
#include <QDateTime>
#include <time.h>
#include <windows.h>
#include <qlabel.h>
#include <QGridLayout>
#include <QPainter>
#include <QtCore/QProcess>
#define WORD int
//#define NULL 0
#define ONEANGLE 3.14159/360
#define WITHLEAVE 1 //1:树长叶子 0:树没有叶子
#define TREE_DEPTH 6 //树长的茂盛不茂盛就看它了.
#define LEAVE_WIDTH 15 //叶子的大小
void timerUpDate();
int g_depthUpdate=0;
MyTree * ExCreateClassTree_new(MyTree *pre_Tree,int isLeft);
/*初始化函数,构造函数*/
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
painter=new QPainter(this);
RootTree=NULL;
RootTree = new MyTree();
RootTree->x = WIN_WIDTH/2;
RootTree->y = WIN_HEIGHT-20;
RootTree->depth =0;
RootTree->angle =190; //没实际算为什么是190,我原来写的90,结果发现偏了.
RootTree->length = 160; //初始化根的高度.
RootTree->left = ExCreateClassTree_new(RootTree,1);
RootTree->right = ExCreateClassTree_new(RootTree,0);
if(!RootTree)
qDebug()<<"initlize RootTree error"<<endl;
ui->setupUi(this);
g_Dialog = new QDialog; // 初始化对话框
QIcon icon;
QPixmap pixmap0("image/background1.jpg");
icon.addPixmap(pixmap0);
ui->pushButton->setIcon(icon);
ui->pushButton->setIconSize(QSize(190,150));
}
MainWindow::~MainWindow()
{
delete ui;
}
int MainWindow::DrawClassTree(MyTree *root,QPainter *painter)
{
if(!root)
{
return 0;
}
int line_wid; //线的宽 度
int dstX,dstY;
line_wid= MAX_DEPTH -(root->depth+root->depth/2);
if(line_wid<1) line_wid=1;
if(root->depth > g_depthUpdate) return 0;
if(!root->left) //左子树为空则画叶子
{
dstX=root->x+1;
dstY=root->y+1;
painter->setPen(QPen(QBrush(QColor(0,140,0,255)), LEAVE_WIDTH, Qt::SolidLine, Qt::RoundCap));
if(WITHLEAVE)
painter->drawLine(root->x,root->y,dstX,dstY);
}
else
{
dstX=root->left->x;
dstY=root->left->y;
painter->setPen(QPen(Qt::black, line_wid, Qt::SolidLine, Qt::RoundCap));
painter->drawLine(root->x,root->y,dstX,dstY); //画左子树
}
if(!root->right)//右子树为空则画叶子
{
dstX=root->x+1;
dstY=root->y+1;
painter->setPen(QPen(QBrush(QColor(0,140,0,255)), LEAVE_WIDTH, Qt::SolidLine, Qt::RoundCap));
if(WITHLEAVE)
painter->drawLine(root->x,root->y,dstX,dstY);
}
else
{
dstX=root->right->x;
dstY=root->right->y;
painter->setPen(QPen(Qt::black, line_wid, Qt::SolidLine, Qt::RoundCap));
painter->drawLine(root->x,root->y,dstX,dstY);
}
DrawClassTree(root->left,painter);
DrawClassTree(root->right,painter);
return 0;
}
int MainWindow::DeleteTree(MyTree *rootTree)
{
if(!rootTree)
return 0;
DeleteTree(rootTree->left);
DeleteTree(rootTree->right);
delete(rootTree);
return 0;
}
MyTree * ExCreateClassTree_new(MyTree * pre_Tree,int isLeft)
{
int tx,ty;
/*树的深度,是否枝繁叶茂是由这个来决定的*/
if(pre_Tree->depth > qrand()%TREE_DEPTH+TREE_DEPTH)
return NULL;
MyTree * root;
root = new MyTree();
if(!root)
qDebug()<<"create root error!"<<endl;
root->depth = pre_Tree->depth+1;
if(root->depth<2)
{
/*最开始的两棵枝要往上长~~*/
if(isLeft)
{
root->angle = pre_Tree->angle+qrand()%15;
root->length = pre_Tree->length-pre_Tree->length/(3+qrand()%7);
}
else
{
root->angle = pre_Tree->angle-qrand()%15;
/*右树长得矮一些,看上去更茂盛*/
root->length = pre_Tree->length-pre_Tree->length/(2+qrand()%3);
}
}
else
{
/*根据上枝的角度进行一定的偏移,用于决定枝分叉的大小*/
if(isLeft)
root->angle = pre_Tree->angle+(45-root->depth*3+qrand()%(40-root->depth*2));
else
root->angle = pre_Tree->angle-(45-root->depth*3+qrand()%(40-root->depth*2));
root->length = pre_Tree->length-pre_Tree->length/(3+qrand()%7);
}
/*根据上面设置的角度和长度,来确定本枝的(x,y)坐标*/
root->x= pre_Tree->x + root->length*cos(root->angle*ONEANGLE);
root->y= pre_Tree->y - root->length*sin(root->angle*ONEANGLE);
root->left = ExCreateClassTree_new(root,1); //递归创建左子树
root->right = ExCreateClassTree_new(root,0); //递归创建右子树
return (MyTree *)root ;
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QLineF line(100, 100, 290.0, 220.0);
painter=new QPainter(this);
DrawClassTree(RootTree,painter);
delete(painter);
return ;
}
/*
* 重新生成树
*/
void MainWindow::timerUpDate()
{
/*
DeleteTree(RootTree);
RootTree = new MyTree();
RootTree->x = WIN_WIDTH/2;
RootTree->y = WIN_HEIGHT-20;
RootTree->depth =0;
RootTree->angle =190; //没实际算为什么是190,我原来写的90,结果发现偏了.
RootTree->length = 140+qrand()%50; //初始化根的高度.
RootTree->left = ExCreateClassTree_new(RootTree,1);
RootTree->right = ExCreateClassTree_new(RootTree,0);
*/
g_depthUpdate ++;
if(g_depthUpdate > 20)
{
g_depthUpdate=0;
DeleteTree(RootTree);
RootTree = new MyTree();
RootTree->x = WIN_WIDTH/2;
RootTree->y = WIN_HEIGHT-20;
RootTree->depth =0;
RootTree->angle =190; //没实际算为什么是190,我原来写的90,结果发现偏了.
RootTree->length = 140+qrand()%50; //初始化根的高度.
RootTree->left = ExCreateClassTree_new(RootTree,1);
RootTree->right = ExCreateClassTree_new(RootTree,0);
}
repaint();
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
timerUpDate();
}
在QT下画一棵树 第二版本
4星 · 超过85%的资源 需积分: 20 144 浏览量
2014-05-28
13:41:44
上传
评论 1
收藏 603KB RAR 举报
wzwxiaozheng
- 粉丝: 198
- 资源: 14
最新资源
- Integrated-Energy-Systems-with-CAES-(注释完全,可直接运行)
- PDF为英语文本绘制热区(DEMO)
- 4.22.cpp
- 基于Transformer和Bert的close domain抽取式问答系统构建的智能聊天机器人项目源代码
- 基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(注释完全,可直接运行)(文档加Matlab源码)
- 2023各大软件技术峰会演进资料汇总(PPT),资料难得
- 基于混沌集成决策树的电能质量复合扰动识别(注释完全,可直接运行)(文档加Matlab源码)
- 航空公司如何成功实现数字化转型英文版.rar
- RTL8309N-8口交换机评估板Cadence设计硬件(原理图+PCB)及PDF原理图+RTL8309N技术规格书
- 基于JAVA的打飞机游戏设计(程序).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈