for(unsigned long i = 0; i < polygon.points.size()-1; i++) { float x = polygon.points.at(i + 1).x - polygon.points.at(i).x; float y = polygon.points.at(i + 1).y - polygon.points.at(i).y; QPoint axis(-y, x); std::pair<float, float> projPoy = GetProjectionRange(polygon.points, axis); std::pair<float, float> projRec = GetProjectionRange(rect.points, axis); if(projPoy.second < projRec.first || projRec.second < projRec.second) { return true; } } for(unsigned long i = 0; i < rect.points.size() -1; i++) { float x = rect.points.at(i + 1).x - rect.points.at(i).x; float y = rect.points.at(i + 1).y - rect.points.at(i).y; QPoint axis(-y, x); std::pair<float, float> projPoy = GetProjectionRange(polygon.points, axis); std::pair<float, float> projRec = GetProjectionRange(rect.points, axis); if(projPoy.second < projRec.first || projRec.second < projRec.second) { return true; } }这段代码如何优化
时间: 2024-04-15 18:24:31 浏览: 17
这段代码可以进行一些优化,主要包括以下几个方面:
1. 减少重复计算:可以将 `GetProjectionRange(polygon.points, axis)` 和 `GetProjectionRange(rect.points, axis)` 的结果存储起来,避免重复计算。
2. 循环边界优化:循环条件 `i < polygon.points.size()-1` 和 `i < rect.points.size() -1` 中的 `-1` 可以优化为比较 `i+1` 和 `i` 的方式,这样可以避免每次循环都进行 `-1` 的计算。
3. 代码复用:可以将两个循环中的重复代码提取出来,避免代码冗余。
下面是对代码进行优化的示例:
```cpp
bool isOverlap(const Polygon& polygon, const Rectangle& rect) {
auto checkOverlap = [](const std::vector<QPoint>& points, const QPoint& axis) {
std::pair<float, float> proj = GetProjectionRange(points, axis);
return proj;
};
for (unsigned long i = 0; i < polygon.points.size(); i++) {
unsigned long nextIndex = (i + 1) % polygon.points.size();
float x = polygon.points[nextIndex].x - polygon.points[i].x;
float y = polygon.points[nextIndex].y - polygon.points[i].y;
QPoint axis(-y, x);
std::pair<float, float> projPoy = checkOverlap(polygon.points, axis);
std::pair<float, float> projRec = checkOverlap(rect.points, axis);
if (projPoy.second < projRec.first || projRec.second < projRec.second) {
return true;
}
}
for (unsigned long i = 0; i < rect.points.size(); i++) {
unsigned long nextIndex = (i + 1) % rect.points.size();
float x = rect.points[nextIndex].x - rect.points[i].x;
float y = rect.points[nextIndex].y - rect.points[i].y;
QPoint axis(-y, x);
std::pair<float, float> projPoy = checkOverlap(polygon.points, axis);
std::pair<float, float> projRec = checkOverlap(rect.points, axis);
if (projPoy.second < projRec.first || projRec.second < projRec.second) {
return true;
}
}
return false;
}
```
这样优化后,代码更加简洁和高效。同时,注意将 `Polygon` 和 `Rectangle` 的定义添加到代码中,并根据实际情况进行调整。