Сенсорный рисунок в Quatz 2D / Core Graphics - PullRequest
1 голос
/ 01 июня 2010

Я пытаюсь реализовать «инструмент рисования от руки». На данный момент алгоритм выглядит так (я не вставляю никакого кода, потому что методы довольно большие, попробую объяснить идею):

Рисунок

  1. В touchesStarted: метод, который я создаю NSMutableArray * pointsArray и добавляю в него точку. Вызовите setNeedsDisplay: метод.
  2. В touchesMoved: метод Я вычисляю точки между последней добавленной точкой из pointsArray и текущей точкой. Добавьте все точки к массиву pointsArray. Вызовите setNeedsDisplay: метод.
  3. В touchesFinished: событие Я вычисляю точки между последней добавленной точкой из массива и текущей точкой. Установите флажок касания, были закончены . Вызовите setNeedsDisplay: .

Визуализация:

drawRect: метод проверок равен pointsArray! = Nil и есть ли в нем какие-либо данные. Если есть - он начинает обводить круги в каждой точке этого массива. Если установлен флаг touch_WereFinished - сохранить текущий контекст в UIImage , освободить pointsArray, установить его в nil и сбросить флаг.

У этого метода есть много недостатков:

  • Медленно
  • Становится очень медленно, когда пользователь дотрагивается и долго двигает пальцем. Массив становится огромным
  • "Линии", составленные из кругов, безобразны

Я бы хотел изменить свой алгоритм, чтобы он работал немного быстрее и сглаживался. В результате я хотел бы иметь строки, как на картинке по следующему URL (извините, не хватает репутации для вставки изображения): http://2.bp.blogspot.com/_r5VzEAUYXJ4/SrOYp8tJCPI/AAAAAAAAAMw/ZwDKXiHlhV0/s320/SketchBook+Mobile(4).png

Можете ли вы посоветовать мне, как я могу рисовать линии таким образом (гладкие и тонкие по краям)? Я думал нарисовать круги с альфа-градиентом по краям (чтобы сделать линии более плавными), но это будет крайне медленно ИМХО.

Спасибо за помощь

Обновление

Я изменил алгоритм рисования. Теперь каждое событие я сохраняю UITouch и в методе drawRect: я рисую путь из пред. указать на текущий. И выводить UIImage из контекста каждые drawRect: вызов.

Но у меня все еще есть 2 вопроса:

  1. Можно ли рисовать более плавно. Я имею в виду, что если я рисую довольно быстро, я легко вижу, что путь - это набор прямых линий. Но я хочу рисовать кривые, чтобы сделать путь гладким. Вероятно, кривые Безье помогут, но я не понимаю, как они могут помочь в этом. ситуация.
  2. Я хочу начать путь с более тонкой линии и закончить также более тонкой линией. Как я могу сделать эту строку преобразования? Спасибо!
...