首页 > 解决方案 > 角度接近 360 度时以快速、奇怪的行为进行角度评估

问题描述

我在评估和比较某个角度时遇到了麻烦。

我创建了这个函数,它在某些条件下返回颜色基础

我正在传递给函数的参数是startingHeadingcurrentHeading

    func lh1(startHeading:Double, currentHeading : Double)->Color {
        let HDGstart : Angle = Angle(degrees: startHeading)
        let HDHCurrent : Angle = Angle(degrees: currentHeading)
        
        var coloreDaMostrare : Color = .black
        
        if HDHCurrent >= HDGstart - Angle(degrees: 10) && HDHCurrent < HDGstart - Angle(degrees: 5) {
            coloreDaMostrare = .orange
        }
        else if HDHCurrent > HDGstart - Angle(degrees: 5){
            coloreDaMostrare = .black
        }
        else if HDHCurrent < HDGstart - Angle(degrees: 10) {
            coloreDaMostrare = .orange
        }
        
     
        
        return coloreDaMostrare
    }

当 startHeading 高于 10 度时它工作正常,但是当我接近 0/360 时它会变得疯狂,因为数学 HDHStart - 10 给出了一个负角。

对于 swift 2 deg - 3 结果为 -1 但角度应为 359 ...

我做错了什么?

有什么办法可以解决这个问题吗,我在网上看到很少有人建议使用模运算符..我试过了,但是 swift 游戏警告说不能在 swift 中使用(老实说我不明白它是如何工作的)

寻求帮助..非常感谢

标签: swiftmathswiftuiangle

解决方案


以下函数应允许将小于和大于 0...360 的输入角度转换为该范围:

func convertToPositiveAngle(_ angle : Angle) -> Angle {
    var toRet = Angle(degrees: fmod(angle.degrees, 360))
    if toRet.degrees < 0 {
        toRet.degrees += 360.0;
    }
    return toRet
}

fmod函数是取模运算符的浮点等价物——它基本上告诉你余数。所以,fmod(370.5, 360) 应该给你 10.5。

在您的示例代码中,每次进行减法运算时,都应使用上述等式。所以:

if HDHCurrent >= convertToPositiveAngle(HDGstart - Angle(degrees: 10)) && HDHCurrent < convertToPositiveAngle(HDGstart - Angle(degrees: 5)) {

ETC


推荐阅读