for (int i = 0; i < agvs.size(); i++) { for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (tasks[completed_task_index].completed == 2 ) { // 如果已经完成任务 paths[i].clear(); continue; // 跳过此次循环 } if (! paths[i].empty()) { int cur_x = agvs[i].getCurrentX(); int cur_y = agvs[i].getCurrentY(); 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; _MAP[cur_x][cur_y] = 1; QTimer::singleShot(time, this, &, i, next_node, cur_x, cur_y { // 离开当前位置时将标记设为0 _MAP[cur_x][cur_y] = 0; agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); this->update(); // 在窗口中重绘 }); } }, for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad()){ painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agvload.png").scaled(25,25)); } else { painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agv1.png").scaled(25,25)); },修改代碼:實現agv小車的模擬運動,而不是一秒跳一格
时间: 2024-01-29 12:04:42 浏览: 68
AGVS.rar_AGVS调度_gulf5j4_scheduling AGV_wpf agv调度系统_调度控制
5星 · 资源好评率100%
根据代码中的 QTimer::singleShot() 函数可以看出,当前代码是使用 QTimer 来模拟 AGV 小车的运动。但是,这种方式是每隔一定的时间就将小车移动一格,而不是实现连续的运动。
要实现 AGV 小车的连续运动,可以采用类似于游戏开发中的渲染循环(render loop)的方式来实现。即在一个循环中不断刷新界面,并根据时间差来计算小车移动的距离和方向,从而实现连续的运动效果。
可以按照以下步骤来修改代码:
1. 定义一个变量 lastTime,用于记录上一次绘制的时间。
2. 在绘制函数中,计算当前时间和上一次绘制的时间差 deltaTime。
3. 遍历所有的 AGV 小车,根据 deltaTime 计算小车应该移动的距离和方向。
4. 更新小车的位置,并在界面中重绘。
下面是修改后的代码示例:
```
// 定义一个变量,记录上一次绘制的时间
QDateTime lastTime = QDateTime::currentDateTime();
// 绘制函数
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// 计算当前时间和上一次绘制的时间差
QDateTime currentTime = QDateTime::currentDateTime();
qint64 deltaTime = lastTime.msecsTo(currentTime);
lastTime = currentTime;
// 遍历所有的 AGV 小车
for (int i = 0; i < agvs.size(); i++) {
if (agvs[i].getLoad()){
painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agvload.png").scaled(25,25));
} else {
painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agv1.png").scaled(25,25));
}
// 如果小车有路径,则根据时间差计算小车应该移动的距离和方向
if (! paths[i].empty()) {
float speed = agvs[i].getSpeed();
Node* next_node = paths[i][0];
float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2));
float time = distance / speed * 1000;
float deltaDistance = speed * deltaTime / 1000;
float directionX = (next_node->x - agvs[i].getCurrentX()) / distance;
float directionY = (next_node->y - agvs[i].getCurrentY()) / distance;
// 如果小车移动的距离大于等于路径上两个节点之间的距离,则更新小车的位置,否则不更新
if (deltaDistance >= distance) {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
paths[i].erase(paths[i].begin());
} else {
agvs[i].setCurrentX(agvs[i].getCurrentX() + deltaDistance * directionX);
agvs[i].setCurrentY(agvs[i].getCurrentY() + deltaDistance * directionY);
}
}
}
// 在界面中重绘
this->update();
}
```
需要注意的是,如果小车移动的距离大于等于路径上两个节点之间的距离,则需要将小车的位置直接更新为下一个节点的位置,并将该节点从路径中删除。这样可以确保小车始终在正确的节点上停留。
阅读全文