Russian Qt Forum
Ноябрь 23, 2024, 01:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Детектор перемещения  (Прочитано 3416 раз)
Disa
Гость
« : Сентябрь 02, 2012, 23:54 »

Доброй ночи.

С задачей не сталкивался и даже не очень знаю куда капать, поэтому приветствуется любая информация касательно сабжа.
В общем есть градиент перемещения объекта (окружность с радиусом + направление движения). Нужно понять когда объект собирается покинуть экран и когда он в него вошел (ну и соответственно с какого края экрана (лево-право, верх-низ)).

В какую сторону копать? Нейросети? Метод опорных векторов? или еще чего. В общем буду благодарен за любую информацию по сабжу. На сам алгоритм, конечно, не рассчитываю Улыбающийся
Записан
Akon
Гость
« Ответ #1 : Сентябрь 03, 2012, 07:21 »

К сожалению, ничем конкретным помочь не могу, но это, полагаю, относительно простая задача - нужно отслеживать последние несколько точек траектории и производить ее дальнейшее предсказание, т.е. выполнять экстраполяцию с учетом скорости движения и инерционности объекта. Посмотрите кinetic scrolling.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 03, 2012, 08:42 »

В общем есть градиент перемещения объекта (окружность с радиусом + направление движения). Нужно понять когда объект собирается покинуть экран и когда он в него вошел (ну и соответственно с какого края экрана (лево-право, верх-низ)).

В какую сторону копать? Нейросети? Метод опорных векторов? или еще чего. В общем буду благодарен за любую информацию по сабжу. На сам алгоритм, конечно, не рассчитываю Улыбающийся
Я бы обратился к школьной формуле S = v * t, поскольку никаких др данных Вы не упомянули. Вот набросок
Код
C++ (Qt)
enum {
side_left = 0,
side_top = 1,
side_right = 2,
side_bоttom = 3
};
 
int GetIntersTime( const QPointF & pos, const QVector2D & velocity, // точка и скорость
                        const QRect & bounds, // экран
                        float * timeInters )   // время до пересечения
{
// время пересечений
qreal timeI[4];
timeI[side_left] = (bounds.left() - pos.x()) / CheckZero(velocity.x());
timeI[side_top] = (bounds.top() - pos.y()) / CheckZero(velocity.y());
timeI[side_right] = (bounds.right() - pos.x()) / CheckZero(velocity.x());
timeI[side_bottom] = (bounds.bottom() - pos.y()) / CheckZero(velocity.y());
 
// выбираем наименьшее положительное время
int minT = 0;
*timeInters  = -1.0;
for (int i = 0; i < 4; ++i) {
 if (timeI[i] < 0.0) continue;
 if (*timeInters < 0.0 || *timeInters > timeI[i]) {
   *timeInters = timeI[i];
   minT = i;
 }
}
 
// возвращаем индекс стороны пересечения
return minT;
}
 
« Последнее редактирование: Сентябрь 03, 2012, 08:47 от Igors » Записан
Disa
Гость
« Ответ #3 : Сентябрь 04, 2012, 09:29 »

А да, спасибо заработало вроде Улыбающийся

Посмотрел кinetic scrolling - не совсем понял, там же просто разница в движении мыши с обратным знаком, разве нет?

Про время до края получилось, только пришлось еще добавлять "весовую" переменную, чтобы брать данные с нескольких кадров.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.159 секунд. Запросов: 23.