Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2008, 15:48   #1
Fruit
Пользователь
 
Регистрация: 16.01.2008
Сообщений: 21
По умолчанию коллизия

есть два Timage-объекта.. Как можно определить, пересеклись ли они?
Если выписывать все возможные варианты типа
if Image1.Left >= Image2.Left and...
это будет слишком долго и муторно. К тому же, нужно чтобы было как можно проще - это будет типа цикла от 1 до четырех
( нужно сравнить один image1 с image2[1], с image2[2], с image2[3], с image2[4]). К тому же сравнение идет в таймере с интервалом 15 мс...

Может, сумбурно выразился.. хм..
Fruit вне форума Ответить с цитированием
Старый 26.01.2008, 15:51   #2
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

> Если выписывать все возможные варианты типа
> if Image1.Left >= Image2.Left and...

а для прямоугольных объектов так и делается.
конечно ничего не делать - проще. хм.
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 26.01.2008, 15:56   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Интересно... Я бы сделал проверки как вы и описали, незнаю что еще Вы можете придумать.
BOBAH13 вне форума Ответить с цитированием
Старый 26.01.2008, 17:47   #4
Fruit
Пользователь
 
Регистрация: 16.01.2008
Сообщений: 21
По умолчанию

хм.. я думал, может есть какой-то лучше способ
где-то слышал, про PivotPoint - опорные точки.. Только принцип проверки не могу сформулировать..
Fruit вне форума Ответить с цитированием
Старый 26.01.2008, 19:00   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

В Windows API для этого есть специальные функции, например IntersectRect. В сумме с GetWindowRect или GetClientRect я полагаю они дадут то, что нужно..
B_N вне форума Ответить с цитированием
Старый 27.01.2008, 01:33   #6
Fruit
Пользователь
 
Регистрация: 16.01.2008
Сообщений: 21
По умолчанию

Спасибо ) Сейчас попробую разобраться, что за функции такие )
Fruit вне форума Ответить с цитированием
Старый 27.01.2008, 11:07   #7
Fruit
Пользователь
 
Регистрация: 16.01.2008
Сообщений: 21
По умолчанию

код:
var
lpRect: TRect;
res, RectGrreen, RectBlue: TRect;
collis: boolean;

...

for i:=1 to 4 do
begin
GetWindowRect(osnova.Handle,lpRect) ;
GetClientRect();
RectGrreen:=imgGreen.ClientRect;
RectBlue:=imgBlue[i].ClientRect;
collis:= IntersectRect(res,RectGrreen,RectBl ue);
if collis = false Then
begin
Collision:=true;
exit;
end
else Collision:=false;
end;

И все равно не получается... в свое оправдание скажу, что с WinAPI работаю второй раз в жизни

Последний раз редактировалось Fruit; 27.01.2008 в 11:10.
Fruit вне форума Ответить с цитированием
Старый 27.01.2008, 11:20   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Ну а зачем Вы все в кучу-то?

Если Вы уже берете прямоугольники как делфьийские property, то зачем в начале кода зовете GetClientRect и GetWindowRect? Я их написал, чтобы Вы выбрали, кто из них нужен. Кстати, может быть в TRect есть метод IntersectRect, негде глянуть. И еще, API не в курсе, что существуют такие штуки, как TRect, туда надо передавать адрес стандартного апишного RECT, иначе в зависимости от внутреннего устройства TRect, все будет непредсказуемо.
B_N вне форума Ответить с цитированием
Старый 27.01.2008, 11:54   #9
Fruit
Пользователь
 
Регистрация: 16.01.2008
Сообщений: 21
По умолчанию

"Кстати, может быть в TRect есть метод IntersectRect, негде глянуть"
не... нету. ) По крайней мере я не нашел..

хмм.. не понял...
я создаю переменную Trect, присваиваю ей этот imgGreen.ClientRect к примеру, передаю эту запись в APIшную функцию... в перем. res по идее, они должны показать 0 или что-нить др.? В смысле - 0 - не пересекаются....
Fruit вне форума Ответить с цитированием
Старый 27.01.2008, 12:07   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

IntersectRect ожидает указатель на RECT
Код:
typedef struct tagRECT
{
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
}RECT;
Я не знаю, соответствует ли TRect в дельфи такому объявлению, потому так и пишу, всегда стоит перестраховаться . Кстати, а что в Дельфи TRect.Intersect такое?
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц