Другие языки программирования и технологии

Всем доброго времени суток господа! Не поможете решить данную задачку? Буду очень признателен! Заранее спасибо! Язык с++

Напишите функцию Rectangle intersect(Rectangle r1, Rectangle r2), которая вернёт пересечение прямоугольников r1 и r2 — новый прямоугольник.
Если у прямоугольников r1 и r2 нет пересечения, то допускается в качестве результата работы функции вернуть любой неположительный по площади прямоугольник.
Используя функцию rectangle_square, описанную в предыдущей задаче, посчитайте площадь пересечения прямоугольников, вводимых с клавиатуры.
Формат входных данных
Даны координаты двух пар точек, заданных с точностью не более 2 знаков после десятичной точки. Координаты не превосходят по модулю 1000.
Последовательность чисел следующая:
- точка r1.p1: x и y
- точка r1.p2: x и y
- точка r2.p1: x и y
- точка r2.p2: x и y
Формат выходных данных
Требуется вывести одно вещественное число — площадь пересечения прямоугольников с точностью не менее 6 знаков после десятичной точки. Если прямоугольники не пересекаются, то выведите 0.
входные данные
4.0 6.0 3.0 9.0
1.0 4.0 5.0 8.0
выходные данные
2.000000
#include <iostream>
#include <algorithm>
using namespace std;
struct Coord {
double x;
double y;
Coord() : x(0), y(0) {}
Coord(double x, double y) : x(x), y(y) {}
friend istream& operator>>(istream& in, Coord& p) {
in >> p.x >> p.y;
return in;
}
};
class Rectangle {
public:
Rectangle() = default;
Rectangle(const Coord& a, const Coord& b) : a_(a), b_(b) {
normalize_();
}
double area()const {
return fabs(a_.x - b_.x) * fabs(a_.y - b_.y);
}
Rectangle intersection(const Rectangle& rect) {
auto left = max(a_.x, rect.a_.x);
auto right = min(b_.x, rect.b_.x);
auto bottom = max(a_.y, rect.a_.y);
auto top = min(b_.y, rect.b_.y);
if (right - left < 0 || top - bottom < 0) return Rectangle();
return Rectangle(Coord(left, bottom), Coord(right, top));
}
private:
Coord a_;
Coord b_;
void normalize_() {
if (a_.y > b_.y) swap(a_.y, b_.y);
else if (a_.x > b_.x) swap(a_.x, b_.x);
}
};
Coord coord() {
Coord p;
cin >> p;
return p;
}
Rectangle rectangle() {
Coord p1, p2;
p1 = coord();
p2 = coord();
return Rectangle(p1, p2);
}
int main() {
auto r1 = rectangle();
auto r2 = rectangle();
cout << r1.intersection(r2).area() << '\n';
system("pause");
}
GE
Gosha Emelin
96 334
Лучший ответ
Предположим во всех прямоугольниках, p1 - левый нижний угол, а p2 - верхний правый.
Тогда пересечение r3 прямоугольников r1 и r2:

r3.p1.x = max(r1.p1.x, r2.p1.x);
r3.p1.y = max(r1.p1.y, r2.p1.y);
r3.p2.x = min(r1.p2.x, r2.p2.x);
r3.p2.y = min(r1.p2.y, r2.p2.y);
if (r3.p1.x > r3.p2.x || r3.p1.y > r3.p2.y) { // пересечения не существует
r3.p2.x = r3.p1.y;
r3.p2.y = r3.p1.y;
}

Если порядок точек p1, p2 в каждом прямоугольнике произволен, то:

r3.p1.x = max(min(r1.p1.x, r1.p2.x), min(r2.p1.x, r2.p2.x));
r3.p1.y = max(min(r1.p1.y, r1.p2.y), min(r2.p1.y, r2.p2.y));
r3.p2.x = min(max(r1.p1.x, r1.p2.x), max(r2.p1.x, r2.p2.x));
r3.p2.y = min(max(r1.p1.y, r1.p2.y), max(r2.p1.y, r2.p2.y));

Последующий if никак не меняется

Сама площадь вычисляется элементарно:

s = (r3.p2.x - r3.p1.x) * (r3.p2.y - r3.p1.y);
Саша Меркулов Спасибо вам за помощь!
Сейчас попробую. Сделает кто быстрее - хорощо
Виктор Бурый
Виктор Бурый
21 700
Саша Меркулов Здравствуйте еще раз! Не хочу показаться навязчивым, но смогли ли вы решить данную задачу?

Похожие вопросы