#include <iostream>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
,start(0,0)
,end(0,0)
{
ui->setupUi(this);
m_nColumes = m_nRows = 100;
m_RobotImage.load("F:/Z_PicLib/Satellite.png");
m_ObstacleImage.load("F:/Z_PicLib/Moon.png");
m_GoalImage.load("F:/Z_PicLib/goal.png");
m_bIsHaveRobot = m_bIsHaveGoal = false;
NewGame();
connect(this, SIGNAL(StartPlan()), this, SLOT(OnSearchPath()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitItems()
{
for(int i=0; i<m_nColumes; i++)
{
QVector<Item*> rowItems;
for(int j=0; j<m_nRows; j++)
{
QPoint pos = QPoint(i,j);
Item* pItem = new Item(pos);
rowItems.append(pItem);
}
m_items.append(rowItems);
}
}
bool MainWindow::PointInGameArea(QPoint pt)
{
int DeltaX,DeltaY;
bool bRet = true;
DeltaX = pt.x();//-START_X;
DeltaY = pt.y();//-START_Y;
if((DeltaX<0)||(DeltaY<0)||(DeltaX>RECT_WIDTH*m_nColumes)||(DeltaY>RECT_HEIGHT*m_nRows))
{
bRet = false;
}
return bRet;
}
void MainWindow::mousePressEvent(QMouseEvent * e)
{
//得到鼠标处的格子坐标
QPoint pt;
pt.setX( (e->pos().x() - START_X ) / RECT_WIDTH);
pt.setY( (e->pos().y() - START_Y ) / RECT_HEIGHT);
//wheather is the point in the Game area
if (!PointInGameArea(pt))
{
return;
}
if(m_items.size()<=0)
{
return;
}
//获取所点击矩形元素
Item* pItem = m_items[pt.x()][pt.y()];
//leftbutton set object tpye,rightbutton set obstacle
if(e->button()==Qt::LeftButton) //left button ,set Robot or goal
{
//
if(pItem->m_nObjectType == 1)
{
pItem->m_nObjectType = 0;
}
else
{
pItem->m_nObjectType = 1;
}
pItem->m_bIsObstacle=false;
// pItem->m_nObjectType%=3;
}
else if(e->button()==Qt::RightButton) //set obstacle or not obstacle
{
pItem->m_bIsObstacle=false; //clear obstacle
if(pItem->m_nObjectType == 2)
{
pItem->m_nObjectType = 0;
}
else
{
pItem->m_nObjectType = 2;//设置目的地
emit StartPlan();
}
}
else if(e->button()==Qt::MidButton) //set obstacle or not obstacle
{
pItem->m_nObjectType=0; //clear object type
if (pItem->m_bIsObstacle)
{
pItem->m_bIsObstacle = false;
}
else
{
pItem->m_bIsObstacle = true;
}
}
}
void MainWindow::ReleaseItems()
{
if(m_items.size()>0)
{
for(int i=0; i<m_nColumes; i++)
{
for(int j=0; j<m_nRows; j++)
{
delete m_items[i][j];
}
}
m_items.clear();
}
}
void MainWindow::ReleasePath()
{
path.clear();
}
void MainWindow::NewGame()
{
resize(START_X*2 + m_nColumes*RECT_WIDTH ,START_Y*2 + m_nRows*RECT_HEIGHT);
ReleaseItems();
ReleasePath();
InitItems();
}
void MainWindow::paintEvent(QPaintEvent *e)
{
DrawChessboard(); //绘制地图背景
DrawItems(); //绘制地图
DrawPath(); //绘制路径
update();
}
void MainWindow::DrawItem(QPainter& painter,Item* pItem)
{
if(pItem->m_bIsObstacle) //show obstacle
{
QRect rcSrc(0,0,m_ObstacleImage.width(),m_ObstacleImage.height());
QRect rcTarget(START_X + pItem->m_pos.x()*RECT_WIDTH + 2,START_Y + pItem->m_pos.y()*RECT_HEIGHT + 2,RECT_WIDTH-4,RECT_HEIGHT-4);
painter.drawPixmap(rcTarget,m_ObstacleImage,rcSrc);
painter.setBrush(Qt::transparent);
painter.drawRect( START_X + pItem->m_pos.x()*RECT_WIDTH,START_Y + pItem->m_pos.y()*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
return;
}
else if (pItem->m_nObjectType!=0) //show Robot item or goal item
{
if(pItem->m_nObjectType == 1) //show Robot
{
QRect rcSrc(0,0,m_RobotImage.width(),m_RobotImage.height());
QRect rcTarget(START_X + pItem->m_pos.x()*RECT_WIDTH + 2,START_Y + pItem->m_pos.y()*RECT_HEIGHT + 2,RECT_WIDTH-4,RECT_HEIGHT-4);
painter.drawPixmap(rcTarget,m_RobotImage,rcSrc);
painter.setBrush(Qt::transparent);
painter.drawRect( START_X + pItem->m_pos.x()*RECT_WIDTH,START_Y + pItem->m_pos.y()*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
return ;
}
else
{
QRect rcSrc(0,0,m_GoalImage.width(),m_GoalImage.height());
QRect rcTarget(START_X + pItem->m_pos.x()*RECT_WIDTH + 2,START_Y + pItem->m_pos.y()*RECT_HEIGHT + 2,RECT_WIDTH-4,RECT_HEIGHT-4);
painter.drawPixmap(rcTarget,m_GoalImage,rcSrc);
painter.setBrush(Qt::transparent);
painter.drawRect( START_X + pItem->m_pos.x()*RECT_WIDTH,START_Y + pItem->m_pos.y()*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
return;
}
}
else
{
painter.setBrush(Qt::darkGreen);
}
painter.drawRect( START_X + pItem->m_pos.x()*RECT_WIDTH,START_Y + pItem->m_pos.y()*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
}
void MainWindow::OnSearchPath()
{
ReleasePath();
createMazeMap(); //create Maze map and start end point
if(!m_bIsHaveRobot || !m_bIsHaveGoal)
{
std::cout<<"have not roobot or goal"<<std::endl;
return;
}
astar.InitAstar(mazeMap);
path=astar.GetPath(start, end, false);
markPathInMazeMap();
printMazeMap();
printPath();
if(!path.empty())
path.pop_back();
if(!path.empty())
path.pop_front();
update();
}
void MainWindow::DrawPath()
{
QPainter painter(this);
painter.setBrush(Qt::yellow);
if(!path.empty())
for(auto &p:path)
{
painter.drawRect( START_X + p->x*RECT_WIDTH,START_Y + p->y*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);
}
}
void MainWindow::createMazeMap()
{
int ItemVal;
for(int i=0; i<m_nColumes; i++)
{
std::vector<int> rowMaze;
for(int j=0; j<m_nRows; j++)
{
Item* pItem = m_items[i][j];
if(pItem->m_nObjectType>0)
{
if(pItem->m_nObjectType == 1)
{
m_bIsHaveRobot = true;
start.x = i;
start.y = j;
}
else if(pItem->m_nObjectType == 2)
{
m_bIsHaveGoal = true;
end.x = i;
end.y = j;
}
}
if(pItem->m_bIsObstacle)
{
ItemVal = 1;
}
else
{
ItemVal = 0;
}
rowMaze.push_back(ItemVal);
}
mazeMap.push_back(rowMaze);
}
}
void MainWindow::markPathInMazeMap()
{
}
void MainWindow::printMazeMap()
{
}
void MainWindow::printPath()
{
}
//绘制地图背景
void MainWindow::DrawChessboard()
{
}
//绘制地图
void MainWindow::DrawItems()
{
QPainter painter(this);
for(int i=0; i<m_nColumes; i++)
{
for(int j=0; j<m_nRows; j++)
{
DrawItem(painter,m_items[i][j]);
}
}
}