swift - 角度接近 360 度时以快速、奇怪的行为进行角度评估
问题描述
我在评估和比较某个角度时遇到了麻烦。
我创建了这个函数,它在某些条件下返回颜色基础
我正在传递给函数的参数是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
}
当 startHeading 高于 10 度时它工作正常,但是当我接近 0/360 时它会变得疯狂,因为数学 HDHStart - 10 给出了一个负角。
对于 swift 2 deg - 3 结果为 -1 但角度应为 359 ...
我做错了什么?
有什么办法可以解决这个问题吗,我在网上看到很少有人建议使用模运算符..我试过了,但是 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)) {
ETC
推荐阅读
- python - 在 python http.client.HTTPSConnection 中设置更新的 ssl 版本
- oracle - ORA-06502 而 dbms_sql.execute(
) 外绑定 - javascript - React中发生下拉组件onChange选择时如何清除自动完成文本框组件
- sql - 如何从 SQL 中的 XML 元素返回多个值?
- cypress - 将一个日期值与其他日期进行比较并在 cypress 中执行条件操作
- applescript - 使用 Applescript 在 Things 3 中复制项目
- api - Nginx 规则阻止没有变量的 api 调用
- spring-boot - 即使代理计数 == min.isr 值,Kafka 事务也会超时
- python - 来自 statsmodels.api.GLM(广义线性模型)的奇怪采样结果
- python - 在两个不同的数据帧上执行形状“差异”功能的最快方法?