Найти ближайший угол к заданному

Пробовал несколько вариантов. Вот сама задача:

  1. Есть угол ( значение может быть отрицательным и положительным)
  2. Есть список с другими углами (значения могут быть отрицательными и положительными).

Необходимо найти в списке наименьший угол, ближайший к заданному углу. Если бы углы были только положительными/отрицательными я бы быстро решил эту задачу, прошу вас помочь мне.


Ответы (3 шт):

Автор решения: eri

Нужно вычесть один угол из другого и нормализовать

a = -14
x = [-15, 345]

n = min( x, key=lambda b : abs((a - b) % 360))

после abs будет всеравно в какую сторону отклонение, а получив остаток от деления на 360 будет без разницы -15 или 345

Индекс:

i = min(
    enumerate(x),
    key=lambda ib : abs((a - ib[1]) % 360)
)
→ Ссылка
Автор решения: MBo

Посчитайте скалярное произведение единичных векторов, компоненты которых являются косинусом и синусом исходного угла и проверяемых углов. Наибольшее значение этой величины соответствует наиболее близкому углу.

Препод будет доволен, это не хухры-мухры со сравнением самих углов и переходом через 0 ;)

from math import cos, sin, radians
def closestangleidx(a, value):
    ca = cos(radians(value))
    sa = sin(radians(value))
    idx, c = max(enumerate(a), key = lambda x: ca * cos(radians(x[1])) + sa * sin(radians(x[1])))
    return idx

print(closestangleidx([-33, 90, 150, 122, 798], 45));
→ Ссылка
Автор решения: Ivan

Способ @eri мог допускать неточности. Я написал свой, хоть и больший по объему.

S = [95.90689155937869, 149.91173402702572, 122.17777353112672]

myangles = 220
def find(array, value):
if value <= array[0]:
    return 0
if value >= array[len(array) - 1]:
    return len(array) - 1
for i in range(len(array) - 1):
    if array[i] == value:
        return i
    if value > array[i - 1] and value < array[i]:
        if value - array[i - 1] > array[i] - value:
            return i
        else:
            return i + 1



i = find(S, myangles)
print(i)
→ Ссылка