std::vector<std::vector<Node*>> paths(agvs.size()); for (int i = 0; i < agvs.size(); i++) { //畫出agv獲取path上的坐標點之間的連綫 if (i < paths.size() && paths[i].size() > 1 && paths[i][0] != nullptr) { QPainterPath path; path.moveTo(paths[i][0]->x, paths[i][0]->y); for (int k = 1; k < paths[i].size(); k++) { if (paths[i][k] != nullptr) { path.lineTo(paths[i][k]->x, paths[i][k]->y); if (painter.isActive()) { painter.setPen(QPen(Qt::red, 20)); painter.drawLine(paths[i][k-1]->x, paths[i][k-1]->y, paths[i][k]->x, paths[i][k]->y); } } } } },爲什麽沒有繪製出直綫
时间: 2023-12-21 22:03:47 浏览: 27
根据提供的代码,似乎是缺少 `painter.strokePath(path, QPen(Qt::red, 20));` 这一行代码,导致没有绘制出直线。可以尝试将以下代码:
```
if (painter.isActive()) {
painter.setPen(QPen(Qt::red, 20));
painter.drawLine(paths[i][k-1]->x, paths[i][k-1]->y, paths[i][k]->x, paths[i][k]->y);
}
```
修改为:
```
if (painter.isActive()) {
painter.setPen(QPen(Qt::red, 20));
painter.drawLine(paths[i][k-1]->x, paths[i][k-1]->y, paths[i][k]->x, paths[i][k]->y);
painter.strokePath(path, QPen(Qt::red, 20));
}
```
这样可以在绘制直线的同时,使用 `painter.strokePath()` 方法将路径绘制出来。
相关问题
void MainWindow::moveAgvs_(){ timer =new QTimer(this); timer->start(1000); connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);} void MainWindow::moveAgvs() { Astar astar; std::vector<Node*> path; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node; if (agvs[i].getLoad() == false) { end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); } else { end_node = new Node(agvs[i].getEndX(), agvs[i].getEndY()); } std::vector<Node*> path = astar.getPath(start_node, end_node); paths[i] = path; //輸出agv的路綫 std::cout << "AGV " << i << " path: "; for (int j = 0; j < path.size(); j++) { std::cout << "(" << path[j]->x << ", " <<path[j]->y << ")"; if (j != path.size() - 1) { std::cout << " -> "; } } std::cout << std::endl; } for (int i = 0; i < agvs.size(); i++) { if (! paths[i].empty()) { Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; QTimer::singleShot(time, this, &, i, next_node { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl; this->update(); if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY()) { //task_to_agv(i); } }); } } },agv沒有模擬運行,修改一下
有几个问题需要修正:
1. `moveAgvs_()`函数中,应该将`timer->start(1000)`放在`connect`语句的后面,因为如果`timeout`信号在`start()`之前被触发,会导致`moveAgvs()`函数在启动定时器之前就被调用。
2. 在`moveAgvs()`函数中,定义了一个名为`path`的局部变量,覆盖了函数开头定义的`std::vector<Node*> path`。因此,在后面对`paths`进行赋值时,实际上是没有生效的。应该将第6行的`std::vector<Node*> path;`修改为`path = astar.getPath(start_node, end_node);`。
3. 在`QTimer::singleShot()`函数的第三个参数中,应该将`&`去掉,并在lambda表达式中加入`i`和`next_node`的捕获列表。即将`&, i, next_node`修改为`[=, i, next_node]() mutable {`。
4. 在`QTimer::singleShot()`函数中,应该将花括号中的代码块用圆括号括起来,即将`{ agvs[i].setCurrentX(next_node->x);`修改为`{ agvs[i].setCurrentX(next_node->x); }`。
下面是修改后的代码:
```c++
void MainWindow::moveAgvs_()
{
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);
timer->start(1000);
}
void MainWindow::moveAgvs()
{
Astar astar;
std::vector<std::vector<Node*>> paths(agvs.size());
// 得到agv的路线
for (int i = 0; i < agvs.size(); i++)
{
Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY());
Node* end_node;
if (agvs[i].getLoad() == false)
{
end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY());
}
else
{
end_node = new Node(agvs[i].getEndX(), agvs[i].getEndY());
}
std::vector<Node*> path = astar.getPath(start_node, end_node);
paths[i] = path;
// 输出agv的路线
std::cout << "AGV " << i << " path: ";
for (int j = 0; j < path.size(); j++)
{
std::cout << "(" << path[j]->x << ", " << path[j]->y << ")";
if (j != path.size() - 1)
{
std::cout << " -> ";
}
}
std::cout << std::endl;
}
for (int i = 0; i < agvs.size(); i++)
{
if (!paths[i].empty())
{
Node* next_node = paths[i][0];
float speed = agvs[i].getSpeed();
float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2));
float time = distance / speed * 1000;
QTimer::singleShot(time, [=, i, next_node]() mutable {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() << std::endl;
this->update();
if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY())
{
//task_to_agv(i);
}
});
}
}
}
```
public: std::vector<std::vector<Node*>> paths;,void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); //根據agv獲取taskid,初始化 int completed_task_index = -1; // 如果任務都完成了,停止定時器 bool all_tasks_completed = true; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].completed != 2) { all_tasks_completed = false; break; } } if (all_tasks_completed) { timer->stop(); // 停止定时器 return; } // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad() == true) { // 如果是负载的状态 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { // 如果到达终点 agvs[i].setLoad(false); // 设置为空载状态 agvs[i].setState(true); std::cout << "agv__id :" << agvs[i].getid() << " ,agv_get_task_id :" << agvs[i].get_task_id() << endl; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (completed_task_index != -1) { tasks[completed_task_index].completed = 2; } task_to_agv(); // 更新任务分配 update(); // 更新AGV状态 } else { // 否则行驶到终点 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 = astar.getPath(start_node, end_node1); path.erase(path.begin()); paths[i] = path; } } else { // 如果是空载的状态 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { // 如果到达起点 agvs[i].setLoad(true); // 设置为负载状态 } else { // 否则行驶到起点 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 = astar.getPath(start_node, end_node); path.erase(path.begin()); paths[i] = path; } } } // for (int i = 0; i < paths.size(); i++) { // std::cout << "AGV " << i << " path: "; // for (int j = 0; j < paths[i].size(); j++) { // std::cout << "(" << paths[i][j]->x << "," << paths[i][j]->y << ") "; // } // std::cout << std::endl; // },爲什麽在其他函數中引用path永遠為空,怎麽修改
在 `MainWindow::moveAgvs()` 函数中,你创建了一个名为 `paths` 的局部变量,它是一个 `std::vector<std::vector<Node*>>` 类型的二维向量。然后,在循环中,你为 `paths[i]` 赋值一个 `std::vector<Node*>` 类型的向量。这个 `paths` 变量只在 `MainWindow::moveAgvs()` 函数中定义和使用,因此在其他函数中引用 `path` 变量时,它始终为空。
要在其他函数中访问 `paths` 变量,你需要将它定义为 `MainWindow` 类的成员变量。在 `MainWindow` 类的头文件中添加以下代码:
```cpp
private:
std::vector<std::vector<Node*>> paths;
```
然后,在 `MainWindow::moveAgvs()` 函数中,删除 `std::vector<std::vector<Node*>> paths(agvs.size());` 这一行,因为你现在已经有了一个成员变量 `paths`,不需要再创建一个局部变量了。
最后,在其他函数中引用 `paths` 变量时,使用 `this->paths` 表示它是 `MainWindow` 类的成员变量,而不是局部变量。