是否有已知的算法来查找两个度数范围之间是否存在交点?它必须是循环的。
实施例。 330 - 40与20-50相交吗? (是)
我知道,一般来说,对于一组范围,如果分钟的最大值小于最大值的最小值,则它们相交,但是度数的圆形性质使得这更复杂。
我目前有以下代码。它似乎完全符合我的要求,但它非常难看。有人知道更好的方法吗?除了将重复代码移动到函数中以使其看起来更好?忽略浮点数比较我只是懒得这个例子
注意:我没有fmod 360或-360,因为它会导致0并搞砸比较。防爆。 (500-360)在(350-20)内 - >会导致试图弄清楚(5 - 0)是否在(350-20)之内,现在是什么?它似乎更简单。
// Example program
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
bool bearingRangesIntersect(float p_fBearingMinDeg0, float p_fBearingMaxDeg0, float p_fBearingMinDeg1, float p_fBearingMaxDeg1){
// Normalize
if(p_fBearingMinDeg0 != -360.0f && p_fBearingMinDeg0 != 360.0f && (p_fBearingMinDeg0 < 0.0f || p_fBearingMinDeg0 > 360.0f)){
p_fBearingMinDeg0 = fmod(p_fBearingMinDeg0, 360.0f);
if(p_fBearingMinDeg0 < 0.0f){
p_fBearingMinDeg0 += 360.0;
}
}
if(p_fBearingMinDeg1 != -360.0f && p_fBearingMinDeg1 != 360.0f && (p_fBearingMinDeg1 < 0.0f || p_fBearingMinDeg1 > 360.0f)){
p_fBearingMinDeg1= fmod(p_fBearingMinDeg1, 360.0f);
if(p_fBearingMinDeg1< 0.0f){
p_fBearingMinDeg1+= 360.0;
}
}
if(p_fBearingMaxDeg0 != -360.0f && p_fBearingMaxDeg0 != 360.0f && (p_fBearingMaxDeg0 < 0.0f || p_fBearingMaxDeg0 > 360.0f)){
p_fBearingMaxDeg0= fmod(p_fBearingMaxDeg0, 360.0f);
if(p_fBearingMaxDeg0< 0.0f){
p_fBearingMaxDeg0+= 360.0;
}
}
if(p_fBearingMaxDeg1 != -360.0f && p_fBearingMaxDeg1 != 360.0f && (p_fBearingMaxDeg1 < 0.0f || p_fBearingMaxDeg1 > 360.0f)){
p_fBearingMaxDeg1 = fmod(p_fBearingMaxDeg1, 360.0f);
if(p_fBearingMaxDeg1 < 0.0f){
p_fBearingMaxDeg1 += 360.0;
}
}
// Make the min < max to respect comparison
if(p_fBearingMinDeg0 > p_fBearingMaxDeg0){
p_fBearingMinDeg0 -= 360.0f;
if(p_fBearingMinDeg0 < -360.0f){
p_fBearingMinDeg0 = fmod(p_fBearingMinDeg0, 360.0f);
}
}
if(p_fBearingMinDeg1 > p_fBearingMaxDeg1){
p_fBearingMinDeg1 -= 360.0f;
if(p_fBearingMinDeg1 < -360.0f){
p_fBearingMinDeg1 = fmod(p_fBearingMinDeg0, 360.0f);
}
}
float fMaxOfMins = std::max(p_fBearingMinDeg0, p_fBearingMinDeg1);
float fMinOfMaxs = std::min(p_fBearingMaxDeg0, p_fBearingMaxDeg1);
return fMaxOfMins < fMinOfMaxs;
}
int main()
{
// should be true
bool result0 = bearingRangesIntersect(320,50,20,50);
bool result1 = bearingRangesIntersect(-40,50, 20,50);
bool result2 = bearingRangesIntersect(320,50,320,90);
bool result3 = bearingRangesIntersect(-40,-90,-50,-80);
// should be false
bool result5 = bearingRangesIntersect(-40,50, 80,150);
bool result6 = bearingRangesIntersect(181,270,-50,180);
bool result7 = bearingRangesIntersect(300,50, 200, 270);
bool result8 = bearingRangesIntersect(-120,-90, -40,-20);
std::cout << "result0 = " << result0 << std::endl;
std::cout << "result1 = " << result1 << std::endl;
std::cout << "result2 = " << result2 << std::endl;
std::cout << "result3 = " << result3 << std::endl;
std::cout << "result5 = " << result5 << std::endl;
std::cout << "result6 = " << result6 << std::endl;
std::cout << "result7 = " << result7 << std::endl;
std::cout << "result8 = " << result8 << std::endl;
return 0;
}