//模擬小車行駛 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; // 计算电量的减少量 float power_consumption = distance /20; //_MAP[cur_x][cur_y] = 1; QTimer::singleShot(time, this, [&, i, next_node, cur_x, cur_y, power_consumption]() { // 离开当前位置时将标记设为0 //_MAP[cur_x][cur_y] = 0; agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); // 更新电量 agvs[i].setpower(agvs[i].power_- power_consumption); this->update(); // 在窗口中重绘 }); } },修改代碼:讓agv實現貝塞爾曲綫移動
时间: 2024-01-27 08:06:25 浏览: 101
要让AGV实现贝塞尔曲线移动,可以使用Qt提供的QPainterPath类和QPainter类来实现。
首先,在AGV类中添加一个QPainterPath类型的变量path,用于存储贝塞尔曲线路径。
然后,在生成路径时,不再使用简单的直线连接节点,而是使用QPainterPath的函数来生成贝塞尔曲线路径。例如:
```c++
QPainterPath path;
path.moveTo(startPoint); // 设置起点
path.cubicTo(controlPoint1, controlPoint2, endPoint); // 生成贝塞尔曲线路径
```
在每次移动时,使用QPainter的drawPath函数绘制贝塞尔曲线路径。例如:
```c++
QPainter painter(this);
painter.setPen(QPen(Qt::red, 2)); // 设置画笔颜色和宽度
painter.drawPath(agvs[i].path); // 绘制路径
```
同时,在计算时间和电量消耗时,需要使用QPainterPath的length函数来获取路径长度,再根据速度计算移动时间和电量消耗。例如:
```c++
float distance = agvs[i].path.length(); // 获取路径长度
float time = distance / speed * 1000; // 计算移动时间
float power_consumption = distance / 20; // 计算电量消耗
```
完整代码如下:
```c++
//在 AGV 类中添加 QPainterPath path;
class AGV {
private:
int currentX;
int currentY;
float speed;
float power;
int task_id;
public:
AGV(int x, int y, float s, float p, int t) : currentX(x), currentY(y), speed(s), power(p), task_id(t) {}
int getCurrentX() const { return currentX; }
int getCurrentY() const { return currentY; }
float getSpeed() const { return speed; }
float getPower() const { return power; }
int getTaskId() const { return task_id; }
void setCurrentX(int x) { currentX = x; }
void setCurrentY(int y) { currentY = y; }
void setSpeed(float s) { speed = s; }
void setPower(float p) { power = p; }
void setTaskId(int t) { task_id = t; }
QPainterPath path; // 添加 QPainterPath path;
};
//修改移动代码
for (int i = 0; i < agvs.size(); i++) {
for (int j = 0; j < tasks.size(); j++) {
if (tasks[j].id == agvs[i].getTaskId()) {
completed_task_index = j;
break;
}
}
if (tasks[completed_task_index].completed == 2 ) {
agvs[i].path.clear(); // 清空路径
continue;
}
if (agvs[i].path.isEmpty()) { // 如果路径为空,生成贝塞尔曲线路径
QPointF startPoint(agvs[i].getCurrentX(), agvs[i].getCurrentY());
QPointF endPoint(tasks[completed_task_index].x, tasks[completed_task_index].y);
QPointF controlPoint1(agvs[i].getCurrentX(), tasks[completed_task_index].y);
QPointF controlPoint2(tasks[completed_task_index].x, agvs[i].getCurrentY());
agvs[i].path.moveTo(startPoint);
agvs[i].path.cubicTo(controlPoint1, controlPoint2, endPoint);
}
if (!agvs[i].path.isEmpty()) { // 如果路径不为空,移动AGV
float speed = agvs[i].getSpeed();
float distance = agvs[i].path.length();
float time = distance / speed * 1000;
float power_consumption = distance / 20;
QTimer::singleShot(time, this, [&, i, power_consumption]() {
agvs[i].setPower(agvs[i].getPower() - power_consumption);
this->update();
});
}
}
//绘制代码
for (int i = 0; i < agvs.size(); i++) {
QPainter painter(this);
painter.setPen(QPen(Qt::red, 2));
painter.drawPath(agvs[i].path);
}
```
注意,这只是一个简单的实现,可能需要根据实际情况进行调整。同时,由于贝塞尔曲线路径的生成和绘制都是比较耗时的操作,如果AGV数量过多或者路径比较复杂,可能会影响程序的性能。
阅读全文