C ++ Пересечение диапазона градусов [дубликат]

Короткие и элегантные

#include <vector>
#include <string>
using namespace std;

vector<string> split(string data, string token)
{
    vector<string> output;
    size_t pos = string::npos; // size_t to avoid improbable overflow
    do
    {
        pos = data.find(token);
        output.push_back(data.substr(0, pos));
        if (string::npos != pos)
            data = data.substr(pos + token.size());
    } while (string::npos != pos);
    return output;
}

могут использовать любую строку в качестве разделителя, также могут использоваться с двоичными данными (std :: string поддерживает двоичные данные, включая нули)

, используя :

auto a = split("this!!is!!!example!string", "!!");

выход:

this
is
!example!string
5
задан HugoRune 3 August 2012 в 21:59
поделиться

3 ответа

Как упоминал @admaoldak, сначала нормализуйте градусы:

a1_norm = a1 % 360
a2_norm = a2 % 360
b1_norm = b1 % 360
b2_norm = b2 % 360

Теперь, чтобы проверить, находится ли b1 внутри (a1, a2),

def intersect(b, as, ae
    Intersect = False
    If as > ae:
        if b >= as or b <= ae:
            return True
    Else:
        if b>=as and b<=ae:
            return True
    return False

Окончательный ответ:

intersect(b1_norm,a1_norm,a2_norm)||intersect(b2_norm,a1_norm,a2_norm)||
intersect(a1_norm,b1_norm,b2_norm)||intersect(a2_norm,b1_norm,b2_norm)
10
ответ дан ElKamina 1 September 2018 в 01:18
поделиться

Как насчет нормализации значения каждой степени до 0-360:

a1_norm = a1 % 360
a2_norm = a2 % 360
b1_norm = b1 % 360
b2_norm = b2 % 360

Затем вы просто проверяете пересечение:

(a1_norm <= b2_norm) and (a2_norm<= b1_norm) 
0
ответ дан adamoldak 1 September 2018 в 01:18
поделиться

Для интервала [iX, iY] определим нормировку i_norm = normalize (i) так, чтобы:

1. 0 <= i_norm.X < 360
2. i_norm.X <=i_norm.Y

, тогда мы определяем другую операцию i_slide = slide (i) так, чтобы:

1. i_slide.X = i.X + 360
2. i_slide.Y = i.Y + 360

, мы можем доказать, что для ваших входных данных A и B A пересекает круг с B тогда и только тогда, когда:

нормализует (A) интервал перекрывает с нормализацией (B)

или

нормализует (A) интервал перекрывает со слайдом ( normalize (B))

интервал-перекрытия определяется так же, как «пересечение» в сообщении adamoldak.

и обе операции normalize () и slide () могут быть легко реализованы.

возьмем ваш пример: A=[-45°,45°]; B=[10°,20°], мы имеем

normalize(A) = [315,405] 
normalize(B) = [10,20] 
slide( normalize(B) ) = [370,380]

и [315,405] интервальные перекрытия с [370,380]

2
ответ дан lavin 1 September 2018 в 01:18
поделиться