Кто-нибудь когда-нибудь сталкивался с задачей определения перекрытия двух прямоугольников???
Поясняю: есть два объекта TRect. Нужно определить, перекрывает ли один из них второй. Перекрытие может быть каким угодно: полностью, пересечение, "легкое" наложение (т.е. перекрытие нпример только одним углом). Подскажите, как это проверить, выводить уками какие-то формулы очень не хочется, надеюсь, есть какой-то более короткий путь....
Здравствуйте, _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 получился нулевой, то проверить на касание углами будет просто
Здравствуйте, 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++? Был бы очень благодарен...
Здравствуйте, 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 получился нулевой, то проверить на касание углами будет просто
Все, большое спасибо... Сразу не сообразил, что это стандартная функция... поздно уже...
Здравствуйте, llirik, Вы писали:
L>(с) Borland Software Corporation
Хм. Я противник "написания кода за студентов", но раз уж есть — стоит отметить, что Borland решает более общую задачу, а для ответа на вопрос "пересекаются ли", достаточно одного логического выражения с четырьмя операциями сравнения.
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, llirik, Вы писали:
L>>(с) Borland Software Corporation
S>Хм. Я противник "написания кода за студентов", но раз уж есть — стоит отметить, что Borland решает более общую задачу, а для ответа на вопрос "пересекаются ли", достаточно одного логического выражения с четырьмя операциями сравнения.
это конечно, эти самые сравнения как раз и есть в той функции, требуемые формулы показаны