我怎么知道一个 CGPoint 数组是不是靠近另一个 CGPoint 数组?

Posted

技术标签:

【中文标题】我怎么知道一个 CGPoint 数组是不是靠近另一个 CGPoint 数组?【英文标题】:How can i know if an array of CGPoint is close to another array of CGPoint?我怎么知道一个 CGPoint 数组是否靠近另一个 CGPoint 数组? 【发布时间】:2013-11-13 19:25:33 【问题描述】:

我有一个使用函数 addCurveToPoint 的 CGPoint 数组组成的 UIBezierPath,下面是一些代码:

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]];

当在视图上识别到触摸时,我会得到触摸点,我需要将其与 UIBezierPath 的 GCPoint 进行比较,并判断它是否在 UIBezierPath 内。我使用的是函数 containsPoint 但它不起作用,这是我的代码:

- (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(或其中大部分)内并添加边距错误,因此触摸不需要如此精确,另外我怎么能说 UIBezierPath 的点有多远?

【问题讨论】:

“containsPath 不起作用”是什么意思?它应该工作。请注意,贝塞尔路径必须关闭才能进行测试。 你的意思是使用 [path closePath] 吗? 是的,完全正确。 (在containsPoint: 文档中提到。) 它有效,但我必须如此精确地触摸,有没有设置偏移量?或类似的东西,我的意思是误差范围 那个我不知道。 【参考方案1】:

使用CGPathCreateCopyByStrokingPath 创建路径的粗描边版本(例如,将lineWidth 设置为22)。然后测试该点是否在该描边路径或您的原始路径中。

Ole Begemann: CGPath Hit Testing

【讨论】:

让我试试这个解决方案

以上是关于我怎么知道一个 CGPoint 数组是不是靠近另一个 CGPoint 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 UIScrollView 触摸顶部 scrollView 是不是与另一个 View 的 CGPoint 相交

如何检测两只乌龟是不是彼此靠近或相互接触

检测 CGPoint 是不是在多边形内

CGPoint 数组作为不同的结构

如何计算不接触 UIView 的随机 CGPoint

SWIFT:将 CGPoint 与数组中的图像相关联