Как обнаружить движение по кругу с помощью UIGestureRecognizer
Я хочу быть в состоянии обнаружить, что чей-то палец рисует круговое движение на экране - как будто они рисуют букву "О". Это возможно с UIGestureRecognizer?
6 ответов
Мой ответ на мой вопрос:
Я использовал это: http://iphonedevelopment.blogspot.com/2009/04/detecting-circle-gesture.html
... но превратил CircleView в пользовательский UIGestureRecognizer. Все прекрасно.
Я думаю, что ответ на это зависит от вашего определения кругового движения и от того, как вы собираетесь его использовать. Например, вы хотите знать, сколько градусов по кругу прошел палец пользователя? Или вас интересует только завершение круга? Какая степень точности вам нужна? Вы хотите, чтобы движение было прервано, или это должно быть скорее касание> нарисовать круг> подправить (другими словами, одно движение)?
Один из подходов состоит в том, чтобы определить группу прямоугольных зон вдоль окружности и определить, касается ли пользователь их последовательно. Это может предоставить вам направление и грубую индикацию угла.
Другой подход заключается в сохранении точек между касанием и касанием и выполнением некоторой фильтрации и подгонки кривой, чтобы выяснить, какая форма аппроксимируется точками. Сначала фильтр нижних частот с использованием базового фильтра FIR, а затем посмотрите на dx и dy от точки к точке. Круг (в виде ряда дуг) должен попадать в определенный диапазон изменений наклона от точки к точке, в противном случае у вас есть какая-то другая форма.
Еще один подход заключается в использовании нейронной сети, чтобы взять точки и сказать вам, как выглядит форма.
Я думаю, что это может быть то, что вам нужно
Вместо этого используется распознаватель жестов, этот проект реагирует на круговые движения, отслеживающие угол UITouch
События.
Нет, он не распознает изначально круговое движение. Вы должны реализовать свой собственный метод, чтобы сделать это.
Вот как мне нужно было сделать это, используя обратные вызовы touch в моем контроллере представления, но это тоже можно сделать жестом. Обратите внимание, я пытался обнаружить несколько круговых движений (2 или более кругов по часовой стрелке или против часовой стрелки, сделанных во время события касания).
- Храните прикосновения перемещенных CGPoints в массиве.
- Создайте мин / макс прямоугольник всех точек в вашем массиве истории.
- Разделите этот мин / макс прямоугольник на 4 меньших ректа.
- Назначьте каждой исторической точке квадрант, используя CGRectContainsPoint() для каждого из 4 квадрантов
- Движение по часовой стрелке будет иметь восходящие квадранты. Движение против часовой стрелки будет иметь нисходящие квадранты.
- Проверьте соотношение ширины / высоты, если вы хотите обнаружить круги против овалов