如何确定CGPath的交集

Ila*_*ian 17 iphone objective-c

我的问题类似于.

我有2个CGPathRef,1个将通过手指触摸移动.我想找到2 CGPathRef是否相交?这个问题大约在2年前被问到,我想知道是否在某些时候找到了一些东西.

And*_*rew 9

这是相当陈旧的,但我发现它寻找一个类似的解决方案,在我的问题中我想找到一个圆与路径重叠(你的问题的一个特例).

我通过使用CGPathCreateCopyByStrokingPath圆的半径作为笔划宽度创建原始路径的描边版本来解决这个问题.如果圆的中心点与描边路径重叠,则原始路径与圆重叠.

BOOL CGPathIntersectsCircle(CGPathRef path, CGPoint center, CGFloat radius)
{
    CGPathRef fuzzyPath;
    fuzzyPath = CGPathCreateCopyByStrokingPath(path, NULL, radius,
                                               kCGLineCapRound,
                                               kCGLineJoinRound, 0.0);
    if (CGPathContainsPoint(fuzzyPath, NULL, center, NO))
    {
        CGPathRelease(fuzzyPath);
        return YES;
    }
    CGPathRelease(fuzzyPath);
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

编辑:未发布fuzzyPath的小错误.


Ale*_*hol 6

我为CGPathRefs编写了一个基于小像素的路径冲突检测API.它要求你为项目添加一些源目录,它只适用于ARC,但它至少应该告诉你如何做这样的事情.它基本上在两个不同的上下文中绘制两条路径,然后逐像素检查以查看两条路径上是否有任何像素.显然,每次用户拖动手指时运行速度都会很慢,但它确实可以每半秒钟左右完成一次,甚至可能不在主线程上.

这是我发现做这样的事情的最简单的方法,除了使用大量数学之外,很可能没有更好的方法.