Как я могу проследить движение пальца на ощупь для рисования плавных кривых? - PullRequest
12 голосов
/ 27 июня 2009

как то, что я хочу, это если я быстро двигаю пальцем по экрану iphone, то я хочу, чтобы что-то получалось, чтобы он получал правильную кривую, используя кварц 2d или открывалки, как угодно.

я хочу нарисовать путь в стиле кривой ...... Я видел этот пример GLPaint (OpenglES), но он мне сильно не поможет, учитывая быстрое движение ваших пальцев .....

что-то вроде плавной кривой ..... У кого-нибудь есть какой-нибудь пример, пожалуйста, скажите

спасибо

Редактировать: перенесено из ответа ниже:

спасибо всем .......

но я попробовал алгоритм кривой Безье с двумя контрольными точками, но сначала проблема состоит в том, как рассчитать контрольные точки, если нет заранее определенных точек ....

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

Теперь, как отметил Кусок, я попробовал сделать так, как если бы он рассматривал первые четыре точки касания и отображал их на экране, затем удалял первую точку, а затем снова переходил к следующим четырем точкам. Шаг 1: 1, 2, 3, 4 Шаг 2: 2,3,4, 5, как и в случае, когда, как и в этом подходе, я получил перекрытие, которое на самом деле не является проблемой, но не получило плавную кривую .... ....

но для быстрого движения пальца мне нужно найти что-то еще ?????

Ответы [ 3 ]

10 голосов
/ 08 июля 2009

В зависимости от количества точек выборки, которые вы просматриваете, я бы порекомендовал два подхода:

Простая интерполяция

Вы можете просто сэмплировать местоположение пальца с заданными интервалами, а затем интерполировать точки выборки, используя что-то вроде 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 .

Подгонка кривой к вашим образцам

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

  1. Сбор точек выборки
  2. Определение кривой NURBS (включая ее вектор узлов)
  3. Настройка системы линейных уравнений для образцов и кривой
  4. Решите систему в смысле наименьших квадратов

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

Если вы решите исследовать этот подход, то книга "Кривые и поверхности для CAGD" Джеральда Фарина , или аналогичная ссылка, будет очень полезной. В 5-м издании книги Фарина раздел 9.2 посвящен именно этой проблеме. В разделе 7.8 показано, как сделать это с помощью кривой Безье, но вам, вероятно, понадобится кривая высокой степени, чтобы получить хорошее соответствие.

3 голосов
/ 08 июля 2009

Наафф дает отличный обзор техники NURBS. К сожалению, я думаю, что создание плавного безье на лету может быть слишком сложным для iPhone. Я пишу приложения для рисования, и получение большого количества событий touchesMoved в секунду - довольно сложная задача для начала. Вам действительно нужно оптимизировать код для рисования, чтобы получить хорошую производительность при записи отдельных точек, а тем более построить более изящный путь.

Если вы в конечном итоге будете использовать кривую Безье или NURBS - вам, вероятно, придется подождать, пока пользователь не коснется экрана, чтобы вычислить сглаженный путь. Постоянное выполнение математических операций, когда пользователь перемещает свой палец (а затем перерисовывает весь пересчитанный путь, используя Quartz), не даст вам достаточно высокой скорости сбора данных, чтобы сделать что-нибудь полезное ...

Удачи!

1 голос
/ 27 июня 2009

Сделайте что-нибудь подобное, предложенное Shadow. Получите положение касания с некоторой частотой, а затем сделайте из него кривую Безье . Вот как пути нарисованы с помощью мыши (или планшета) в таких программах, как Illustrator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...