В зависимости от количества точек выборки, которые вы просматриваете, я бы порекомендовал два подхода:
Простая интерполяция
Вы можете просто сэмплировать местоположение пальца с заданными интервалами, а затем интерполировать точки выборки, используя что-то вроде Catmull-Rom сплайн. Это проще, чем кажется, поскольку вы легко можете преобразовать сплайн Катмулла-Рома в серию кубических кривых Безье.
Вот как. Допустим, у вас есть четыре последовательные точки выборки P0
, P1
, P2
и P3
, кубическая кривая Безье, которая соединяет P1
с P2
, определяется следующими контрольными точками:
B0 = P1
B1 = P1 + (P2 - P0)/6
B3 = P2 + (P1 - P3)/6
B4 = P2
Это должно работать хорошо, если ваши точки выборки не слишком плотные и это очень просто. Единственная проблема может быть в начале и конце ваших выборок, так как первая и последняя точки выборки не интерполируются в открытой кривой. Один из распространенных обходных путей - удвоение первой и последней точек выборки, чтобы у вас было достаточно точек, чтобы кривая прошла через каждый из исходных выборок.
Чтобы получить представление о том, как выглядят кривые Catmull-Rom, вы можете попробовать этот Java-апплет, демонстрирующий сплайны Catmull-Rom .
Подгонка кривой к вашим образцам
Более продвинутый (и более сложный) подход заключается в приближении наименьших квадратов к точкам выборки. Если вы хотите попробовать это, процедура выглядит примерно так:
- Сбор точек выборки
- Определение кривой NURBS (включая ее вектор узлов)
- Настройка системы линейных уравнений для образцов и кривой
- Решите систему в смысле наименьших квадратов
Предполагая, что вы можете выбрать разумный вектор узла NURBS, это даст вам кривую NURBS, которая близко приближает ваши точки выборки, сводя к минимуму квадратное расстояние между выборками и вашей кривой. При необходимости кривая NURBS может быть разложена на серию кривых Безье.
Если вы решите исследовать этот подход, то книга "Кривые и поверхности для CAGD" Джеральда Фарина , или аналогичная ссылка, будет очень полезной. В 5-м издании книги Фарина раздел 9.2 посвящен именно этой проблеме. В разделе 7.8 показано, как сделать это с помощью кривой Безье, но вам, вероятно, понадобится кривая высокой степени, чтобы получить хорошее соответствие.