最近的盒子的面积

时间:2013-08-05 16:48:51

标签: c++ algorithm

此问题类似于我之前提到的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

假设这些坐标将单位正方形划分为像这张图片一样的子矩形 - enter image description here

现在,此代码返回最近框的数量值,但无法返回该框的区域。这是我的代码 -

#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 

因此,通过将结果与上图进行比较,您可以看到它返回最近框的值,但无法返回其相应区域的值。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 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上测试相等性。这不是一个好主意,因为舍入错误总是可以进入。最好通过测试两个数字是否在彼此的容差范围内来检查相等性。
  • 您可以定义矩形区域的边界框。由于每个中都有四个有效数字,因此其中一个定义已经存在很大的舍入误差。对于某些应用程序,您将需要从边界框计算区域。