Бывает возникнет какая-нибудь простенькая задачка, наподобие заявленной в теме поста, а ты сидишь и тупишь в монитор полдня. Вот для таких случаев я, в свое время, и заводил блог — чтобы при необходимости можно было достаточно быстро найти ответ на вопрос, который ранее решался. Итак, исходные условия задачи: есть два прямоугольника со сторонами параллельными осям координат. Необходимо найти площадь пересечения этих прямоугольников, используя возможности Delphi.
Задача решается также просто, как и звучит. Графически задача выглядит следующим образом:
Нам необходимо найти площадь заштрихованной области. Для решения задачи необходимо знать координаты четырех точек:
- (X1, Y1) — координаты нижнего левого угла первого прямоугольника
- (X2, Y2) — координаты верхнего правого угла первого прямоугольника
- (X3, Y3) — координаты нижнего левого угла второго прямоугольника
- (X4, Y4) — координаты верхнего правого угла второго прямоугольника
Графически, условия задачи будут выглядеть так:
Вычисления будут такими (подробно):
uses Math, System.Types; function Intersection(P1, P2, P3, P4: TPointF): double; // P1 - (X1, Y1) - координаты нижнего левого угла первого прямоугольника // P2 - (X2, Y2) - координаты верхнего правого угла первого прямоугольника // P3 - (X3, Y3) - координаты нижнего левого угла второго прямоугольника // P4 - (X4, Y4) - координаты верхнего правого угла второго прямоугольника var Left, Top, Right, Bottom: double; Width, Height: double; begin Left:=Max(P1.X,P3.X); Top:=Min(P2.Y, P4.Y); Right:=Min(P2.X, P4.X); Bottom:=Max(P1.Y, P3.Y); Width:=Right-Left; Height:=Top-Bottom; if (Width<=0) or (Height<=0) then raise Exception.Create('Прямоугольники не пересекаются'); Result:=Width*Height; end;
Если прямоугольники не пересекаются, то функция выдаст исключение «Прямоугольники не пересекаются», иначе — площадь пересечения двух прямоугольников.