if (j == steps && new_x != next_node->x && new_y != next_node->y) { std:: cout << "出現修正" << endl; agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); },將這個if條件改爲,newx不爲整數
时间: 2024-02-10 19:11:24 浏览: 23
如果将这个if条件改为new_x不为整数的话,就需要在判断条件中加上对new_x是否为整数的判断。具体来说,可以使用fmod函数来判断new_x是否为整数,fmod函数可以计算两个浮点数相除的余数。如果new_x除以1的余数不为0,那么它就不是整数。
修改后的代码如下:
```c++
if (j == steps && (new_x != next_node->x || fmod(new_x, 1.0) != 0)) {
std::cout << "出現修正" << endl;
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
}
```
这样就可以在new_x不为整数的时候进行位置修正了。需要注意的是,这个判断条件中还包括new_x是否等于next_node->x的判断,这是因为如果new_x已经等于next_node->x,那么就不需要进行位置修正了,否则就会出现不必要的修正操作。
相关问题
for (int j = 1; j <= steps ; j++) { float time = j * 100.0 / speed;// 每步所需时间 QTimer::singleShot(time, this, [&, i, next_node, cur_x, cur_y, power_consumption, j, steps]() { // 离开当前位置时将标记设为0 float ratio = static_cast<float>(j) / steps; double new_x = cur_x + ratio * (next_node->x - cur_x); double new_y = cur_y + ratio * (next_node->y - cur_y); agvs[i].setCurrentX(new_x); agvs[i].setCurrentY(new_y); // std::cout <<"AGV: "<< i+1 <<"(" << new_x << "," << new_y << ")" << endl; //修正 if (j == steps && new_x != next_node->x && new_y != next_node->y) { std:: cout << "出現修正" << endl; agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); },詳細翻譯一下
这段代码是一个用于模拟自动引导车(AGV)的移动过程的循环。循环中的变量j表示移动的步数,steps表示总步数,而speed则表示AGV的速度。在每一步中,AGV会先计算出移动所需时间time,然后使用QTimer::singleShot函数在time毫秒后启动一个lambda表达式。这个lambda表达式中包含了AGV移动的过程,首先会将当前位置的标记设为0,然后计算出当前位置和下一个节点之间的比例ratio,并根据比例计算出新的位置new_x和new_y。接着会将AGV的当前坐标更新为新的坐标,并进行位置修正。如果当前步数等于总步数,且新的坐标与下一个节点的坐标不一致,就需要进行位置修正,将当前坐标设置为下一个节点的坐标。
while (cur_x ==next_node->x || cur_y ==next_node->y) { std::this_thread::sleep_for(std::chrono::milliseconds(static_cast<int>(time1))); float ratio = static_cast<float>(j) / steps; double new_x = cur_x + ratio * (next_node->x - cur_x); double new_y = cur_y + ratio * (next_node->y - cur_y); agvs[i].setCurrentX(new_x); agvs[i].setCurrentY(new_y); // 更新电量 if (agvs[i].battery_ - power_consumption / steps < 0) { agvs[i].setbattery(0); } else { agvs[i].setbattery(agvs[i].battery_ - power_consumption / steps); } this->update(); // 在窗口中重绘 if (agvs[i].getBattery() >0 && std::floor(new_x) == new_x && std::floor(new_y) == new_y) { // 如果new_x和new_y为整数型,将其转换为浮点型后调用moveAgv()函数 moveAgvs(i); } }
根据您提供的代码片段,我看不出任何错误。但是,这段代码可能需要根据您的具体情况进行一些修改,以确保它能够正常工作。以下是一些可能需要注意的事项:
1. 您需要确保在使用std::this_thread::sleep_for()函数之前,已经包含了所需的头文件:
```
#include <chrono>
#include <thread>
```
2. 您需要检查变量cur_x、cur_y、next_node、j、steps、power_consumption和agvs[i]是否已经在其他地方正确地定义和初始化。如果这些变量的值不正确,可能会导致代码无法正常工作。
3. 您需要确保moveAgvs()函数已经正确实现,并且能够正确地将AGV移动到目标位置。如果moveAgvs()函数存在问题,可能会导致代码无法正常工作。
希望这些信息能够帮助您解决问题!