как создать кривую для линий при почерке - PullRequest
0 голосов
/ 08 февраля 2012

Я создаю приложение, и в одной части я пытаюсь реализовать почерк. Я использовал imageView для записи, который будет сохранен и отправлен на сервер в формате PDF. Я реализовал сенсорное начало, перемещение и окончание, и используя contextAddLineToPoint, я могу создавать строки, когда пользователь пишет материал. Тем не мение. Письмо немного заострено, и я пытаюсь создать кривые, когда пользователь меняет направление письма, то есть когда пишется письмо. Я не хочу реализовывать распознавание рукописного текста, а просто сгладить нарисованную линию.

Я создал «буфер», состоящий из массива, который содержит две промежуточные точки, когда пользователь перемещает касание. как следует:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *touch = [touches anyObject];

lastPoint = [touch locationInView:drawImage];
NSLog(@"first touch:%@",[NSValue valueWithCGPoint:lastPoint]);

}

drawImage - это изображение, которое я использую, чтобы писать на btw. Затем идет на ощупь переехал:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];   
currentPoint = [touch locationInView:drawImage];

if (movementCount<2) {
    [pointHolderArray addObject:[NSValue valueWithCGPoint:currentPoint]];
    movementCount ++;
    NSLog(@"pointHolderArray: %@",pointHolderArray);
}else
{      
    NSLog(@"buffer full");
    UIGraphicsBeginImageContext(drawImage.frame.size);
    [drawImage.image drawInRect:drawImage.frame];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), YES);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.3, 0.5, 0.2, 1.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(),[[pointHolderArray objectAtIndex:0]CGPointValue].x,[[pointHolderArray objectAtIndex:0]CGPointValue].y);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), [[pointHolderArray objectAtIndex:0]CGPointValue].x,[[pointHolderArray objectAtIndex:0]CGPointValue].y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), [[pointHolderArray objectAtIndex:1]CGPointValue].x,[[pointHolderArray objectAtIndex:1]CGPointValue].y);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), [[pointHolderArray objectAtIndex:1]CGPointValue].x,[[pointHolderArray objectAtIndex:1]CGPointValue].y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    lastPoint = [touch previousLocationInView:drawImage];
    [pointHolderArray removeAllObjects];
    movementCount=0;
}

}

Как видите, каждый раз, когда сохраняются две точки, я затем рисую линию между ними. Это сделало рисунок немного сложнее, а линия стала еще более неровной.

Может ли кто-нибудь помочь с этой проблемой, я очень плохо знаком с графикой в ​​iOS и не уверен, что я использую правильный API и должен ли я даже использовать imageView.

Большое спасибо заранее

1 Ответ

1 голос
/ 13 апреля 2012

Как насчет использования Pan Gesture Recognizer и GLPaint.Вы устанавливаете что-то вроде этого в viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIPanGestureRecognizer *g = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(viewPanned:)];

..

Затем фиксируйте движение панорамирования:

-(void) viewPanned:(UIPanGestureRecognizer *)g 
{

    CGPoint point = [g locationInView:paintView];
    // invert y for OpenGL
    point.y = paintView.bounds.size.height - point.y ;

    switch (g.state) {
        case UIGestureRecognizerStateBegan:
            prevPoint = point ;
            break ;
        case UIGestureRecognizerStateChanged:
            [paintView renderLineFromPoint:prevPoint toPoint:point] ;
            prevPoint = point ;
            break ;
        case UIGestureRecognizerStateEnded:
            prevPoint = point ;
            break ;
    }
}

Показанный здесь «paintView» является экземпляром PaintView, который вы можете найти в GLPaintпример в примере кода Apple.В примере не показано, как изменить размер пера, но вы можете сделать это, установив различные значения glPointSize.

- (void)setBrushSize:(CGFloat)size 
{ 
  if( size <= 1.0 ) {
        glPointSize(10);
    }
    else if ( size <= 2.0 ) {
        glPointSize(20);
    }
    else if ( size <= 3.0 ) {
        glPointSize(30);
    }    
    else if ( size <= 4.0 ) {
        glPointSize(40);
    }    
    ..

Надеюсь, это поможет ..

...