uiview - iOS 检查一个view 是否在 一个 圆 的范围内
ringa_lee
ringa_lee 2017-04-17 16:15:22
[iOS讨论组]

检查两个UIView是否有交集 ,我记得有一个直接可以用的API。求指教

ringa_lee
ringa_lee

ringa_lee

全部回复(4)
迷茫

如果是用于视图本身的判断,楼上的方法够用了,如果是想判断 矩形和圆形的交集问题,其实还有有些小复杂的,我搜集了一些资料,封装了一个方法,可以直接在自己的项目中用,特定场景下,是很有用的:

我封装了一个代码,可以直接拿到自己项目中直接用:

/**
 *  计算任意圆和矩形是否有交集.
 *
 *  @param rect   矩形的边框.
 *  @param center 圆心.
 *  @param r      圆的半径.
 *
 *  @return YES,圆和矩形有交集; NO,圆和矩形无交集.
 */

- (BOOL) boxCircleIntersectWithRect:(CGRect) rect
                             center: (CGPoint) center
                                  r: (double) r
{
    // 初始输入.
    double c[] = {rect.origin.x + rect.size.width / 2.0, rect.origin.y + rect.size.height / 2.0}; // 矩形中心向量.
    double h[] = {rect.size.width / 2.0, rect.size.height / 2.0};; // 矩形半长向量,即从矩形中心到矩形顶点的向量.
    double p[] = {center.x, center.y}; // 圆心向量.
    
    double v[] = {0, 0}; // 圆心与矩形中心的向量表示.
    double u[] = {0, 0};  // 圆心与矩形最短距离的矢量
    
    // 第一步: 转换至第一象限.
    vDSP_vsubD(c, 1, p, 1, v, 1, 2);
    vDSP_vabsD(v, 1, v, 1, 2);
    
    // 第二步: 求圆心至矩形的最短距离矢量.
    vDSP_vsubD(h, 1, v, 1, u, 1, 2);
    double zero[] = {0.0, 0.0};
    vDSP_vmaxD(u, 1, zero, 1, u, 1, 2);
    
    // 第三步: 长度平方与半径平方比较
    double dotResult = 0.0;
    
    vDSP_dotprD(u, 1, u, 1, &dotResult, 2);
    double powR = pow(r, 2);
    
    BOOL result = (dotResult <= powR );
    
    return result;
}

算法灵感来源于知乎,不过它是用伪码实现的,参见: 怎样判断平面上一个矩形和一个圆形是否有重叠?
需要用到 iOS 向量操作的相关知识,可以看下CSDN这篇文章:
IOS中的矩阵和向量运算
更多讨论,参见: iOS 检查一个view 是否在 一个 圆 的范围内

高洛峰

CGPathContainsPoint 应该就可以,应该和CGRectContainsPoint一样

大家讲道理

CGPathContainsPoint(<#CGPathRef _Nullable path#>, <#const CGAffineTransform * _Nullable m#>, <#CGPoint point#>, <#bool eoFill#>)

迷茫

如果只是判断是否有交集就用CGRectIntersectsRect(),如果判断在某一个点在范围内用楼上那个

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号