Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getState() == false) { if (agvs[i].getLoad()){//如果是負載的狀態,則任務的起點到任務的終點 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { agvs[i].setState(true); agvs[i].setLoad(false); tasks[i].setCompleted(2); task_to_agv(); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_end = astar.getPath(start_node, end_node1); path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path;} else { //如果是空載的狀態,則行駛到任務的起點 //如果agv已經到達任務起點,變爲負載狀態 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { agvs[i].setLoad(true); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); paths[i] = path;} }, if (paths.size() > 0) { std:: cout << "wsn"<<endl; for (int i = 0; i < agvs.size(); i++) { if (!paths[i].empty()) { QPainterPath path; for (int j = 0; j < paths[i].size() - 1; j++) { Node* current_node = paths[i][j]; Node* next_node = paths[i][j+1]; path.moveTo(current_node->x25+200+nodeSize/2, current_node->y25+50+nodeSize/2); path.lineTo(next_node->x25+200+nodeSize/2, next_node->y25+50+nodeSize/2); } painter.setPen(QPen(Qt::yellow, 3)); painter.drawPath(path); } } },沒有畫出agv的路徑,怎麽修改
时间: 2023-11-27 11:54:54 浏览: 32
首先,你可以在绘制路径之前打印出路径的大小,确保路径不为空。如果路径为空,说明 A* 算法没有得到有效的路径,需要检查代码中是否有错误。
其次,在绘制路径时,你可以将路径中的节点坐标转换为绘图坐标。例如,你可以使用以下代码将节点坐标 (x,y) 转换为绘图坐标 (x_draw, y_draw):
```cpp
int x_draw = x * nodeSize + 200 + nodeSize/2;
int y_draw = y * nodeSize + 50 + nodeSize/2;
```
其中,`nodeSize` 是每个节点的大小,200 和 50 是绘图区域的偏移量,`nodeSize/2` 是为了将线段的起点和终点放在节点的中心。
最后,你可以尝试调整画笔的颜色和宽度,以便更好地显示路径。例如,你可以使用以下代码将画笔颜色设置为红色,并将宽度设置为 2:
```cpp
painter.setPen(QPen(Qt::red, 2));
```
综合以上建议,你可以尝试修改代码如下:
```cpp
if (!paths[i].empty()) {
std::cout << "path size: " << paths[i].size() << std::endl;
QPainterPath path;
for (int j = 0; j < paths[i].size() - 1; j++) {
Node* current_node = paths[i][j];
Node* next_node = paths[i][j+1];
int x1 = current_node->getX();
int y1 = current_node->getY();
int x2 = next_node->getX();
int y2 = next_node->getY();
int x_draw1 = x1 * nodeSize + 200 + nodeSize/2;
int y_draw1 = y1 * nodeSize + 50 + nodeSize/2;
int x_draw2 = x2 * nodeSize + 200 + nodeSize/2;
int y_draw2 = y2 * nodeSize + 50 + nodeSize/2;
path.moveTo(x_draw1, y_draw1);
path.lineTo(x_draw2, y_draw2);
}
painter.setPen(QPen(Qt::red, 2));
painter.drawPath(path);
}
```
希望能帮到你!