|
Вопрос # 1 723/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!На Image рисуются прямоугольники( FrameRect), размеры их задаются в текстовых полях, программа обсчитывает полученные значения, а затем рисует. Прямоугольников 10 штук, у которых мы знаем координаты Left, Right, Top, Bottom. Прямоугольники могут пересекаться между собой, причем вариантов пересечения может быть много. А могут так попасть координаты, что не будет ни одного пересечения. Подскажите, как обработать эти пересечения и сказать сколько двойных пересечений, сколько тройных и т.д. Получается каждый прямоугольник надо сравнить с другими, затем, если есть пересечение его тоже с каждым из оставшихся. С помощью чего это можно реализовать. Может есть готовая функция, которая работает с наложениями и обрабатывает их?
 |
Вопрос задала: Камилла (статус: Посетитель)
Вопрос отправлен: 24 июня 2008, 19:59
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Цитата:
Может есть готовая функция, которая работает с наложениями и обрабатывает их?
Вот, набросал тебе примерчик:
// Условие попадания точки в прямоугольник
function PointInRect(const P: TPoint; const R: TRect): Boolean;
begin
Result:= (P.X >= R.Left) and (P.X <= R.Right) and
(P.Y >= R.Top) and (P.Y <= R.Bottom);
end;
// Условие пересечения двух прямоугольников
function CrossingRects(const R1, R2: TRect): Boolean;
begin
// Само условие пересечения: хотя бы одна точка одного прямоугольника
// лежит внутри или на границе второго.
Result:= PointInRect(R1.TopLeft, R2) or
PointInRect(R1.BottomRight, R2) or
PointInRect(Point(R1.Left, R1.Bottom), R2) or
PointInRect(Point(R1.Right, R1.Top), R2) or
PointInRect(R2.TopLeft, R1) or
PointInRect(R2.BottomRight, R1) or
PointInRect(Point(R2.Left, R2.Bottom), R1) or
PointInRect(Point(R2.Right, R2.Top), R1);
// Здесь также учитывается случай, когда один прямоугольник
// лежит внутри второго целиком. В данном случае это есть пересечение.
end;
Ахтунг! Функции набросал буквально на коленке, НЕ ОТЛАЖИВАЛ!
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 25 июня 2008, 08:46
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 26 июня 2008, 12:16; участников в обсуждении: 3.
|
Мережников Андрей (статус: Абитуриент), 24 июня 2008, 21:50 [#1]:
что значит двойное (тройное) пересечение? Двойное - это когда один прямоугольник пересекается с двумя другими? Любыми сторонами? Т.е. например, прямоугольник ABCD, с двумя другими должен пересечься стороной AB. Или может с одним пересечься сторонами AB, BC, а с другим сторонами CD, DA?
|
|
Вадим К (статус: Академик), 24 июня 2008, 23:43 [#2]:
В принципе у меня есть алгоритм, который может решать подобные задачи для кол-ва прямоугольников до 32. (и не обязательно прямоугольников). Вот только я не уверен, сможете ли вы его реализовать. Сложноват он достаточно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 26 июня 2008, 12:16 [#3]:
Для определения пересечения двух прямоугольников есть системная функция IntersectRect.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|