2013-08-05 4 views
6

Этот вопрос похож на предыдущий вопрос this question. Но вместо того, чтобы возвращать только количество ближайших ящиков, я бы хотел найти область соответствующих полей.Площадь ближайших коробок

Детали: Предположим, у меня есть набор координат коробки, как this-

#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 

Так, сравнивая результаты с фотографией выше, вы можете увидеть, что она возвращает значение ближайших коробков, но не возвращается значение их соответствующих областей.

Может ли кто-нибудь помочь мне исправить это?

+3

Причина, по которой области не отображаются, заключается в том, что вы их не назначаете. Единственное задание, которое я вижу, это 'double area = 0;'. – Geobits

+0

Вы создаете двойную переменную, называемую 'area', вы инициализируете ее до нуля, вы никогда ее не используете, пока не появится строка, в которой вы ее распечатываете. Что вы ожидаете увидеть? –

+0

@Geobits: Спасибо за ответ! Как я могу получить значения области из * Rect * ?? – aries0152

ответ

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; 
+0

Отредактировал мой код. Но он все еще печатает область = 0.000. – aries0152

+0

Вы изменили '= +' на '+ ='? – Geobits

+0

Да, но я забыл изменить его здесь. Как для соответствующей области, так и для общей площади она показывает значение 0.0000 – aries0152

2

Вместо печати area вы должны печатать rects[x].area.

Несколько других вещей, которые могут стать вопросы:

  • Вы тестирующих равенство на double с. Это не очень хорошая идея, потому что ошибки округления всегда могут появляться. Лучше делать проверки на равенство, проверяя, находятся ли эти два числа в пределах допуска друг к другу.
  • Вы определяете ограничивающий прямоугольник прямоугольников и площадь. Поскольку у вас есть четыре значимых цифры в каждом, одно из этих определений уже имеет существенную ошибку округления. Для некоторых приложений вместо этого вы хотите вычислить область из ограничивающей рамки.
+0

изменить область на прямые [x] .area. Но все же печатает только 0,0000 в результатах !!! – aries0152

Смежные вопросы