TRect overlapping
От: _Student_ Россия http://www.totalprogramming.narod.ru/
Дата: 24.04.05 18:46
Оценка:
Здравствуйте всем....

Кто-нибудь когда-нибудь сталкивался с задачей определения перекрытия двух прямоугольников???

Поясняю: есть два объекта TRect. Нужно определить, перекрывает ли один из них второй. Перекрытие может быть каким угодно: полностью, пересечение, "легкое" наложение (т.е. перекрытие нпример только одним углом). Подскажите, как это проверить, выводить уками какие-то формулы очень не хочется, надеюсь, есть какой-то более короткий путь....

Заранее благодарен за любые ответы....
Я не волшебник, я только учусь...
Re: TRect overlapping
От: llirik  
Дата: 24.04.05 19:20
Оценка:
Здравствуйте, _Student_, Вы писали:

_S_>Здравствуйте всем....


_S_>Кто-нибудь когда-нибудь сталкивался с задачей определения перекрытия двух прямоугольников???


_S_>Поясняю: есть два объекта TRect. Нужно определить, перекрывает ли один из них второй. Перекрытие может быть каким угодно: полностью, пересечение, "легкое" наложение (т.е. перекрытие нпример только одним углом). Подскажите, как это проверить, выводить уками какие-то формулы очень не хочется, надеюсь, есть какой-то более короткий путь....


_S_>Заранее благодарен за любые ответы....



function IntersectRect(out Rect: TRect; const R1, R2: TRect): Boolean;
begin
  Rect := R1;
  if R2.Left > R1.Left then Rect.Left := R2.Left;
  if R2.Top > R1.Top then Rect.Top := R2.Top;
  if R2.Right < R1.Right then Rect.Right := R2.Right;
  if R2.Bottom < R1.Bottom then Rect.Bottom := R2.Bottom;
  Result := not IsRectEmpty(Rect);
  if not Result then FillChar(Rect, SizeOf(Rect), 0);
end;


(с) Borland Software Corporation
unit Types
в Rect результат пересечения

если одним углом ... ну думаю, если Rect получился нулевой, то проверить на касание углами будет просто
... << RSDN@Home 1.1.4 beta 6 rev. 435>>
Re[2]: TRect overlapping
От: _Student_ Россия http://www.totalprogramming.narod.ru/
Дата: 24.04.05 19:22
Оценка:
Здравствуйте, llirik, Вы писали:

L>Здравствуйте, _Student_, Вы писали:


_S_>>Здравствуйте всем....


_S_>>Кто-нибудь когда-нибудь сталкивался с задачей определения перекрытия двух прямоугольников???


_S_>>Поясняю: есть два объекта TRect. Нужно определить, перекрывает ли один из них второй. Перекрытие может быть каким угодно: полностью, пересечение, "легкое" наложение (т.е. перекрытие нпример только одним углом). Подскажите, как это проверить, выводить уками какие-то формулы очень не хочется, надеюсь, есть какой-то более короткий путь....


_S_>>Заранее благодарен за любые ответы....



L>
L>function IntersectRect(out Rect: TRect; const R1, R2: TRect): Boolean;
L>begin
L>  Rect := R1;
L>  if R2.Left > R1.Left then Rect.Left := R2.Left;
L>  if R2.Top > R1.Top then Rect.Top := R2.Top;
L>  if R2.Right < R1.Right then Rect.Right := R2.Right;
L>  if R2.Bottom < R1.Bottom then Rect.Bottom := R2.Bottom;
L>  Result := not IsRectEmpty(Rect);
L>  if not Result then FillChar(Rect, SizeOf(Rect), 0);
L>end;
L>


L>(с) Borland Software Corporation

L>unit Types
L>в Rect результат пересечения

L>если одним углом ... ну думаю, если Rect получился нулевой, то проверить на касание углами будет просто


Большое списибо. Но я очень мало общаюсь с паскалем, в основном работаю на C++ Builder. Не могли бы вы показать этот же код на C++? Был бы очень благодарен...
Я не волшебник, я только учусь...
Re[2]: TRect overlapping
От: _Student_ Россия http://www.totalprogramming.narod.ru/
Дата: 24.04.05 19:26
Оценка:
Здравствуйте, llirik, Вы писали:

L>Здравствуйте, _Student_, Вы писали:


_S_>>Здравствуйте всем....


_S_>>Кто-нибудь когда-нибудь сталкивался с задачей определения перекрытия двух прямоугольников???


_S_>>Поясняю: есть два объекта TRect. Нужно определить, перекрывает ли один из них второй. Перекрытие может быть каким угодно: полностью, пересечение, "легкое" наложение (т.е. перекрытие нпример только одним углом). Подскажите, как это проверить, выводить уками какие-то формулы очень не хочется, надеюсь, есть какой-то более короткий путь....


_S_>>Заранее благодарен за любые ответы....



L>
L>function IntersectRect(out Rect: TRect; const R1, R2: TRect): Boolean;
L>begin
L>  Rect := R1;
L>  if R2.Left > R1.Left then Rect.Left := R2.Left;
L>  if R2.Top > R1.Top then Rect.Top := R2.Top;
L>  if R2.Right < R1.Right then Rect.Right := R2.Right;
L>  if R2.Bottom < R1.Bottom then Rect.Bottom := R2.Bottom;
L>  Result := not IsRectEmpty(Rect);
L>  if not Result then FillChar(Rect, SizeOf(Rect), 0);
L>end;
L>


L>(с) Borland Software Corporation

L>unit Types
L>в Rect результат пересечения

L>если одним углом ... ну думаю, если Rect получился нулевой, то проверить на касание углами будет просто


Все, большое спасибо... Сразу не сообразил, что это стандартная функция... поздно уже...
Я не волшебник, я только учусь...
Re[2]: TRect overlapping
От: Softwarer http://softwarer.ru
Дата: 25.04.05 08:43
Оценка:
Здравствуйте, llirik, Вы писали:

L>(с) Borland Software Corporation


Хм. Я противник "написания кода за студентов", но раз уж есть — стоит отметить, что Borland решает более общую задачу, а для ответа на вопрос "пересекаются ли", достаточно одного логического выражения с четырьмя операциями сравнения.
Re[3]: TRect overlapping
От: llirik  
Дата: 25.04.05 19:08
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, llirik, Вы писали:


L>>(с) Borland Software Corporation


S>Хм. Я противник "написания кода за студентов", но раз уж есть — стоит отметить, что Borland решает более общую задачу, а для ответа на вопрос "пересекаются ли", достаточно одного логического выражения с четырьмя операциями сравнения.


это конечно, эти самые сравнения как раз и есть в той функции, требуемые формулы показаны
... << RSDN@Home 1.1.4 beta 6 rev. 435>>
Re: TRect overlapping
От: Spaider Верблюд  
Дата: 27.04.05 07:55
Оценка:
Здравствуйте, _Student_, Вы писали:

_S_>Заранее благодарен за любые ответы....


IntersectRect
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
--
К вашим услугам,
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.