Я пытаюсь реализовать «инструмент рисования от руки».
На данный момент алгоритм выглядит так (я не вставляю никакого кода, потому что методы довольно большие, попробую объяснить идею):
Рисунок
- В touchesStarted: метод, который я создаю NSMutableArray * pointsArray и добавляю в него точку. Вызовите setNeedsDisplay: метод.
- В touchesMoved: метод Я вычисляю точки между последней добавленной точкой из pointsArray и текущей точкой. Добавьте все точки к массиву pointsArray. Вызовите setNeedsDisplay: метод.
- В 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 вопроса:
- Можно ли рисовать более плавно. Я имею в виду, что если я рисую довольно быстро, я легко вижу, что путь - это набор прямых линий. Но я хочу рисовать кривые, чтобы сделать путь гладким. Вероятно, кривые Безье помогут, но я не понимаю, как они могут помочь в этом.
ситуация.
- Я хочу начать путь с более тонкой линии и закончить также более тонкой линией. Как я могу сделать эту строку преобразования?
Спасибо!