Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.19;
Скачать: [xml.tar.bz2];

Вниз

Пересечение двух прямоугольников   Найти похожие ветки 

 
cyber-pilot   (2009-05-19 13:00) [0]

Есть два прямоугольника, нужно определить пересекаются ли они, если пересекаются, то определить координаты прямоугольника являющегося пересечением. Можно ли при решении задачи обойтись без анализа всех вариантов расположения прамоугольников. Если можно, то какой будет алгоритм?


 
KilkennyCat ©   (2009-05-19 13:07) [1]


> без анализа всех вариантов

вариантов бесконечно. А вот учебник геометрии напротив.


 
DVM ©   (2009-05-19 13:08) [2]

Если прямоугольники заданы двумя точками, как обычно, то:


function RectIntersection(const R1, R2: TRect): TRect;
begin
 with Result do
 begin
   if R1.Left > R2.Left then
     Left := R1.Left
   else
     Left := R2.Left;

   if R1.Top > R2.Top then
     Top := R1.Top
   else
     Top := R2.Top;

   if R1.Right < R2.Right then
     Right := R1.Right
   else
     Right := R2.Right;

   if R1.Bottom < R2.Bottom then
     Bottom := R1.Bottom
   else
     Bottom := R2.Bottom;

 end;
 if not RectIsValid(Result) then
   Result := NullRect;
end;

function RectIsNull(const R: TRect): Boolean;
begin
 with R do
   Result := (Left = 0) and (Right = 0) and (Top = 0) and (Bottom = 0);
end;

function RectIntersectRect(const R1, R2: TRect): Boolean;
begin
 Result := not RectIsNull(RectIntersection(R1, R2));
end;



 
Ega23 ©   (2009-05-19 13:11) [3]


> то определить координаты прямоугольника являющегося пересечением.


Это всего лишь частный случай. А в целом - от точки до восьмиугольника (неправильного).


 
palva ©   (2009-05-19 13:14) [4]


> Если прямоугольники заданы двумя точками, как обычно,

Обычно прямоугольники задаются четырьмя точками. То что стороны параллельны координатным осям автор не предполагает, насколько я понял. Наверно, он предполагает, что прямоугольники располагаются в одной и той же плоскости, но это я тоже не уверен.


 
Eraser ©   (2009-05-19 13:24) [5]

> [0] cyber-pilot   (19.05.09 13:00)

IntersectRect + F1


 
cyber-pilot   (2009-05-19 13:49) [6]


> palva ©   (19.05.09 13:14) [4]

Я имел в виду, что стророны прямоугольников паралельны осям координат.

Всем спасибо.


 
DVM ©   (2009-05-19 13:50) [7]


> palva ©   (19.05.09 13:14) [4]


> Обычно прямоугольники задаются четырьмя точками. То что
> стороны параллельны координатным осям автор не предполагает,
>  насколько я понял.

Тогда пересечение их будет необязательно прямоугольник, а он написал:

> то определить координаты прямоугольника являющегося пересечением.


 
palva ©   (2009-05-19 13:52) [8]


> Тогда пересечение их будет необязательно прямоугольник, а он написал:

Сдаюсь.


 
Ega23 ©   (2009-05-19 14:12) [9]


> Я имел в виду, что стророны прямоугольников паралельны осям
> координат.


Опять же, частный случай. Пересечением может быть и точка и отрезок.


 
cyber-pilot   (2009-05-19 15:02) [10]


> Опять же, частный случай. Пересечением может быть и точка
> и отрезок.


Будем считать, что точка и отрезок это вырожденный случай прямоугольника.


 
pasha_golub ©   (2009-05-19 16:52) [11]

Многа букаф


function RectIntersection(const R1, R2: TRect): TRect;
begin
with Result do
begin
    Left := Max(R1.Left, R2.Left);
    Top := Max(R1.Top, R2.Top);
    Right := Min(R1.Right, R2.Right);
    Bottom := Min(R1.Bottom, R2.Bottom);
end;
if not RectIsValid(Result) then
  Result := NullRect;
end;

function RectIsNull(const R: TRect): Boolean;
begin
with R do
  Result := (Left = 0) and (Right = 0) and (Top = 0) and (Bottom = 0);
end;

function RectIntersectRect(const R1, R2: TRect): Boolean;
begin
Result := not RectIsNull(RectIntersection(R1, R2));
end;



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.07.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
15-1242334996
Германн
2009-05-15 01:03
2009.07.19
Registered Jack


4-1212759590
Юрий123
2008-06-06 17:39
2009.07.19
настроить tcp/ip


2-1243310305
Алексей Иванов
2009-05-26 07:58
2009.07.19
TTreeView + event


15-1242483476
@!!ex
2009-05-16 18:17
2009.07.19
Как сделать Shared секцию в dll на дельфи?


15-1242723217
lincal
2009-05-19 12:53
2009.07.19
InstallShield Installation Information





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский