比较角度和向上的奇怪行为
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
我有一个比较角度的功能.. 如果角度 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