首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取uibezierpath周围的缓冲区

如何获取uibezierpath周围的缓冲区
EN

Stack Overflow用户
提问于 2011-06-29 19:48:37
回答 2查看 927关注 0票数 2

我有一些uibezierpath。作为路径,它们并没有真正的厚度。但是,我希望找到一种方法来定义路径周围的区域,就像这张图片中线条周围的灰色区域一样

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-30 06:13:17

扩展路径的宽度实际上是相当困难的。但是,你可以只用更粗的宽度来描边,就能得到大致相同的效果。就像..。

代码语言:javascript
运行
复制
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“路径以进行测试,并在视图中显示较细的线条。

票数 1
EN

Stack Overflow用户

发布于 2011-11-02 01:36:04

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

这实际上很容易做到。首先,您需要一个值来定义要测试的path周围的空间量。比方说20分。所以你需要做的是启动一个FOR循环,从-20到20,在每次迭代中,创建你的路径的副本,转换路径的x和y共用项,检查每一个。

在这个代码示例中,所有这一切都更加清晰。

代码语言:javascript
运行
复制
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!*/
        }
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6520154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档