diff --git a/parkingLotManager.cpp b/parkingLotManager.cpp index e52fe87..e6ba5b8 100644 --- a/parkingLotManager.cpp +++ b/parkingLotManager.cpp @@ -99,10 +99,18 @@ ParkingLotGraph::Node::Type getType(int n) { void ParkingLotManager::drawPath(int n1, int n2) { + QPen pen(QColor(242, 23, 242)); + pen.setWidth(3); Path *p = m_graph[m_current_floor]->finaPath(getType(n1), n1, getType(n2), n2); for(int i = 1; i < p->pointsCount(); i++) { QLineF line(p->getPoint(i-1).point, p->getPoint(i).point); + QPointF dir(qCos(qDegreesToRadians(p->getPoint(i-1).dir)) * 10, + qSin(qDegreesToRadians(p->getPoint(i-1).dir)) * 10); + QLineF dirLine(p->getPoint(i-1).point, p->getPoint(i-1).point + dir); m_scene->addLine(line); + m_scene->addLine(dirLine, pen); + m_scene->addText(QString::number(p->getPoint(i-1).dir))->moveBy(p->getPoint(i-1).point.x(), + p->getPoint(i-1).point.y()); } } diff --git a/parkinglotgraph.cpp b/parkinglotgraph.cpp index a859ef4..7a6d19e 100644 --- a/parkinglotgraph.cpp +++ b/parkinglotgraph.cpp @@ -171,6 +171,10 @@ uint ParkingLotGraph::getNodeId(ParkingLotGraph::Node::Type t, int n) { return -1; } +qreal angle(const QPoint& p) { + return qRadiansToDegrees(qAtan2(p.y(), p.x())); +} + // Dijkstra 求最短路径 Path *ParkingLotGraph::finaPath(ParkingLotGraph::Node::Type t1, int n1, ParkingLotGraph::Node::Type t2, int n2) { @@ -214,40 +218,55 @@ Path *ParkingLotGraph::finaPath(ParkingLotGraph::Node::Type t1, int n1, ParkingL } Path* path = new Path(); uint n = id2; + QPoint lastP; while (n != id1) { - path->addPoint(0, PathPoint(QPointF(m_all[n]->data), 0, m_all[n]->action, m_all[n]->getId())); - QPoint tp; - if (m_all[n]->type == Node::Type::space) { - ParkingSpaceWidget* space = pk->getSpaceList().at(m_all[n]->number - 1); - switch (space->getDir()) { - case ParkingSpaceWidget::direction::E: - case ParkingSpaceWidget::direction::W: - tp.setX(m_all[prev[n]]->data.x()); - tp.setY(m_all[n]->data.y()); - break; - case ParkingSpaceWidget::direction::N: - case ParkingSpaceWidget::direction::S: - tp.setX(m_all[n]->data.x()); - tp.setY(m_all[prev[n]]->data.y()); - break; - } - } else if (m_all[n]->type == Node::Type::road) { - Road* road = pk->getRoadList().at(m_all[n]->number - 1); - switch(road->getDir()) { - case Road::direction::horizontal: - tp.setX(m_all[prev[n]]->data.x()); - tp.setY(m_all[n]->data.y()); - break; - case Road::direction::vertical: - tp.setX(m_all[n]->data.x()); - tp.setY(m_all[prev[n]]->data.y()); - break; + // 相邻两个点的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; + if (m_all[n]->type == Node::Type::space) { + ParkingSpaceWidget* space = pk->getSpaceList().at(m_all[n]->number - 1); + switch (space->getDir()) { + case ParkingSpaceWidget::direction::E: + case ParkingSpaceWidget::direction::W: + tp.setX(m_all[prev[n]]->data.x()); + tp.setY(m_all[n]->data.y()); + break; + case ParkingSpaceWidget::direction::N: + case ParkingSpaceWidget::direction::S: + tp.setX(m_all[n]->data.x()); + tp.setY(m_all[prev[n]]->data.y()); + break; + } + } else if (m_all[n]->type == Node::Type::road) { + Road* road = pk->getRoadList().at(m_all[n]->number - 1); + switch(road->getDir()) { + case Road::direction::horizontal: + tp.setX(m_all[prev[n]]->data.x()); + tp.setY(m_all[n]->data.y()); + break; + case Road::direction::vertical: + tp.setX(m_all[n]->data.x()); + tp.setY(m_all[prev[n]]->data.y()); + break; + } } + if (lastP.isNull()) + lastP = tp; + + qreal ang1 = angle(lastP - m_all[n]->data); + qreal ang2 = angle(m_all[n]->data - tp); + + path->addPoint(0, PathPoint(QPointF(m_all[n]->data), ang1, m_all[n]->action, m_all[n]->getId())); // 添加后一个点 + path->addPoint(0, PathPoint(QPointF(tp), ang2)); // 添加辅助点 + lastP = tp; + } else { + qreal ang = angle(m_all[n]->data - m_all[prev[n]]->data); + path->addPoint(0, PathPoint(QPointF(m_all[n]->data), ang, m_all[n]->action, m_all[n]->getId())); } - path->addPoint(0, PathPoint(QPointF(tp), 0)); n = prev[n]; } - path->addPoint(0, PathPoint(QPointF(m_all[n]->data), 0, m_all[n]->action, m_all[n]->getId())); // 把第一个点也加进去 + path->addPoint(0, PathPoint(QPointF(m_all[n]->data), angle(lastP - m_all[n]->data), m_all[n]->action, m_all[n]->getId())); // 把第一个点也加进去 return path; } @@ -318,7 +337,7 @@ Road::Action ParkingLotGraph::Node::getAction() const return action; } -uint ParkingLotGraph::Node::getId() const +int ParkingLotGraph::Node::getId() const { return id; } diff --git a/parkinglotgraph.h b/parkinglotgraph.h index ff41ac2..b0ae5fa 100644 --- a/parkinglotgraph.h +++ b/parkinglotgraph.h @@ -17,16 +17,16 @@ public: struct Node{ public: enum Type{road, space, entry}; - Node(const QPoint& p, Type t, uint n, uint idd) : number(n), id(idd), type(t), data(p) {} + Node(const QPoint& p, Type t, uint n, int idd) : number(n), id(idd), type(t), data(p) {} void addPath(Node* another); uint number; - uint id; + int id; Type type; QPoint data; Road::Action action = Road::Action::none; QVector adjacent; QVector weight; - uint getId() const; + int getId() const; Road::Action getAction() const; void setAction(const Road::Action &value) { action = value; diff --git a/path.h b/path.h index 92ffa07..adebc24 100644 --- a/path.h +++ b/path.h @@ -18,6 +18,8 @@ struct PathPoint PathPoint(const PathPoint& another) { point = another.point; dir = another.dir; + pointId = another.pointId; + action = another.action; } };