/*头文件*/
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct mypoint
{
QPoint a;
mypoint* head;
};
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void tian();
void go();
void goo();
protected:
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void paintEvent(QPaintEvent *);
private:
queue<mypoint*> v;
bool a[800][600];
mypoint *c;
QPushButton ren;
QImage pix;
QPoint lpt,ept,tpt,xy[8000];
QColor tcolor,color;
int m,ts,tt,i;
};
#endif // WIDGET_H
/*定义文件*/
#include "widget.h"
#include "ui_widget.h"
void sleep(unsigned int msec)
{
QTime dieTime = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
ren.setParent(this);
ren.setGeometry(3,3,10,10);
// ren.move(40,40);
ren.setStyleSheet("background-color: rgb(170, 0, 255);");
m=0;ts=0;a[0][0]=0;tt=0;i=0;
//tool=1;m=0;t=0;fill=0;w=1;s=Qt::SolidLine;st=Qt::SolidPattern;ts=0;q=0;qs=0;
pix=QImage(800,600,QImage::Format_ARGB32);
pix.fill(Qt::white);
update();
}
void Widget::mousePressEvent(QMouseEvent *e)
{
if(e->button()==Qt::LeftButton)
{
lpt=e->pos();
m=1;
}
if(e->button()==Qt::RightButton)
{
tpt=e->pos();
ts=1;
for(int i=0;i<800;i++)
for(int j=0;j<600;j++)
if(pix.pixelColor(QPoint(i,j))==Qt::white)
a[i][j]=true;
else
a[i][j]=false;
update();
}
if(e->button()==Qt::MidButton)
{
tt=1;
for(int j=0;j<i;j++)
{
ren.move(xy[j]);
sleep(5);
}
tt=0;
}
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
update();
if(m==0)return;
ept=e->pos();
m=2;
update();
}
void Widget::mouseReleaseEvent(QMouseEvent *e)
{
if(e->button()==Qt::LeftButton)
{
ept=e->pos();
m=3;
update();
}
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
if(ts==1)
{
go();
ts=0;
p.drawImage(0,0,pix);
tt=1;
}
if(m==0)return ;
if(tt==1){p.drawImage(0,0,pix);return;}
QPainter p2(&pix);
QPen pe;
pe.setColor(Qt::black);
pe.setWidth(7);
pe.setCapStyle(Qt::RoundCap);
p2.setPen(pe);
p2.drawLine(lpt,ept);
lpt=ept;
if(m==3)
m=0;
p.drawImage(0,0,pix);
}
Widget::~Widget()
{
}
void Widget::go()
{
mypoint *m=new mypoint;
m->a=tpt;m->head=NULL;
v.push(m);
while(!v.empty())
{
c=v.front();
a[c->a.x()][c->a.y()]=false;
v.pop();
if(c->a==QPoint(0,0))
{
//setWindowTitle("1231321");
mypoint *p=c;
do
{ xy[i++]=p->a;
pix.setPixelColor(p->a,Qt::blue);
p=p->head;
}while(p->a!=tpt);
break;
}
int der[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
for(int i=0;i<4;i++)
{
if((c->a.x()+der[i][0]>=0&&c->a.x()+der[i][0]<800)&&(c->a.y()+der[i][1]>=0&&c->a.y()+der[i][1]<600)&&a[c->a.x()+der[i][0]][c->a.y()+der[i][1]]==true)
{
a[c->a.x()+der[i][0]][c->a.y()+der[i][1]]=false;
mypoint *ccc=new mypoint;
ccc->a=QPoint(c->a.x()+der[i][0],c->a.y()+der[i][1]);
ccc->head=c;
v.push(ccc);
}
}
}
}
/*主要思想:通过广度搜索遍历能走的点,每一个点用指针fore指向其源头。
当遍历到终点时,跳出循环,此时最后一个出容器的点的fore指向起点的路径为最短路径*/