Как определить все линейные сегменты из списка точек, сгенерированных от жеста мыши?

В настоящее время я интернирую в компании-разработчике программного обеспечения, и одна из моих задач состояла в том, чтобы реализовать распознавание жестов мыши. Один из старших разработчиков помог мне начать и предоставленный код, который использует Устройство распознавания Unistroke за 1$ http://depts.washington.edu/aimgroup/proj/dollar/. Я добираюсь широким способом, что делает Устройство распознавания Unistroke за 1$ и как оно работает, но немного переполнено попыткой понять все детали внутренностей / более прекрасные детали его.

Моя проблема состоит в том, что я пытаюсь распознать жест перемещения мыши downards, затем вверх. Устройство распознавания Unistroke за 1$ решает, что жест, который я создал, был вниз жест, который является, заражают то, что это должно сделать. То, что я действительно хотел бы, чтобы это сделало, говорят, что "Я распознаю downards жест И ЗАТЕМ вверх жест".

Я не знаю, заставляет ли отсутствие понимания Устройства распознавания Unistroke за 1$ полностью меня царапать голову, но у кого-либо есть какие-либо идеи относительно того, как распознать два различных жеста от перемещения мыши вниз затем вверх?

Вот моя идея, что я думал, мог бы помочь мне, но любил бы в кого-то, кто эксперт или даже знает просто, что немного больше, чем я сообщают мне то, что Вы думаете. Любая справка или ресурсы, о которых Вы знаете, значительно ценились бы.

Как мое приложение в настоящее время работает:

Способ, которым работает мое текущее приложение, состоит в том, что я получаю точки от того, где курсор мыши - то, в то время как пользователь удерживает левую кнопку мыши. Список точек затем получает канал к устройство распознавания жеста, и это затем выкладывает то, что это думает, чтобы быть лучшей формой/жестом что cooresponds к полученным точкам.

Моя идея:

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

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

Что я думаю, возможные проблемы в моих взглядах:

  • Где я определяю конец строки и запуск отдельной строки? Если я должен был использовать идею проверить наклон группы точек и затем решил, что была отдельная строка, существующая, который не означает, что я nessecarily нашел наклон отдельной строки. Например, если бы необходимо было потянуть прямой ограниченный "L" с прямым углом и выбирать наклон точек за углом "L", то Вы видели бы, что наклон даст разумный признак, что существует отдельная существующая строка, но те точки не соответствуют запуску отдельной строки.

  • Как иметь дело с постоянно меняющимся наклоном кривой линии? Устройство распознавания жеста, что я уже использую кривые дескрипторов в способе, которым я хочу его также. Но я не хочу свой метод, который я использую, чтобы решить, что отдельные строки продолжают искать эти так называемые отдельные строки в кривой, потому что ее наклон изменяется все время, когда я выбираю группы точек. Я просто прекратил бы выбирать точки, после того как наклон изменился больше чем на X % так много раз подряд?

  • Я не использую корректный "тип" математики для определения отдельных строк. Математика не является моим самым сильным предметом, но я действительно проводил некоторое исследование. Я пытался изучить Скалярные произведения и видеть, укажет ли это на меня в некотором направлении, но я не знаю, будет ли оно. Кто-либо использовал Dot Prodcuts для того, чтобы сделать что-то вроде этого или некоторый другой метод?

Последние мысли, комментарии и спасибо:

Часть моей проблемы, которой я чувствую себя подобно, - то, что я не знаю, как к compeletly задают мой вопрос. Я не был бы удивлен, спросили ли эту проблему уже (так или иначе), и решение существуют, который может быть Погуглен. Но мои результаты поиска на Google не предоставляли решений, поскольку я просто не знаю точно, как задать мой вопрос все же. Если Вы чувствуете, что это путает сообщенный мне, где и почему и я помогу разъяснить его. При этом, возможно, мои поиски на Google станут более точными, и я смогу найти решение.

Я просто хочу сказать спасибо снова за то, что прочитал мое сообщение. Я знаю его длинное, но действительно не знал, где еще спросить это. Imma говорят с некоторыми другими людьми вокруг офиса, но все мои лучшие решения, которые я использовал всюду по школе, прибыли из сообщества StackOverflow, таким образом, я должен очень благодаря Вам.

Редактирования к этому сообщению:

(7/6 16:00) Другая идея, о которой я думал, сравнивала все точки перед точкой Минуты/Макса. Например, если бы я переместил мышь downards затем вверх, то моя начальная точка была бы текущей точкой Max, в то время как точка, где я начинаю класть обратно мышь вверх, была бы моей минимальной точкой. Я мог затем идти вперед и надеяться видеть, существуют ли какие-либо точки после того, как минуты указывают и раз так говорят, что могла быть новая потенциальная строка. Я не знаю, как хорошо это будет работать над другими формами как звезды, но это - другая вещь, которую я собираюсь изучить. Кто-либо сделал что-то подобное этому прежде?

7
задан Svante 7 July 2010 в 14:53
поделиться

3 ответа

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

Сравнение наклона отрезков и определение точек разрыва, где он больше некоторого порога, будет работать в очень упрощенном случае. Представьте себе идеально сформированную L-образную форму, где между двумя прямыми линиями есть прямой угол. Очевидно, что угловая точка будет единственной, где разница наклона выше порога, пока порог находится между 0 и 90 градусами, и, таким образом, будет идентифицируемой точкой разрыва.

Однако вертикальная и горизонтальная линии могут быть слегка изогнуты, поэтому порог должен быть достаточно большим, чтобы эти небольшие различия в наклоне игнорировались как точки разрыва. Также необходимо решить, насколько острый угол алгоритм должен воспринимать как разрыв. Требуется ли угол 90 градусов или выше, или достаточно даже 30 градусов? Это важный вопрос.

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

В основном алгоритм будет следующим:

  • Для каждой исследуемой точки (начиная с N точек в последовательности и заканчивая N точками до конца)
    • Вычислите средний наклон N предыдущих отрезков.
    • Вычислите средний уклон N следующих отрезков.
    • Если разница средних больше, чем Порог, пометьте текущую точку как точку перелома.

Это не совсем то, что я думаю. Вы должны попробовать это в своем приложении.

1
ответ дан 7 December 2019 в 16:38
поделиться

если вы работаете с абсолютными углами, например, вверх и вниз, вы можете просто взять абсолютный наклон между двумя точками (не обязательно соседними), чтобы определить, является ли это ПРАВОЙ, ЛЕВОЙ, ВЕРХНЕЙ, НИЖНЕЙ (если это достаточное различие)

искусство заключается в том, чтобы найти расстояние между точками так, чтобы угол не был случайным (при 1px угол будет кратен 45°)

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

Дополнительная мысль: Если вы рисуете фигуру, соединяя последовательные точки, а затем возвращаясь к первой точке, соотношение между площадью и длиной конечного отрезка линии также является показателем "остроты" жеста

.
1
ответ дан 7 December 2019 в 16:38
поделиться

Если вас интересуют только движения вверх / вниз / влево / вправо, первое приближение - проверить 45-градусные сегменты круга. Это легко сделать, сравнив разницу по горизонтали между (последовательными) точками с разницей по вертикали между точками.

Допустим, у вас положительная разница по горизонтали больше, чем по вертикали, тогда это будет «ПРАВИЛЬНО».

Единственная трудность возникает, например, в том, чтобы отличить ВВЕРХ / ВНИЗ от ВВЕРХ / ВПРАВО / ВНИЗ. Но это можно было сделать с помощью расстояний между точками. Если вы определили, что мышь переместилась ВПРАВО, скажем, менее чем на 20 пикселей, то вы можете проигнорировать это движение.

1
ответ дан 7 December 2019 в 16:38
поделиться
Другие вопросы по тегам:

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