que quería volver a escribir mi respuesta para explicar mejor responde a la pregunta. Estoy usando EXCEL para mis fórmulas y grados para mis unidades.
Por simplicidad, B
es el mayor de los dos valores, y A
es el menor de los dos valores. Puede usar MAX()
y MIN()
respectivamente en su solución más adelante.
PARTE 1 - ¿QUÉ MANERA DE IR?
Lo que queremos hacer primero es determinar en qué dirección queremos realizar el cálculo, en sentido horario o antihorario. Utilizamos una Declaración IF()
para que:
IF((B-A)<=180, (Clockwise_Formula), (AntiClockwise_Formula))
Los anteriores comprobaciones de Fórmula si va en sentido antihorario B
-A
(que es el mismo que ir hacia la derecha A
-B
) es menor que o igual a 180 grados. Si no, va a ser más corto para ir en la otra dirección.
Para verificar esto: 90 - 45 = 45 (que es menor o igual a 180) hace que la instrucción IF sea TRUE, por lo que la dirección horaria es más corta, pero 315 - 45 = 270 (que es mayor que 180) hace que la sentencia if sea FALSA, por lo que la fórmula en sentido antihorario sería más corta.
PARTE 2 - HACIA LA DERECHA FÓRMULA
Ahora vamos a interpolar N
veces entre A
y B
, ya sea en sentido horario o antihorario. La fórmula a la derecha es relativamente simple.
Clockwise_Formula: ((B-A)/N*S)+A
Dónde S
es un recuento del número de interpolaciones, a partir de 1 y terminando en N-1 (Si S = N
, su respuesta será B
)
Ejemplo: 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
PARTE 3 - ANITCLOCKWISE FORMULA
La fórmula antihoraria va a ser un poco más compleja, porque tendremos que cruzar en sentido antihorario en un ángulo de 360 grados. El método más sencillo que puedo pensar es agregar 360 a A
, luego modular la respuesta en 360 usando la función MOD(FORMULA,VALUE)
.
También tendrá que cambiar A
y B
en la fórmula porque B
es ahora el número más pequeño.(Esto puede sonar un poco confuso, pero funciona!)
(Unmodulated) AntiClockwise_Formula: (((A+360)-B)/N*S)+B
Ejemplo: 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
PARTE 4 - RESTRICCIÓN DE RESPUESTAS A entre 0 y 360
Vea cómo a veces (pero no siempre) las respuestas van a ser mayores que 360? Aquí es donde el envolver su Anticlockwise_formula en una función MOD()
entra en juego:
AntiClockwise_Formula: MOD((((A+360)-B)/N*S)+B,360)
modulante el ejemplo usado en la parte 3 le dará:
S=1: 330
S=2: 0
S=3: 30
PARTE 5 - Poniendo todo junto
Combinando todos los elementos de las Partes 1-4 juntos, la respuesta es:
IF((B-A)<=180,((B-A)/N*S)+A,MOD((((A+360)-B)/N*S)+B,360))
Dónde:
A
= El más pequeño de los dos valores (se puede sustituir A con MIN())
B
= El mayor de los dos valores (se puede sustituir B con MAX())
N
= El número de interpolaciones que desea hacer (por ejemplo, 2 es un medio, 3 es en tres partes, etc.)
S
= Un conteo incrimental a un máximo de N-1 (véase la Parte 2 para la explicación)
Esto funciona bien. Algunos vudú allí. – Ben
[No todos los modulos se comportan igual] (http://stackoverflow.com/q/1907565/190597), pero en Python, esto se puede simplificar a 'shortest_angle = ((end-start) + 180)% 360 - 180 '. – unutbu
¿Puedes explicar por qué los valores? Por lo tanto, se puede convertir a radianes en lugar de grados. – Ismail