我有一些uibezierpath。作为路径,它们并没有真正的厚度。但是,我希望找到一种方法来定义路径周围的区域,就像这张图片中线条周围的灰色区域一样
基本上,我想测试绘制的线是否落在线周围的缓冲区内。我原以为这会很简单,但事实证明它比我想象的要复杂得多。我可以使用CGPathApply函数来检查路径上的点,然后得到一个范围+或-每个点,但它比使用角度和曲线要复杂得多。有什么想法吗?
发布于 2011-06-30 06:13:17
扩展路径的宽度实际上是相当困难的。但是,你可以只用更粗的宽度来描边,就能得到大致相同的效果。就像..。
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];
...would生成一张与您的问题中的图片类似的图片。但我怀疑这对你来说不是新闻。
真正的诀窍是测试“所绘制的线是否落入缓冲区”。这个问题和我刚才在another question中回答的问题非常相似。看看我在那里分享的LineSample.zip代码。这实现了位图/位数据比较,以检测行上的命中,这与您需要的非常相似。您只需在位图中绘制较粗的"buffer“路径以进行测试,并在视图中显示较细的线条。
发布于 2011-11-02 01:36:04
基本上,您希望检查是否有任何点落在路径周围指定大小的区域内。
这实际上很容易做到。首先,您需要一个值来定义要测试的path周围的空间量。比方说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!*/
}
}
}
https://stackoverflow.com/questions/6520154
复制相似问题