The area of ​​the nearest boxes

This question is similar to my previously asked this question . But instead of returning only the number of nearest boxes, I would like to find the area of ​​the corresponding fields.

Details: Suppose I have a set of coordinates for such blocks -

#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 

Suppose these coordinates break a unit square into sub-rectangles, enter image description here

Now this code returns the value of the number of nearby fields, but it does not return the area of ​​these fields. Here is my code -

 #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; } 

He prints the results -

 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 

So, comparing the results with the image above, you can see that it returns the value of the nearest fields, but does not return the value of the corresponding areas.

Can someone help me fix this?

+6
source share
2 answers

In fact, you are not using the region in rect[x] . You do not need the additional variable area . Just do something like:

 printf("box[%d] is nearest to box[%d] and has area %f \n", (b+1), (x+1), rects[x].area); TotalArea += rects[x].area; 

Also, from the masad comment, you are not assigning area in the constructor. You need to add a line:

 area = Area; 
+2
source

Instead of printing area you should print rects[x].area .

A few other things that can become problems:

  • You are testing equality on double s. This is not a good idea, because rounding errors can always occur. It is better to do equality checks by checking if two numbers are within the tolerance of each other.
  • You define the bounding box of the rectangles and the area. Since you have four significant numbers in each, one of these definitions already has a significant rounding error. For some applications, instead you want to calculate the area from the bounding box.
+2
source

Source: https://habr.com/ru/post/951049/


All Articles