2

我有一些uibezierpaths。作为路径,它们并没有真正的厚度。但是,我希望找到一种方法来定义路径周围的区域,例如这张图片中线条周围的灰色区域在此处输入图像描述

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

4

2 回答 2

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

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

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

于 2011-06-29T22:13:16.923 回答
0

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

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

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

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!*/
        }
    }

}
于 2011-11-01T17:36:03.627 回答