Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Disa от Сентябрь 02, 2012, 23:54



Название: Детектор перемещения
Отправлено: Disa от Сентябрь 02, 2012, 23:54
Доброй ночи.

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

В какую сторону копать? Нейросети? Метод опорных векторов? или еще чего. В общем буду благодарен за любую информацию по сабжу. На сам алгоритм, конечно, не рассчитываю :)


Название: Re: Детектор перемещения
Отправлено: Akon от Сентябрь 03, 2012, 07:21
К сожалению, ничем конкретным помочь не могу, но это, полагаю, относительно простая задача - нужно отслеживать последние несколько точек траектории и производить ее дальнейшее предсказание, т.е. выполнять экстраполяцию с учетом скорости движения и инерционности объекта. Посмотрите кinetic scrolling.


Название: Re: Детектор перемещения
Отправлено: Igors от Сентябрь 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;
}
 


Название: Re: Детектор перемещения
Отправлено: Disa от Сентябрь 04, 2012, 09:29
А да, спасибо заработало вроде :)

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

Про время до края получилось, только пришлось еще добавлять "весовую" переменную, чтобы брать данные с нескольких кадров.