我有一些uibezierpaths。作为路径,它们并没有真正的厚度。但是,我希望找到一种方法来定义路径周围的区域,例如这张图片中线条周围的灰色区域
基本上,我想测试绘制的线条是否落在线条周围的缓冲区内。我认为这很简单,但事实证明它比我想象的要复杂得多。我可以使用 CGPathApply 函数来检查路径上的点,然后得到一个范围 + 或 - 每个点,但它比角度和曲线更复杂。有任何想法吗?
我有一些uibezierpaths。作为路径,它们并没有真正的厚度。但是,我希望找到一种方法来定义路径周围的区域,例如这张图片中线条周围的灰色区域
基本上,我想测试绘制的线条是否落在线条周围的缓冲区内。我认为这很简单,但事实证明它比我想象的要复杂得多。我可以使用 CGPathApply 函数来检查路径上的点,然后得到一个范围 + 或 - 每个点,但它比角度和曲线更复杂。有任何想法吗?
扩大路径的宽度实际上是相当困难的。但是,你可以用更粗的宽度抚摸它,并获得几乎相同的效果。就像是...
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代码。这实现了位图/按位数据比较,以像您需要的那样检测行上的命中。您可以将较粗的“缓冲区”路径绘制到位图中进行测试,并在您的视图中显示较细的线条。
基本上,您想检查是否有任何点落在路径周围指定大小的区域内。
这实际上非常简单。首先,您需要一个值来定义要测试的路径周围的空间量。比如说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!*/
}
}
}