此问题类似于我之前提到的this question。但是,我想找到相应方框的区域,而不是只返回最近的方框数。
详细信息: 假设我有一组像这样的框坐标 -
#Rect x1 y1 x2 y2 area
1 0.0000 0.0000 0.8147 0.1355 0.1104
2 0.8147 0.0000 1.0000 0.1355 0.0251
3 0.8147 0.1355 0.9058 0.8350 0.0637
4 0.0000 0.1355 0.1270 0.9689 0.1058
5 0.9058 0.1355 0.9134 0.2210 0.0006
6 0.9058 0.8350 1.0000 1.0000 0.0155
7 0.8147 0.8350 0.9058 1.0000 0.0150
8 0.1270 0.1355 0.6324 0.3082 0.0873
9 0.1270 0.9689 0.8147 1.0000 0.0214
10 0.0000 0.9689 0.1270 1.0000 0.0040
11 0.9134 0.1355 1.0000 0.2210 0.0074
12 0.9134 0.2210 1.0000 0.8350 0.0532
13 0.9058 0.2210 0.9134 0.8350 0.0047
14 0.6324 0.1355 0.8147 0.3082 0.0315
15 0.6324 0.3082 0.8147 0.9689 0.1205
16 0.1270 0.3082 0.6324 0.9689 0.3339
假设这些坐标将单位正方形划分为像这张图片一样的子矩形 -
现在,此代码返回最近框的数量值,但无法返回该框的区域。这是我的代码 -
#include <iostream>
#include <cstdlib>
#include <vector>
#include <stdio.h>
using namespace std;
class Rect {
public:
double x1, x2, y1, y2, area;
Rect(double X1, double Y1, double X2, double Y2, double Area) {
if (X1 < X2) {
x1 = X1; x2 = X2;
} else {
x2 = X1; x1 = X2;
}
if (Y1 < Y2) {
y1 = Y1; y2 = Y2;
} else {
y2 = Y1; y1 = Y2;
} Area =area;
}
bool NearestBox(Rect rect) {
//for x-axis
if (x1 == rect.x2 || x2 == rect.x1) {
if (y1 >= rect.y1 && y1 < rect.y2) {
return true;
}
if (y2 > rect.y1 && y2 <= rect.y2) {
return true;
}
}
// for y-axis
if (y1 == rect.y2 || y2 == rect.y1) {
if (x1 >= rect.x1 && x1 < rect.x2) {
return true;
}
if (x2 > rect.x1 && x2 <= rect.x2) {
return true;
}
}
return false;
}
};
int main() {
vector<Rect> rects;
//Rect( x1 , y1 , x2 , y2 , area)
rects.push_back(Rect(0.0000,0.0000, 0.8147,0.1355, 0.1104));
rects.push_back(Rect(0.8147,0.0000, 1.0000,0.1355, 0.0251));
rects.push_back(Rect(0.8147,0.1355, 0.9058,0.8350, 0.0637));
rects.push_back(Rect(0.0000,0.1355, 0.1270,0.9689, 0.1058 ));
rects.push_back(Rect(0.9058,0.1355, 0.9134,0.2210, 0.0006));
rects.push_back(Rect(0.9058,0.8350, 1.0000,1.0000, 0.0155));
rects.push_back(Rect(0.8147,0.8350, 0.9058,1.0000, 0.0150));
rects.push_back(Rect(0.1270,0.1355, 0.6324,0.3082, 0.0873));
rects.push_back(Rect(0.1270,0.9689, 0.8147,1.0000, 0.0214));
rects.push_back(Rect(0.0000,0.9689, 0.1270,1.0000, 0.0040));
rects.push_back(Rect(0.9134,0.1355, 1.0000,0.2210, 0.0074));
rects.push_back(Rect(0.9134,0.2210, 1.0000,0.8350, 0.0532));
rects.push_back(Rect(0.9058,0.2210, 0.9134,0.8350, 0.0047));
rects.push_back(Rect(0.6324,0.1355, 0.8147,0.3082, 0.0315));
rects.push_back(Rect(0.6324,0.3082, 0.8147,0.9689, 0.1205));
rects.push_back(Rect(0.1270,0.3082, 0.6324,0.9689, 0.3339));
int b=13;
int nearBox_count = 0;
//double area=0;
double TotalArea=0;
for (int x = 0; x < rects.size(); ++x) {
if (rects[b].NearestBox(rects[x])) {
if (x==b) {
continue; //this is our box , so do not count it.
}
nearBox_count++;
printf("box[%d] is nearest to box[%d] and has area %f \n", (b+1), (x+1), rects[x].area);
TotalArea +=rects[x].area;
}
}
printf("Total number of nearest box for box[%d] = %d, and the sum of area is= %f \n", (b+1), nearBox_count, TotalArea );
return 0;
}
打印结果 -
box[14] is nearest to box[1] and has area 0.000000
box[14] is nearest to box[3] and has area 0.000000
box[14] is nearest to box[8] and has area 0.000000
box[14] is nearest to box[15] and has area 0.000000
Total number of nearest box for box[14] = 4, and the sum of area is= 0.000000
因此,通过将结果与上图进行比较,您可以看到它返回最近框的值,但无法返回其相应区域的值。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
您实际上并未使用rect[x]
中的区域。您也不需要额外的area
变量。做一些像:
printf("box[%d] is nearest to box[%d] and has area %f \n", (b+1), (x+1), rects[x].area);
TotalArea += rects[x].area;
此外,根据masad的评论,您不在构造函数中指定area
。您需要添加一行:
area = Area;
答案 1 :(得分:2)
您应该打印area
。
rects[x].area
其他一些可能成为问题的事情:
double
上测试相等性。这不是一个好主意,因为舍入错误总是可以进入。最好通过测试两个数字是否在彼此的容差范围内来检查相等性。