Как я могу сохранить путь движения пальца в объективе c?

Я хочу сохранить путь движения пальца на экране iPhone. На данный момент я просто читаю штрихи и добавляю CGPoints в NSMutableArray. когда я пытаюсь напечатать все cgpoint в этом массиве, почему-то отсутствуют промежуточные точки. Есть ли лучший способ для этого? Можем ли мы сохранить весь путь напрямую?

Вот код, который я использую

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

fingerSwiped = NO;
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self.view];
[self.myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];
  }


 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
   {
fingerSwiped = YES;

UITouch *touch = [touches anyObject];   
CGPoint currentPoint = [touch locationInView:self.view];



UIGraphicsBeginImageContext(self.view.frame.size);
[slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth);
//CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0);
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
slateImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
[myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];   
}

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

if(!fingerSwiped) 
{
    UIGraphicsBeginImageContext(self.view.frame.size);
    [slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth);
    //CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0);
    CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    CGContextFlush(UIGraphicsGetCurrentContext());
    slateImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];
}
}

person slonkar    schedule 01.03.2012    source источник
comment
Можете ли вы поделиться кодом, где вы добавляете точки в массив   -  person dbrajkovic    schedule 01.03.2012
comment
Я забыл об этом раньше.   -  person slonkar    schedule 01.03.2012
comment
Как вы думаете, почему отсутствуют промежуточные точки? Кроме того, вы хотите очистить массив myPoints в touchesBegan:withEvent:?   -  person rob mayoff    schedule 01.03.2012
comment
Я говорю, что в нем отсутствуют некоторые точки, потому что, когда я пытаюсь нарисовать что-то с помощью этого массива, используя цикл for, я получаю пунктирную линию вместо сплошной линии.   -  person slonkar    schedule 01.03.2012
comment
@Sumit Можете ли вы опубликовать код, которым вы рисуете точки. Кажется, что-то не так в коде рисования   -  person Hanon    schedule 01.03.2012


Ответы (1)


Вы записываете каждое очко, которое iOS готова дать вам.

iOS сообщает о событиях касания только каждые 16,67 миллисекунд (60 раз в секунду). Нет способа (насколько я знаю) получить обновленные сенсорные местоположения быстрее, чем это.

Вы говорите, что получаете прямые линии, когда рисуете точки касания. Это происходит потому, что пользователь двигает пальцем так быстро, что прикосновение перемещается на значительную величину за 16,67 миллисекунды. Тач перемещается так далеко между обновлениями, что при соединении точек он не выглядит плавной кривой. К сожалению, нет (как я уже сказал) способа получать обновления быстрее, чем 60 раз в секунду.

Единственный способ справиться с этим — использовать сплайн-интерполяцию для соединения сообщаемых точек. Сплайн-интерполяция — сложная тема. Вы можете найти много информации об этом с помощью Google.

Вы можете увидеть пример этого в приложении Adobe Ideas на iPad. Если вы быстро нарисуете большую спираль и внимательно посмотрите, то увидите, что линия становится более гладкой, когда вы поднимаете палец. Я полагаю, что он выполняет постепенное сглаживание, когда вы рисуете спираль, а когда вы поднимаете палец, он возвращается и вычисляет лучшую интерполяцию всей линии.

person rob mayoff    schedule 01.03.2012
comment
Спасибо за указатель. Но дело в том, что мне не хватает точек, только если я рисую точки из массива. На самом деле я передаю этот массив на другое устройство через специальную сеть Bluetooth, используя GKSession, и пытаюсь восстановить его на другом устройстве. - person slonkar; 01.03.2012