Найти ближайший угол к заданному
Пробовал несколько вариантов. Вот сама задача:
- Есть угол ( значение может быть отрицательным и положительным)
- Есть список с другими углами (значения могут быть отрицательными и положительными).
Необходимо найти в списке наименьший угол, ближайший к заданному углу. Если бы углы были только положительными/отрицательными я бы быстро решил эту задачу, прошу вас помочь мне.
Ответы (3 шт):
Нужно вычесть один угол из другого и нормализовать
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)
)
Посчитайте скалярное произведение единичных векторов, компоненты которых являются косинусом и синусом исходного угла и проверяемых углов. Наибольшее значение этой величины соответствует наиболее близкому углу.
Препод будет доволен, это не хухры-мухры со сравнением самих углов и переходом через 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));
Способ @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)