Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 30 мая 2023, 13:22
Выполнено за 0.03 сек.
Рейтинг@Mail.ru