Простое круговое обнаружение жеста

Я смотрю на простой, программный способ обнаружить, потянул ли пользователь круговую форму. Я работаю в C, но рад работать от псевдокода. Немного Гугления поднимает много (надо надеяться), чрезмерно сложных методов.

Я отслеживаю координаты мыши как плавания и создал массив векторов для отслеживания движения мыши со временем. По существу я надеюсь обнаруживать, когда круг был нарисован и затем disgard все данные перемещения, не связанные с тем кругом.

Я имею общее представление о том, как это могло бы быть выполнено:

Отследите все перемещения с помощью функции опроса. Каждый раз, когда функция опрашивается, текущее положение мыши хранится. Здесь, мы циклично выполняемся через исторические данные положения и делаем грубую 'защелку к позиции' для сравнения этих двух мест. Если новое местоположение на достаточно близком расстоянии до старого положения, мы удаляем все исторические данные перед старым местоположением.

В то время как это работает в теории, это - путаница на практике. У кого-либо есть какие-либо предложения? Бонусные очки, если предложенный метод может обнаружить, был ли он оттянут по часовой стрелке или против часовой стрелки.

15
задан jschmier 6 March 2010 в 18:31
поделиться

2 ответа

На основе вашей функции отслеживания / опроса, которая помещает пары с плавающей запятой в стек. Это необходимо делать через регулярные интервалы времени.

  1. Выполните поиск двух одинаковых записей в списке на основе пороговых значений. Теперь у вас в стеке два индекса; первая и вторая равные записи. Считайте это линией.
  2. Получите абсолютную разницу в показателях. Затем разделите на два и получите координаты этой точки. (Центр линии.)
  3. У вас есть две точки: таким образом, вы можете получить радиус круга, разделив расстояние между двумя точками на два.
  4. Разделите число шагов 2 на 2, теперь у вас есть четвертинки.

    Если линия на шаге 1 вертикальна, а первая точка линии находится вверху: если первая четверть находится слева от центральной точки, круг был нарисован против часовой стрелки. Если первая четверть находится справа от центральной точки, круг нарисован по часовой стрелке. Если первая точка строки находится внизу, переверните (т.е. ccw => cw и cw => ccw)

    Если линия на шаге 1 горизонтальна, а первая точка списка находится слева: Если первая четверть находится выше центральной точки, круг нарисован против часовой стрелки. Если первая четверть находится ниже центральной точки, круг нарисован по часовой стрелке. Если первая точка линии находится справа, поменяйте местами.

  5. Убедитесь, что это круг: переберите все пары координат и вычислите расстояние до центральной точки. Настройте порог допустимых расстояний от расчетного расстояния до фактического расстояния до центральной точки.

На шагах 2 и 4 вы можете дополнительно настроить этот алгоритм, взяв среднее значение нескольких индексов, если временной интервал очень мал (быстрый опрос). Например: в массиве 30 пар, затем вы усредняете пары в 0, 1 и 28, 29, чтобы получить верхнюю точку. Сделайте то же самое для всех остальных точек.

Надеюсь, это достаточно просто.

6
ответ дан 1 December 2019 в 04:47
поделиться

Не пробовал, но идея пришла в голову, прочитав ваш вопрос, так что могу с тем же успехом поделиться им с вами:

Я предполагаю, что круг нужно нарисовать за разумное время, учитывая устойчивая «частота дискретизации» мыши, которая оставит массив двумерных векторов (точек) известного размера. Сложите их все и разделите на количество 2D-векторов, чтобы получить оценку «центральной» точки в массиве. Затем сформируйте векторы от этой центральной точки к точкам в массиве и выполните скалярные произведения (нормализуя по длине вектора), убедившись, что знак скалярных произведений остается идентичным для диапазона точек, что означает, что все эти точки перемещаются в одном направлении. направление, положительный знак будет указывать на движение против часовой стрелки, отрицательный - как раз наоборот. Если накопленный угол превышает 2 PI, было нарисовано круговое движение ..

Удачи.

0
ответ дан 1 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: