Проверка, где значение попадает в список кортежей - PullRequest
1 голос
/ 13 января 2020

Моя программа в конечном итоге пытается вывести направление из точки a в точку b на основе полученного угла и квадранта (1, 2, 3, 4). Я создал словарь с ключами в качестве углового среза (низкий, высокий) и значения в качестве направления.

Затем я посылаю ключи (ключи с ключами) в список. Я хочу знать, как получить доступ к кортежным ключам (диапазон) и посмотреть, где полученный угол попадает в указанные значения в кортежном списке. Например: если бы я получил угол 11, он попадал бы в диапазон «00.00 - 11.25» (кортеж).

Как только я установил диапазон, значение угла находится в пределах, я могу затем, исходя из квадранта, получить направление из значения словаря, связанного с ключом (диапазон кортежа) с оператором if некоторого вида.

def compute_direction(angle, quadrant):
    directionDict = {
        (00.00, 11.25): ["E", "N", "W", "S"],
        (11.25, 33.75): ["ENE", "NNW", "WSW", "SSE"],
        (33.75, 56.25): ["NE", "NW", "SW", "SE"],
        (56.25, 78.75): ["NNE", "WNW", "SSW", "ESE"],
        (78.75, 90.00): ["N", "W", "S", "E"]
    }
    directionKeys = directionDict.keys()

1 Ответ

2 голосов
/ 13 января 2020

Кажется, что ваши диапазоны имеют размер 22,5. В таком случае вы можете использовать целочисленное деление для вычисления угла падения.

locations = [(00.00, 11.25), (11.25, 33.75), (33.75, 56.25), (56.25, 78.75), (78.75, 90.00)]
location_index = int((angle+11.25)//22.5)
current_location = locations[location_index]

По сути, все, что мы хотим сделать, это разделить диапазон [0,90] на 5 различных сегментов. Внешние два имеют длину 11,25, а средние имеют длину 22,5. Чтобы сделать это проще, мы фактически делим сегмент на [-11.25,101.25] на 5 сегментов равной длины. Само это деление выполняется целочисленным делением //, возвращает всю часть деления.

То есть [-11.25,11.25) вернет 0, [11.25,33.75) вернет 1 и так далее. Затем мы можем просто сопоставить эти целые числа с соответствующими сегментами.

Также возможно получить непосредственно начало сегмента вместо самого сегмента, используя аналогичный код.

...