比较角度和向上的奇怪行为

compare angle and up in strange behavior

我有一个比较角度的功能.. 如果角度 si 在距离起始标题的 -5/+5 度范围内,这应该 return 颜色 .green 否则应该 return .orange。

我简化了项目,以便在 swift Playground 中易于使用。

这是我的乐趣:

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


let headingStart = 3.0
let currentHeading = 3.0


func centro(startHeading:Double, currentHeading : Double)->Color {
    var coloreDaMostrare : Color = .black
    
    let HDGstart  = Angle(degrees: startHeading)
    let HDHCurrent = Angle(degrees: currentHeading)
    let rangeLower = convertToPositiveAngle(HDGstart - Angle(degrees: 5))
    let rangeUpper = (HDGstart + Angle(degrees:  5))
    
    
    if HDHCurrent.degrees>=rangeLower.degrees && HDHCurrent.degrees <= rangeUpper.degrees{
        coloreDaMostrare = .green
        debugPrint("1")
    } else if HDHCurrent.degrees > rangeUpper.degrees {
        debugPrint("2")
        coloreDaMostrare = .orange
    }else if HDHCurrent.degrees < rangeLower.degrees {
        debugPrint("3")
        coloreDaMostrare = .orange
    }

    return coloreDaMostrare
}


centro(startHeading: headingStart, currentHeading: currentHeading)

// should return green not orange

当起始航向接近 360/0 时出现问题...一个小值..

如果你使用例如高值没有问题,一切正常..

我做错了什么?

使用这种方法:直接玩度数。

func centro(startHeading:Double, currentHeading : Double)->Color {
    var coloreDaMostrare : Color = .black
    
    let HDGstart  = Angle(degrees: startHeading)
    let HDHCurrent = Angle(degrees: currentHeading)
    let finalAngle = convertToPositiveAngle(HDGstart)
    
    if ((finalAngle.degrees - 5)...(finalAngle.degrees + 5)).contains(HDHCurrent.degrees) {
        coloreDaMostrare = .green
        debugPrint("1")
    } else {
        debugPrint("2")
        coloreDaMostrare = .orange
    }
        /**
        //Or another option
        let lowerBound = finalAngle.degrees - 5
        let upperBound = finalAngle.degrees + 5
        let currentBound = HDHCurrent.degrees
        
        if lowerBound <= currentBound && currentBound <= upperBound {
            coloreDaMostrare = .green
            debugPrint("1")
        } else {
            debugPrint("2")
            coloreDaMostrare = .orange
        }
         */
    return coloreDaMostrare
}

检查角度差是否在预定义范围内的简单方法。处理所有角度符号和通过 0 的过渡。

别忘了radians/degrees(我不知道Swift需要什么单位)

if (Cos(A - B) > Cos(5))
   difference is less than 5