如何将SwiftUI的Angle类型归一化到0至360度范围内?
SwiftUI Angle 角度归一化实现方案
我们可以基于Swift标准库内置的truncatingRemainder浮点数取余方法,实现零分支的角度归一化逻辑,直接扩展系统Angle类型的方案最符合Swift编程风格:
extension Angle { /// 归一化角度到 0° ~ 360° 区间 var normalized: Angle { let mod = degrees.truncatingRemainder(dividingBy: 360) return .degrees((mod + 360).truncatingRemainder(dividingBy: 360)) } /// 归一化角度到 0 ~ 2π 弧度区间 var normalizedRadian: Angle { let mod = radians.truncatingRemainder(dividingBy: .pi * 2) return .radians((mod + .pi * 2).truncatingRemainder(dividingBy: .pi * 2)) } }
实现说明
- 第一次取余会把任意大小的角度值压缩到-360°~360°区间,避免大数运算的额外开销
- 对取余结果加360°后再次取余,即可自动把负值角度转换为对应的正值区间结果,全程不需要任何分支判断
- 完全基于系统原生API实现,不需要自定义模运算工具函数,兼容所有支持SwiftUI的系统版本
使用示例
Angle(degrees: -45).normalized // 输出 315° Angle(degrees: 370).normalized // 输出 10° Angle(degrees: -725).normalized // 输出 355°
内容的提问来源于stack exchange,提问作者Senseful
相关产品推荐
相关产品推荐

