swift 中的角度评估,角度接近 360 度时的奇怪行为
Angle evaluation in swift, strange behavior when angle close to 360
我在评估和比较某个角度时遇到了麻烦。
我已经创建了这个函数,它 return 基于某些条件的颜色
我正在将函数传递给参数 startingHeading 和 currentHeading
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)) {
等等
我在评估和比较某个角度时遇到了麻烦。
我已经创建了这个函数,它 return 基于某些条件的颜色
我正在将函数传递给参数 startingHeading 和 currentHeading
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)) {
等等