S01E20:球体与球体的位置关系

S01E20:球体与球体的位置关系

IOS小彩虹2021-08-19 23:56:37140A+A-

说明

两个球体的位置有相交和不相交两种,其中相交时,可能会出现一个球体完全包含另一个球体的情况。

几何

判断位置关系很简单,计算球心距离,再和半径比较就可以了。出于计算效率考虑,也可以使用距离的平方,半径的平方。 当球心距离的平方,小于半径之和的平方时,球体就是相交的;否则就是不相交的。

但是,还要注意的是,当球心距离的平方,小于半径之差的平方时,球体会出现包含关系。如果我们需要的是球体表面的公共点,在这种情况下是不存在的。也就是说球体相交时,有体积相交和表面相交的情况。

代码

static func isVolumeIntersection(sphere1:Sphere, sphere2:Sphere) -> Bool {
    let radiusFar = sphere1.radius + sphere2.radius
    
    return distance_squared(sphere1.position, sphere2.position) <= radiusFar * radiusFar
}
static func isSurfaceIntersection(sphere1:Sphere, sphere2:Sphere) -> Bool {
    let radiusFar = sphere1.radius + sphere2.radius
    let radiusNear = sphere1.radius - sphere2.radius//正负无所谓,后面只需要平方值
    
    let distanceSquared = distance_squared(sphere1.position, sphere2.position)
    return (distanceSquared <= radiusFar * radiusFar) && (distanceSquared >= radiusNear * radiusNear)
}
static func isContain(sphere1:Sphere, sphere2:Sphere) -> Bool {
    let radiusNear = sphere1.radius - sphere2.radius//正负无所谓,后面只需要平方值
    let distanceSquared = distance_squared(sphere1.position, sphere2.position)
    return distanceSquared <= radiusNear * radiusNear
}
static func isSame(sphere1:Sphere, sphere2:Sphere) -> Bool {
    if distance_squared(sphere1.position, sphere2.position) < 0.00001 && abs(sphere1.radius - sphere2.radius) <= 0.00001 {
        return true
    }
    
    return false
}

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们