我正在尝试实现以下功能:
func areRangesOverlapping(min1: Angle, max1: Angle, min2: Angle, max2: Angle) -> Bool
在那里人们可以将范围成像在一个圆圈上,并且总是从最小到最大沿顺时针方向进行。例如,min1可以是340度,max1可以是20度(那么范围将是40度长)。
以下解决方案不起作用,因为min1 <= max1并不总是正确的:
func areRangesOverlapping(min1: Angle, max1: Angle, min2: Angle, max2: Angle) -> Bool {
let range1 = min1...max1
let range2 = min2...max2
return range1.overlaps(range2)
}
发布于 2021-09-07 22:16:32
func areRangesOverlapping(min1: Angle, max1: Angle, min2: Angle, max2: Angle) -> Bool {
let min1 = min1.asDoubleBetween0and360
let max1 = max1.asDoubleBetween0and360
let min2 = min2.asDoubleBetween0and360
let max2 = max2.asDoubleBetween0and360
let isRange1OverZero = min1 > max1
let isRange2OverZero = min2 > max2
if !isRange1OverZero && !isRange2OverZero {
let range1 = min1...max1
let range2 = min2...max2
return range1.overlaps(range2)
} else if isRange1OverZero && !isRange2OverZero {
return max2 > min1 || max1 > min2
} else if isRange2OverZero && !isRange1OverZero {
return max1 > min2 || max2 > min1
} else {
let range1 = min1...(max1 + 360)
let range2 = min2...(max2 + 360)
return range1.overlaps(range2)
}
}
extension Angle {
var asDoubleBetween0and360: Double {
var result = fmod(self.degrees, 360)
if result < 0 {
result += 360.0
}
return result
}
}
https://stackoverflow.com/questions/69094916
复制相似问题