2013-11-13 2 views
0

У меня есть UIBezierPath из массива CGPoint's с помощью функции addCurveToPoint, вот немного кода:Как я могу узнать, близок ли массив CGPoint к другому массиву CGPoint?

UIBezierPath *path = [[UIBezierPath alloc] init]; 
[path setLineWidth:10]; 
[path moveToPoint:pts[0]]; 
for(int i = 0; i<[array count]; i++) { 
    [path addCurveToPoint:[array objectAtIndex:i] controlPoint1:pts[1] controlPoint2:pts[2]]; 
} 

Когда прикосновение распознается на взгляд, я получаю точку прикосновения и мне нужно сравнить его с GCPoint'ами UIBezierPath и сказать, находится ли он внутри UIBezierPath или нет. То, что я использовал это функция containsPoint но didn't работы, вот мой код:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint p = [touch locationInView:self]; 
    CGPoint point = CGPointMake(p.x, p.y); 
    NSLog(@"actual point x %f y %f", point.x, point.y); 

    if ([path containsPoint:point]) { 
     NSLog(@"it contains the point"); 
    } 
} 

В конце концов, мне нужно, чтобы получить все множество из затронутых пунктов и сказать, если тронули точки внутри из UIBezierPath (или большинства из них) и добавьте ошибку поля, поэтому touch не нужно так точно, также как я могу сказать, насколько далеко находится точка UIBezierPath?

+0

Что вы имеете в виду под "containsPath не работает"? Он должен работать. Обратите внимание, что путь безье должен быть * закрыт * для теста. –

+0

Вы имеете в виду использование [path closePath]? –

+0

Да, точно. (Он упоминается в документации 'containsPoint:'.) –

ответ

2

Используйте CGPathCreateCopyByStrokingPath, чтобы создать толстоглазованную версию вашего пути (например, с lineWidth установлена ​​в 22). Затем проверьте, находится ли точка внутри этого поглаженного пути или исходного пути.

Ole Begemann: CGPath Hit Testing

+0

Позвольте мне попробовать это решение –

+0

Awesome! он работает, спасибо вам большое! –