Вычислить контрольные точки при рисовании в iOS

Я работаю над графическим приложением, где пользователь может рисовать / писать пальцем или стилусом. Для этого в моем приложении я ссылался на код https://github.com/yusenhan/Smooth-Line-View .

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

Поэтому я думаю, что я ошибаюсь в получении контрольной точки.

Ниже мой код

// Найти среднюю точку

 CGPoint midPoint(CGPoint p1, CGPoint p2) { return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5); } #pragma mark Gesture handle -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; //LocationInView returns the current location of the reciever in coordinate system of the given View. m_previousPoint1 = [touch locationInView:self]; m_previousPoint2 = [touch locationInView:self]; m_currentPoint = [touch locationInView:self]; [self touchesMoved:touches withEvent:event];} -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { //AnyObject:- Returns one of the objects in the set, or nil if the set contains no objects. UITouch *touch = [touches anyObject]; m_previousPoint2 = m_previousPoint1; m_previousPoint1 = m_currentPoint; m_currentPoint = [touch locationInView:self]; if(m_drawStep != ERASE) { m_drawStep = DRAW; m_drawing = TRUE; } } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);//creates a graphics context suitable for use as an image(size of the image,opquae,scale, if scale = 0.0, means platform will take care of scaling) [self.layer renderInContext:UIGraphicsGetCurrentContext()]; m_curImage = UIGraphicsGetImageFromCurrentImageContext();// to turn the context into a UIImage UIGraphicsEndImageContext(); } - (void)drawRect:(CGRect)rect { CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1); [m_curImage drawAtPoint:CGPointMake(0, 0)]; CGContextRef context = UIGraphicsGetCurrentContext();//Get a reference to current context(The context to draw) [self.layer renderInContext:context]; //Simply keep referring to this context in below functions with proper arguments. CGContextMoveToPoint(context, mid1.x, mid1.y);//Position the current point CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); CGContextSetLineCap(context, kCGLineCapRound); CGContextSetBlendMode(context, kCGBlendModeNormal); CGContextSetLineJoin(context, kCGLineJoinRound); CGContextSetLineWidth(context, self.lineWidth); CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor); CGContextSetShouldAntialias(context, YES); CGContextSetAllowsAntialiasing(context, YES); CGContextSetAlpha(context, self.lineAlpha); CGContextSetFlatness(context, 0.6); CGContextStrokePath(context);//paints(fills) the line along the current path. } 

По моим словам, точки, которые я передаю в CGContextAddQuadCurveToPoint могут быть изменены, но как настроить это, я не получаю. Я читал документы, чтобы найти контрольные точки для Bezier Curve , но я не понимаю.

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

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

Вычисление контрольных точек Безье из существующей кривой действительно сложно, поскольку контрольные точки не находятся на линии.

Лучше использовать кривые Катмулла-Рома. Существует отличный «Рецепт» в книге «Отличная книга для разработчиков iOS 6», в которую входит рабочий код сглаживания на основе сплаймов Catmull-Rom. Сплавы Catmull-Rom используют контрольные точки, которые находятся на кривой.

Я настоятельно рекомендую купить эту книгу. Пример кода для Рецепта 4.3 сделает именно то, что вы хотите.

  • Как добавить округленный угол к пользовательскому прямоугольнику UIBezierPath?
  • Создание диаграммы последовательности в iOS?
  • Как нарисовать и взаимодействовать с UIBezierPath
  • Рисование кривых линий без запаздывания?
  • UIBezierPath для UIImage
  • UIView, который имеет форму UIBezierPath?
  • UIBezierPath и applytransform
  • Как создать уложенную гистограмму с использованием uibezierpath в ios с разными цветами
  • «Недопустимый контекст 0x0» при использовании UIBezierPath и CAShapeLayer
  • Перестановка CGPath / UIBezierPath в представлении
  • Перетащите мяч по круговой траектории в Свифт
  • Interesting Posts

    Отладка приложения MFI на iPhone

    touchsMoved вызывается одним нажатием на iPhone 6s и далее

    Заменить c style for-loop в Swift 2.2.1

    Изображения, не отображаемые на устройстве iPhone

    Ошибка CGImageCreate: недопустимый размер изображения: 0 x 0 с поворотом окна (выборщика)

    Подклассификация UITableViewCell со своим собственным Nib

    Проблема с распространением сообщения SLCOmposeviewcontroller twitter

    Преобразование UIImage в NSData и сохранение с помощью основных данных

    UICollectionView с перекрывающимися ячейками и пользовательскими анимациями вставки и удаления

    Аризонный центр уведомлений, отправляющий уведомления только на iOS

    Нужна ли мне программа для разработчиков Mac, чтобы включить передачу обслуживания?

    Что эквивалентно этому объектив-c-коду в swift?

    Как вы можете настроить приложение для мобильного веб-приложения?

    Возвращаемое значение из обработчика завершения – Swift

    Проблемы с currentPlaybackTime и MPMusicPlayerController и iOS 7.1.

    Давайте будем гением компьютера.