Как я могу отслеживать движение пальца при касании для рисования гладких кривых?
как то, что я хочу, это если я быстро пошевелю пальцем на экране iphone, тогда я хочу как-то, что он сделает правильную кривую, используя кварц 2d или opengl es.
Я хочу нарисовать путь в стиле кривой......
я видел этот пример GLPaint (OpenglES), но это не поможет мне, учитывая, что ваше движение пальца быстро.....
что-то вроде плавной кривой.....
у кого-нибудь есть какой-то пример, пожалуйста, скажите мне
спасибо
Изменить: Перемещено от ответа ниже:
благодаря всем.......
но я пробовал алгоритм кривой безье с двумя контрольными точками, но проблема в том, как сначала вычислить контрольные точки, нет ли предопределенных точек....
как я упомянул, что мое движение пальца быстро...... поэтому большую часть времени я получил прямую линию вместо кривой, из-за получения меньшего количества точек касания.......
теперь, как отмечают кусочно, я попробовал это, рассматривая первые четыре точки касания и визуализируя их на экране, затем удаляю первую точку, а затем снова отправляемся на следующие четыре балла. Шаг 1:1,2,3,4 Шаг 2: 2,3,4,5, как, где, как в этом подходе, я получил перекрытие, что не является проблемой на самом деле, но не получило плавной кривой........
но для быстрого перемещения пальца мне нужно найти что-то еще?????
Ответы
Ответ 1
В зависимости от количества точек, которые вы просматриваете, есть два подхода, которые я бы рекомендовал:
Простая интерполяция
Вы можете просто пробовать местоположение пальца с установленными интервалами, а затем интерполировать точки выборки, используя что-то вроде Catmull-Rom сплайн. Это проще, чем кажется, поскольку вы можете легко преобразовать сплайн 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" Джеральда Фарина или аналогичная ссылка быть очень полезным. В пятом издании книги Фарина раздел 9.2 касается именно этой проблемы. В разделе 7.8 показано, как это сделать с кривой Безье, но вам, вероятно, понадобится кривая высокой степени, чтобы хорошо подходить.
Ответ 2
Naaff дает отличный обзор техники NURBS. К сожалению, я думаю, что создание безгласного безье "на лету" может быть слишком большим для iPhone. Я пишу приложения для рисования и получаю большое количество касаний. Медленные события в секунду - это довольно сложная задача. Вам действительно нужно оптимизировать код рисования только для того, чтобы получить хорошую производительность при записи отдельных точек - гораздо меньше, чтобы построить путь безье.
Если вы закончите с представлением кривой безье или NURBS - вам, вероятно, придется подождать, пока пользователь не коснется экрана, чтобы вычислить сглаженный путь. Выполнение математики непрерывно, когда пользователь перемещает свой палец (а затем перерисовывает весь пересчитанный путь с помощью кварца), не даст вам достаточно высокой скорости сбора данных, чтобы сделать что-нибудь полезное...
Удачи!
Ответ 3
Сделайте что-то вроде Тени. Получите положение касания с некоторой частотой, а затем внесите из него