首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI:检查角度范围是否重叠

SwiftUI:检查角度范围是否重叠
EN

Stack Overflow用户
提问于 2021-09-07 21:54:25
回答 1查看 38关注 0票数 0

我正在尝试实现以下功能:

代码语言:javascript
运行
复制
func areRangesOverlapping(min1: Angle, max1: Angle, min2: Angle, max2: Angle) -> Bool

在那里人们可以将范围成像在一个圆圈上,并且总是从最小到最大沿顺时针方向进行。例如,min1可以是340度,max1可以是20度(那么范围将是40度长)。

以下解决方案不起作用,因为min1 <= max1并不总是正确的:

代码语言:javascript
运行
复制
func areRangesOverlapping(min1: Angle, max1: Angle, min2: Angle, max2: Angle) -> Bool {
     let range1 = min1...max1
     let range2 = min2...max2

     return range1.overlaps(range2)
}
EN

回答 1

Stack Overflow用户

发布于 2021-09-07 22:16:32

代码语言:javascript
运行
复制
func areRangesOverlapping(min1: Angle, max1: Angle, min2: Angle, max2: Angle) -> Bool {
    let min1 = min1.asDoubleBetween0and360
    let max1 = max1.asDoubleBetween0and360
    let min2 = min2.asDoubleBetween0and360
    let max2 = max2.asDoubleBetween0and360

    let isRange1OverZero = min1 > max1
    let isRange2OverZero = min2 > max2

    if !isRange1OverZero && !isRange2OverZero {
        let range1 = min1...max1
        let range2 = min2...max2
        return range1.overlaps(range2)
    } else if isRange1OverZero && !isRange2OverZero {
        return max2 > min1 || max1 > min2
    } else if isRange2OverZero && !isRange1OverZero {
        return max1 > min2 || max2 > min1
    } else {
        let range1 = min1...(max1 + 360)
        let range2 = min2...(max2 + 360)
        return range1.overlaps(range2)
    }
}

extension Angle {
    var asDoubleBetween0and360: Double {
        var result = fmod(self.degrees, 360)
        if result < 0 {
            result += 360.0
        }
        return result
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69094916

复制
相关文章

相似问题

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