From 433bd797758c0d1fa59bbfb93038b4648423e5ec Mon Sep 17 00:00:00 2001 From: w-mj Date: Sun, 24 Dec 2017 22:31:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E7=82=B9=E5=BE=AE=E5=B0=8F=E7=9A=84?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Road.h | 2 +- parkingLotManager.cpp | 43 +++++++++++++++++++++++++++++++++++++++---- parkingLotManager.h | 9 ++++++++- parkinglotgraph.cpp | 23 ++++++++++++----------- parkinglotgraph.h | 4 ++-- 5 files changed, 62 insertions(+), 19 deletions(-) diff --git a/Road.h b/Road.h index d133cd0..39fc880 100644 --- a/Road.h +++ b/Road.h @@ -9,7 +9,7 @@ class Road: public QWidget Q_OBJECT public: enum direction{ horizontal, vertical}; - enum Action{entry, stair, exit, queueHead, none}; + enum Action{entry = 1, stair, exit, queueHead, none}; Road(ParkingLotWidget* parent, const int length, direction dir); void paintEvent(QPaintEvent* event) override; uint getNumber() const; diff --git a/parkingLotManager.cpp b/parkingLotManager.cpp index a8d5dc5..c7b5fe9 100644 --- a/parkingLotManager.cpp +++ b/parkingLotManager.cpp @@ -15,6 +15,8 @@ #define OCCUPIED (ParkingSpaceWidget::Situation::occupied) #define FREE (ParkingSpaceWidget::Situation::free) +#define NODE_TYPE ParkingLotGraph::Node::Type + ParkingLotManager::ParkingLotManager(QObject* objectParent, QGraphicsScene* scene): QObject(objectParent), m_scene(scene) @@ -103,7 +105,7 @@ ParkingLotGraph::Node::Type getType(int n) { if (n > 0) return ParkingLotGraph::Node::Type::space; else - return ParkingLotGraph::Node::Type::entry; + return ParkingLotGraph::Node::Type::act; } void ParkingLotManager::drawPath(int n1, int n2) @@ -123,20 +125,53 @@ void ParkingLotManager::drawPath(int n1, int n2) } } -ParkingLotManager::RequestSpace ParkingLotManager::request(uint entry) +void ParkingLotManager::requestOut(Car *car, int exit = -1) +{ + if (exit != -1) + exit = rand() % m_num_of_entry; + Path *p; // TODO:请求出口 +} + +ParkingLotManager::RequestSpace ParkingLotManager::requestIn(Car* car) { if (!m_pool.empty()) { int l = m_pool.first().first; int n = m_pool.first().second; m_pool.removeAt(0); - Path* p = m_graph[l]->finaPath(ParkingLotGraph::Node::Type::entry, entry, - ParkingLotGraph::Node::Type::space, n); + Path* p; + if (l == m_current_floor) + p = m_graph[l]->finaPath(NODE_TYPE::queueHead, entry, NODE_TYPE::space, n); + else { + p = m_graph[m_current_floor]->findPath(NODE_TYPE::queueHead, entry, NODE_TYPE::stair, entry); + } + m_waitting.at(entry).removeFirst(); // 等候队列中的第一个移除 + m_cars.at(l).at(n) = car; Log::i(QString("分配第") + l + "层" + n + "号车位,剩余" + QString::number(m_pool.size()) + "个空车位"); + return RequestSpace(l, n, p); + } else { + Log::i("请求失败,车位已满"); } return RequestSpace(); } +void ParkingLotManager::leave(Car* car) +{ + m_pool.append(qMakePair(l, n)); + Log::i(QString("有车离开,当前共有%1个空车位").arg(m_pool.size())); + emit carLeave(); + emit setLoad(QString::number(m_capacity.at(l) - m_num_of_cars[l])); // 更新剩余车位 +} + +void ParkingLotManager::addCar(int entry) +{ + if (entry == -1) + entry = rand() % m_num_of_entry; + Car *car = new Car(0, 0); // TODO: 修改构造函数 + m_waitting.at(entry).append(car); + // TODO: 添加路径 +} + void ParkingLotManager::showMargin(bool enable) { // qDebug() << "show margin" << enable; diff --git a/parkingLotManager.h b/parkingLotManager.h index 3cda7d7..0192b3a 100644 --- a/parkingLotManager.h +++ b/parkingLotManager.h @@ -28,7 +28,12 @@ public: void showDownStairFloor(void); void showUpStairFloor(void); void drawPath(int n1, int n2); - RequestSpace request(uint entry); + +public slots: + void requestIn(Car* car); + void requestOut(Car* car, int exit = -1); + void leave(Car* car); + void addCar(int entry = -1); void showMargin(bool enable); void showGraph(bool enable); @@ -60,6 +65,8 @@ signals: void setLoad(const QString&); void setLayerName(const QString&); void showMarginSignal(bool); + + void carLeave(void); }; #endif // PARKINGLOTITEM_H diff --git a/parkinglotgraph.cpp b/parkinglotgraph.cpp index eb59000..f1ac574 100644 --- a/parkinglotgraph.cpp +++ b/parkinglotgraph.cpp @@ -50,15 +50,14 @@ ParkingLotGraph::ParkingLotGraph(const ParkingLotWidget* pkl): pk(pkl) if (r->getAction() != Road::entry) { m_roadNodeList[2*i + r->getActionPos() - 1]->setAction(r->getAction()); // 添加动作 // 把有动作的节点添加到dict里,方便查找 - m_actionList.insert(m_roadNodeList[2*i + r->getActionPos() - 1]->getId(), - m_roadNodeList[2*i + r->getActionPos() - 1]); + m_actionList.append(m_roadNodeList[2*i + r->getActionPos() - 1]); } else { // 当前点为入口 m_roadNodeList[2*i + r->getActionPos() - 1]->setAction(r->getAction()); // 另一个点为队首 m_roadNodeList[2*i + 2 - r->getActionPos()]->setAction(Road::Action::queueHead); - m_actionList.insert(m_roadNodeList[2 * i]->getId(), m_roadNodeList[2 * i]); - m_actionList.insert(m_roadNodeList[2 * i + 1]->getId(), m_roadNodeList[2 * i + 1]); + m_actionList.append(m_roadNodeList[2 * i]); + m_actionList.append(m_roadNodeList[2 * i + 1]); } } m_roadNodeList[2*i]->addPath(m_roadNodeList[2*i + 1]); // 一条路的两个端点连接起来 @@ -170,12 +169,14 @@ void ParkingLotGraph::paint(QGraphicsScene *scene) uint ParkingLotGraph::getNodeId(ParkingLotGraph::Node::Type t, int n) { if (t == Node::Type::space) { return m_spaceList.at(n - 1)->getId(); - } else if(t == Node::Type::entry) { - int k = 0; - for (Node* node: m_actionList.values()) - if (node->action==Road::Action::entry) - if (++k == n) - return node->id; + } else if (t == Node::Type::act) { + return m_actionList.at(n - 1)->getId(); + } else { + Road::Action act = static_cast(t); + for (auto n: m_actionList) { + if (n->action == act && --n == 0) + return n->id; + } } return -1; } @@ -229,7 +230,7 @@ Path *ParkingLotGraph::finaPath(ParkingLotGraph::Node::Type t1, int n1, ParkingL uint n = id2; QPoint lastP; while (n != id1) { - // 相邻两个点的xy都不想等,添加一个辅助顶点构成矩形 + // 相邻两个点的xy都不相等,添加一个辅助顶点构成矩形 if (m_all[n]->data.x() != m_all[prev[n]]->data.x() && m_all[n]->data.y() != m_all[prev[n]]->data.y()) { QPoint tp; diff --git a/parkinglotgraph.h b/parkinglotgraph.h index b0ae5fa..b1cdfd9 100644 --- a/parkinglotgraph.h +++ b/parkinglotgraph.h @@ -16,7 +16,7 @@ class ParkingLotGraph public: struct Node{ public: - enum Type{road, space, entry}; + enum Type{entry = 1, stair, exit, queueHead, space, road, act}; Node(const QPoint& p, Type t, uint n, int idd) : number(n), id(idd), type(t), data(p) {} void addPath(Node* another); uint number; @@ -49,7 +49,7 @@ private: QVector m_all; QVector m_spaceList; QVector m_roadNodeList; - QMap m_actionList; + QVector m_actionList; QPixmap* m_pixmap = nullptr; void generatePixmap(); const ParkingLotWidget* pk;