Найдите, ли угол в X градусах от другого

Давайте посмотрим

d[t].append(c)

, Каково значение [1 110]? Попробуйте его.

d = {}
t = 0
d[t]

, Что Вы получаете? О. Нет ничего в [1 111], который имеет ключ [1 112].

Теперь попытка это.

d[t] = []
d[t]

Ahh. Теперь существует что-то в [1 113] с ключом [1 114].

существует несколько вещей, которые можно сделать.

  1. пример Использования 2.
  2. Использование setdefault. d.setdefault(t,[]).append(c).
  3. Использование collections.defaultdict. Вы использовали бы defaultdict(list) вместо простого словаря, {}.

Редактирование 1. Оптимизация

Данный входные строки из файла в вышеупомянутой форме: ts, x, y, процесс группировки бесполезен. Нет никакой причины пойти из простого списка (ts, x, y) к более сложному списку (ts, (x, y), (x, y), (x, y)...). Исходный список может быть обработан точно, когда он прибыл.

d= collections.defaultdict(list)
for ts, x, y in someFileOrListOrQueryOrWhatever:
    d[ts].append( (x,y) )

Редактирование 2. Ответьте на Вопрос

"при инициализации словаря, необходимо ли сказать словарь, на что будет похожа структура данных в виде пар "ключ-значение"?"

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

Пример 2 .

Инициализация

d= {}

Использование

if t not in d:
    d[t] = list()
d[t].append( c )

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

инициализация Setdefault

d= {}

Использование

d.setdefault(t,list()).append( c )

В этом случае, мы используем setdefault метод, чтобы или выбрать значение, связанное с ключом или создать новую стоимость, связанную с недостающим ключом.

инициализация dict

по умолчанию

import collections
d = collections.defaultdict(list)

Использование

d[t].append( c )

defaultdict использование инициализатор функционируют для недостающих ключей. В этом случае мы обеспечиваем эти list функция так, чтобы новый, пустой список был создан для недостающего ключа.

8
задан Community 8 February 2017 в 14:16
поделиться

4 ответа

попробуйте следующую формулу:

360-(|a-b|)%360<x || (|a-b|)%360<x

Или в PHP :

<?php

$b = 10;
$angle1 = -179;
$angle2 = 180;

$diff = $angle1 - $angle2;
if(abs($diff % 360) <= $b || (360-abs($diff % 360))<=$b) {
  echo "yes";
} else {
  echo "no";
}

?>
7
ответ дан 5 December 2019 в 14:04
поделиться

Вы также можете использовать скалярное произведение:

cos(a)*cos(b) + sin(a)*sin(b) >= cos(x)
1
ответ дан 5 December 2019 в 14:04
поделиться

Как справедливо указывает Марсель, по модулю отрицательных чисел потенциально проблематично. Кроме того, в чем разница между 355 и 5 градусами? Возможно, это будет 350 градусов, но люди, вероятно, ожидают 10 градусов. Мы делаем следующие предположения:

  1. нам нужен наименьший положительный угол между двумя другими углами, поэтому 0 <= diff <= 180 ;
  2. мы работаем в градусах. Если в радианах, замените 360 на 2 * PI ;
  3. углы могут быть положительными или отрицательными, могут быть вне диапазона -360 , где x - входной угол, а
  4. порядок ввода углов или направление разницы не имеет значения.

Входные данные: углы a и b. Таким образом, алгоритм прост:

  1. Нормализовать a и b до 0 <= x <360 ;
  2. Вычислить кратчайший угол между двумя нормальными углами.

Для первого шага, чтобы преобразовать угол в желаемый диапазон, есть две возможности:

  • x> = 0 : normal = x% 360
  • x <0 : normal = (-x / 360 + 1) * 360 + x

Второй предназначен для устранения любой неоднозначности в интерпретации операций отрицательного модуля. Итак, чтобы дать рабочий пример для x = -400:

  -x / 360 + 1
= -(-400) / 360 + 1
= 400 / 360 + 1
= 1 + 1
= 2

, затем

normal = 2 * 360 + (-400)
       = 320

, поэтому для входов 10 и -400 нормальные углы равны 10 и 320.

Теперь мы вычисляем кратчайший угол между ними. Для проверки работоспособности сумма этих двух углов должна составлять 360. В этом случае возможные варианты равны 50 и 310 (нарисуйте это, и вы увидите это). Чтобы решить эти проблемы:

normal1 = min(normal(a), normal(b))
normal2 = max(normal(a), normal(b))
angle1 = normal2 - normal1
angle2 = 360 + normal1 - normal2

Итак, для нашего примера:

normal1 = min(320, 10) = 10
normal2 = max(320, 10) = 320
angle1 = normal2 - normal1 = 320 - 10 = 310
angle2 = 360 + normal1 - normal2 = 360 + 10 - 320 = 50

You '

3
ответ дан 5 December 2019 в 14:04
поделиться

Для радиуса 1 расстояние между конечными точками линии равно 2sin ((ab / 2). Так что отбросьте 2, поскольку вас интересует только сравнение, и сравните sin (x / 2) на sin ((ab) / 2). Триггерные функции заботятся обо всем обертывании.

1
ответ дан 5 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: