vector<Vector3d> boss_faces_dirs; vector<tag_t> not_boss_faces; //非沉头面 vector<tag_t> boss_faces = getBossFace(solid, boss_faces_dirs,not_boss_faces); //优先找沉头面 BossFacesDirData boss_face_dir_data; vector<BossFacesDirData> boss_face_dir_data_vec; boss_face_dir_data_vec.clear(); for (int a = 0; a < boss_faces.size(); a++) { boss_face_dir_data.dir_num = 0; double temp_dir1[3]; getFaceDir(boss_faces[a], temp_dir1); int is_eq = 0; for (int b = 0; b < boss_faces_dirs.size(); b++) { double temp_dir2[3]; temp_dir2[0] = boss_faces_dirs[b].X; temp_dir2[1] = boss_faces_dirs[b].Y; temp_dir2[2] = boss_faces_dirs[b].Z; UF_VEC3_is_equal(temp_dir1, temp_dir2, 0.001, &is_eq); if (is_eq) { boss_face_dir_data.dir_num = b + 1; } } UF_VEC3_copy(temp_dir1, boss_face_dir_data.face_dir); boss_face_dir_data_vec.push_back(boss_face_dir_data); continue; if (boss_face_dir_data.dir_num > 20) { break; } } 用C++11以下版本改进这段代码 ,并对逻辑方法进行改进
时间: 2024-04-17 07:26:27 浏览: 89
要将上述代码改进为适用于 C++11 以下版本的代码,并对逻辑方法进行改进,可以按照以下方式进行修改:
```cpp
#include <iostream>
#include <vector>
struct Vector3d {
double X;
double Y;
double Z;
};
struct BossFacesDirData {
int dir_num;
Vector3d face_dir;
};
bool isEqual(const Vector3d& dir1, const Vector3d& dir2, double epsilon = 0.001) {
return (std::abs(dir1.X - dir2.X) < epsilon &&
std::abs(dir1.Y - dir2.Y) < epsilon &&
std::abs(dir1.Z - dir2.Z) < epsilon);
}
int main() {
std::vector<BossFacesDirData> boss_face_dir_data_vec;
for (int a = 0; a < boss_faces.size(); a++) {
BossFacesDirData boss_face_dir_data;
boss_face_dir_data.dir_num = 0;
double temp_dir1[3];
getFaceDir(boss_faces[a], temp_dir1);
for (int b = 0; b < boss_faces_dirs.size(); b++) {
double temp_dir2[3];
temp_dir2[0] = boss_faces_dirs[b].X;
temp_dir2[1] = boss_faces_dirs[b].Y;
temp_dir2[2] = boss_faces_dirs[b].Z;
if (isEqual(temp_dir1, temp_dir2, 0.001)) {
boss_face_dir_data.dir_num = b + 1;
break;
}
}
boss_face_dir_data.face_dir.X = temp_dir1[0];
boss_face_dir_data.face_dir.Y = temp_dir1[1];
boss_face_dir_data.face_dir.Z = temp_dir1[2];
boss_face_dir_data_vec.push_back(boss_face_dir_data);
if (boss_face_dir_data.dir_num > 20) {
break;
}
}
// 输出分组结果
for (const auto& data : boss_face_dir_data_vec) {
std::cout << "Dir Num: " << data.dir_num << ", Face Dir: " << data.face_dir.X << ", "
<< data.face_dir.Y << ", " << data.face_dir.Z << std::endl;
}
return 0;
}
```
上述代码中,我对 `isEqual` 函数进行了改进,允许指定比较的精度。在主函数中,我将 `boss_face_dir_data_vec` 的初始化移到了循环外部,并直接使用索引进行赋值。同时,我将 `isEqual` 函数的调用放入了循环内部的条件判断中,避免了不必要的迭代。
请注意,上述代码中的改进仅基于语言版本的限制和对逻辑方法的理解。你需要根据实际需求进行进一步的调整和修改。另外,确保 `Vector3d` 类型和 `getFaceDir` 函数在 C++11 以下版本中都能正常工作。
阅读全文