Я хотел переписать свой ответ, чтобы лучше объяснить ответ на вопрос. Я использую EXCEL для своих формул и градусы для своих единиц.
Для простоты B
- это большее из двух значений, а A
- это меньшее из двух значений. Позже вы можете использовать MAX()
и MIN()
соответственно в своем решении.
ЧАСТЬ 1 - КУДА ПУТЬ?
Сначала мы хотим выяснить, в каком направлении мы хотим выполнить вычисления по часовой стрелке или против часовой стрелки. Мы используем IF()
заявление для этого:
IF( (B-A)<=180, (Clockwise_Formula), (AntiClockwise_Formula) )
Приведенная выше формула проверяет, меньше или равно 180 градусов направление против часовой стрелки от B
до A
(то же самое, что по часовой стрелке от A
до B
) Если нет, идти в другом направлении будет короче.
Чтобы проверить это работает: 90 - 45 = 45 (что меньше или равно 180) делает оператор IF ИСТИНА, поэтому направление по часовой стрелке короче, а 315 - 45 = 270 (что больше 180) делает оператор if FALSE, поэтому формула против часовой стрелки будет короче.
ЧАСТЬ 2 - ФОРМУЛА ЧАСОВ
Теперь вы хотите интерполировать N
раз между A
и B
, по часовой стрелке или против часовой стрелки. Формула по часовой стрелке относительно проста.
Clockwise_Formula: ((B-A)/N*S)+A
Где S
- это счетчик количества интерполяций, начиная с 1 и заканчивая N-1 (Если S = N
, ваш ответ будет B
)
Пример: A
= 90, B
= 270, N
= 4
S=1: ((270-90)/4*1)+90 = 135
S=2: ((270-90)/4*2)+90 = 180
S=3: ((270-90)/4*3)+90 = 225
ЧАСТЬ 3 - ФОРМУЛА ПРОТИВ ЧАСОВ
Формула против часовой стрелки будет немного сложнее, потому что нам нужно будет пересечь против часовой стрелки через угол 360 градусов. Самый простой метод, который я могу придумать, - это добавить 360 к A
, а затем смодулировать ответ на 360 с помощью функции MOD(FORMULA,VALUE)
.
Вам также придется поменять местами A
и B
в формуле, потому что B
теперь является наименьшим числом. (Это может звучать немного странно, но это работает!)
(Unmodulated) AntiClockwise_Formula: (((A+360)-B)/N*S)+B
Пример: A
= 60, B
= 300, N
= 4
S=1: (((60+360)-300)/4*1)+300 = 330
S=2: (((60+360)-300)/4*2)+300 = 360
S=3: (((60+360)-300)/4*3)+300 = 390
ЧАСТЬ 4 - ОГРАНИЧЕНИЕ ОТВЕТОВ НА ОТ 0 И 360
Видите, как иногда (но не всегда) ответы будут больше 360? Вот где начинается обертывание вашей Anticlockwise_formula в функцию MOD()
:
AntiClockwise_Formula: MOD((((A+360)-B)/N*S)+B,360)
Модулирование примера, использованного в части 3, даст вам:
S=1: 330
S=2: 0
S=3: 30
ЧАСТЬ 5 - ВСЕ ВМЕСТЕ
Объединяя все элементы из частей 1-4 вместе, ответ:
IF((B-A)<=180,((B-A)/N*S)+A,MOD((((A+360)-B)/N*S)+B,360))
Где:
A
= Меньшее из двух значений (вы можете заменить A на MIN ())
B
= большее из двух значений (вы можете заменить B на MAX ())
N
= Количество интерполяций, которые вы хотите выполнить (например, 2 - половина, 3 - на трети и т. Д.)
S
= Инкриментальный счет до макс. N-1 (объяснение см. В части 2)