Dados 2 ângulos no intervalo -PI -> PI em torno de uma coordenada, qual é o valor do menor dos 2 ângulos entre eles?
Tendo em conta que a diferença entre PI e -PI não é 2 PI, mas zero.
Exemplo:
Imagine um círculo, com 2 linhas saindo do centro, existem 2 ângulos entre essas linhas, o ângulo que fazem no interior, também conhecido como ângulo menor , e o ângulo que fazem do lado de fora, também conhecido como ângulo maior. Ambos os ângulos, quando somados, formam um círculo completo. Dado que cada ângulo pode caber dentro de um determinado intervalo, qual é o menor valor de ângulos, levando em consideração a rolagem
language-agnostic
geometry
angle
Tom J Nowell
fonte
fonte
Respostas:
Isso fornece um ângulo assinado para qualquer ângulo:
Cuidado em muitos idiomas: a
modulo
operação retorna um valor com o mesmo sinal que o dividendo (como C, C ++, C #, JavaScript, lista completa aqui ). Isso requer umamod
função personalizada da seguinte forma:Ou então:
Se os ângulos estão dentro de [-180, 180], isso também funciona:
De uma maneira mais detalhada:
fonte
a -= 360*sgn(a)*(abs(a) > 180)
. (Venha para pensar sobre isso, se você tiver implementações sem ramos desgn
eabs
, em seguida, que o poder característica realmente começar a compensar precisando duas multiplicações.)double targetA = 2; double sourceA = 359;
'a' será igual a -357,0 em vez de 3.0x é o ângulo alvo. y é a fonte ou o ângulo inicial:
Retorna o ângulo delta assinado. Observe que, dependendo da sua API, a ordem dos parâmetros para a função atan2 () pode ser diferente.
fonte
x-y
fornece a diferença de ângulo, mas pode estar fora dos limites desejados. Pense neste ângulo que define um ponto no círculo unitário. As coordenadas desse ponto são(cos(x-y), sin(x-y))
.atan2
retorna o ângulo para esse ponto (que é equivalente ax-y
), exceto que seu intervalo é [-PI, PI].Se seus dois ângulos são x e y, então um dos ângulos entre eles é abs (x - y). O outro ângulo é (2 * PI) - abs (x - y). Portanto, o valor do menor dos 2 ângulos é:
Isso fornece o valor absoluto do ângulo e assume que as entradas estão normalizadas (ou seja: dentro da faixa
[0, 2π)
).Se você deseja preservar o sinal (ou seja: direção) do ângulo e também aceitar ângulos fora do intervalo,
[0, 2π)
você pode generalizar o que foi descrito acima. Aqui está o código Python para a versão generalizada:Observe que o
%
operador não se comporta da mesma maneira em todos os idiomas, principalmente quando valores negativos estão envolvidos; portanto, se for necessário portar alguns ajustes de sinal.fonte
from math import tau
.Eu enfrento o desafio de fornecer a resposta assinada:
fonte
Para usuários do UnityEngine, a maneira mais fácil é usar o Mathf.DeltaAngle .
fonte
Solução aritmética (em oposição à algorítmica):
fonte
Um código eficiente em C ++ que funciona para qualquer ângulo e em ambos: radianos e graus é:
fonte
Não há necessidade de calcular funções trigonométricas. O código simples na linguagem C é:
seja dif = a - b, em radianos
Seja dif = a - b, em graus
Sem pecado, sem cos, sem bronzeado, .... apenas geometria !!!!
fonte
arg = arg - PIV2;
expande paraarg = arg - M_PI + M_PI
e assim nada faz.