Этот вопрос похож на предыдущий вопрос 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
Предположим, эти координаты разбить единичный квадрат в суб-прямоугольники, как этот изображе-
сейчас этот код возвращает значение количества ближайших полей, но он не возвращает область этих полей. Вот мой код-
#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
Так, сравнивая результаты с фотографией выше, вы можете увидеть, что она возвращает значение ближайших коробков, но не возвращается значение их соответствующих областей.
Может ли кто-нибудь помочь мне исправить это?
Причина, по которой области не отображаются, заключается в том, что вы их не назначаете. Единственное задание, которое я вижу, это 'double area = 0;'. – Geobits
Вы создаете двойную переменную, называемую 'area', вы инициализируете ее до нуля, вы никогда ее не используете, пока не появится строка, в которой вы ее распечатываете. Что вы ожидаете увидеть? –
@Geobits: Спасибо за ответ! Как я могу получить значения области из * Rect * ?? – aries0152