如何在uibezier路径周围获得缓冲区

时间:2011-06-29 11:48:37

标签: ios nsbezierpath uibezierpath bounding

我有一些uibezierpaths。作为路径,它们并没有真正的厚度。 但是,我希望找到一种方法来定义路径周围的区域,例如此图片中线条周围的灰色区域enter image description here

基本上,我想测试绘制的线是否落在线周围的缓冲区内。 我认为这很简单,但事实证明它比我想象的要复杂得多。我可以使用CGPathApply函数检查路径上的点,然后得到一个范围+或 - 每个点,但它比角度和曲线更复杂。任何想法?

2 个答案:

答案 0 :(得分:1)

扩展路径的宽度实际上非常困难。但是,你可以用更宽的宽度来抚摸它并获得几乎相同的效果。有点像...

CGContextSetRGBStrokeColor(context, 0.4, 0.4, 0.4, 1.0);
[path setLineWidth:15];
[path stroke];
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
[path setLineWidth:3];
[path stroke];

...会产生类似你问题中的图片。但我怀疑这是对你的新闻。

真正的诀窍是测试“画线是否属于缓冲区”。这个问题与我在another question中为自己回答的问题非常相似。看看我在那里分享的LineSample.zip代码。这实现了位图/按位数据比较,以便像您需要的那样检测线上的命中。您可以将较粗的“缓冲”路径绘制到位图中进行测试,并在视图中显示较细的线条。

答案 1 :(得分:0)

基本上,您要检查是否有任何点落在路径周围指定大小的区域内。

实际上这很简单。首先,您需要一个值来定义要测试的路径周围的空间量。我们说20分。所以你需要做的是启动一个FOR循环,从-20到20开始,并在每次迭代时,创建路径的副本,转换路径的x和y co-odrinates,检查每个路径。

在此代码示例中,所有这些都更加清晰。

CGPoint touchPoint = /*get the point*/;

NSInteger space = 20;

for (NSInteger i = -space; i < space; i++) {

    UIBezierPath *pathX = [UIBezierPath bezierPathWithCGPath:originalPath.CGPath];
    [pathX applyTransform:CGAffineTransformMakeTranslation(i, 0)];

    if ([pathX containsPoint:touchPoint]) {
        /*YEAH!*/
    }

    else {
        UIBezierPath *pathY = [UIBezierPath bezierPathWithCGPath:originalPath.CGPath];
        [pathY applyTransform:CGAffineTransformMakeTranslation(0, i)];

        if ([pathY containsPoint:touchPoint]) {
            /*YEAH!*/
        }
    }

}