2013-08-05 16 views
6

Questa domanda è simile alla mia precedente richiesta this question. Ma invece di restituire solo il numero di caselle più vicine, vorrei trovare l'area delle caselle corrispondenti.Area delle caselle più vicine

Dettagli: Supponiamo che io sono un insieme di coordinate di scatole come questo-

#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 

Supponiamo che queste coordinate dividere un quadrato unitario in sotto-rettangoli come questo immagine- enter image description here

Ora questo codice restituisce il valore del numero di caselle più vicine, ma non riesce a restituire l'area di quelle caselle. Ecco il mio 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; 
} 

Esso stampa il risultati-

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 

Quindi confrontando i risultati con la foto sopra, si può vedere che restituisce il valore delle caselle più vicine, ma non riesce a tornare il valore delle loro aree corrispondenti.

Qualcuno può aiutarmi a risolverlo?

+3

Il motivo per cui le aree non vengono visualizzate è perché non le si assegna. L'unico compito che vedo è 'double area = 0;'. – Geobits

+0

Si crea una doppia variabile chiamata 'area', la si inizializza a zero, non si usa mai più una volta finché non viene stampata una linea. Cosa ti aspetti di vedere? –

+0

@Geobits: Grazie per la risposta! Come posso recuperare i valori dell'area da * Rect * ?? – aries0152

risposta

2

Attualmente non si sta utilizzando l'area in rect[x]. Non hai nemmeno bisogno della variabile area extra. Basta fare qualcosa di simile:

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

TotalArea += rects[x].area; 

Inoltre, dal commento di Masad, non si assegna area nel costruttore. È necessario aggiungere una riga:

area = Area; 
+0

Modificato il mio codice. Ma stampa ancora l'area = 0.000. – aries0152

+0

Hai cambiato '= +' in '+ ='? – Geobits

+0

Sì, ma ho dimenticato di cambiarlo qui. Per entrambe le aree corrispondenti e l'area totale, mostra il valore 0,0000 – aries0152

2

Invece di stampare area si dovrebbe essere la stampa rects[x].area.

Un paio di altre cose che possono diventare problemi:

  • si sta testando l'uguaglianza sul double s. Questa non è una buona idea perché gli errori di arrotondamento possono sempre insinuarsi. È meglio fare controlli per l'uguaglianza verificando se i due numeri si trovano entro una tolleranza reciproca.
  • Si definisce il rettangolo di selezione dei rettangoli e dell'area. Poiché in ognuno di essi sono presenti quattro cifre significative, una di queste definizioni presenta già un errore di arrotondamento sostanziale. Per alcune applicazioni dovrai invece calcolare l'area dal riquadro di delimitazione.
+0

cambia area per rects [x] .area. Ma stampa ancora solo 0,0000 nei risultati !!! – aries0152

Problemi correlati