swift 中的角度评估,角度接近 360 度时的奇怪行为

Angle evaluation in swift, strange behavior when angle close to 360

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

我已经创建了这个函数,它 return 基于某些条件的颜色

我正在将函数传递给参数 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
    }

当 startingHeading 超过 10 度时它工作正常,但是当我接近 0/360 时它会变得疯狂,因为数学 HDHStart - 10 给出负角度。

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

我做错了什么?

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

寻求帮助.. 非常感谢

以下函数应允许将小于和大于 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)) {

等等