Em uma linguagem de programação (Python, C #, etc), preciso determinar como calcular o ângulo entre uma linha e o eixo horizontal?
Eu acho que uma imagem descreve melhor o que eu quero:
Dado (P1 x , P1 y ) e (P2 x , P2 y ) qual é a melhor maneira de calcular esse ângulo? A origem está no topleft e apenas o quadrante positivo é usado.
c#
python
trigonometry
orlp
fonte
fonte
Respostas:
Primeiro encontre a diferença entre o ponto inicial e o ponto final (aqui, este é mais um segmento de linha direcionado, não uma "linha", pois as linhas se estendem infinitamente e não iniciam em um ponto específico).
Em seguida, calcule o ângulo (que vai do eixo X positivo em
P1
ao eixo Y positivo emP1
).Mas
arctan
pode não ser o ideal, porque dividir as diferenças dessa maneira apagará a distinção necessária para distinguir em qual quadrante o ângulo está (veja abaixo). Use o seguinte se o seu idioma incluir umaatan2
função:EDIT (22 de fevereiro de 2017): No entanto, em geral, ligar
atan2(deltaY,deltaX)
apenas para obter o ângulo adequadocos
esin
pode ser deselegante. Nesses casos, muitas vezes você pode fazer o seguinte:(deltaX, deltaY)
como um vetor.deltaX
edeltaY
pelo comprimento do vetor (sqrt(deltaX*deltaX+deltaY*deltaY)
), a menos que o comprimento seja 0.deltaX
será agora o cosseno do ângulo entre o vetor e o eixo horizontal (na direção do eixo X positivo para o eixo Y positivo emP1
).deltaY
agora será o seno desse ângulo.EDIT (28 de fevereiro de 2017): Mesmo sem normalizar
(deltaX, deltaY)
:deltaX
indica se o cosseno descrito na etapa 3 é positivo ou negativo.deltaY
indica se o seno descrito na etapa 4 é positivo ou negativo.deltaX
edeltaY
lhe dirão em que quadrante o ângulo está, em relação ao eixo X positivo emP1
:+deltaX
,+deltaY
: 0 a 90 graus.-deltaX
,+deltaY
: 90 a 180 graus.-deltaX
,-deltaY
: 180 a 270 graus (-180 a -90 graus).+deltaX
,-deltaY
: 270 a 360 graus (-90 a 0 graus).Uma implementação em Python usando radianos (fornecida em 19 de julho de 2015 por Eric Leschinski, que editou minha resposta):
Todos os testes são aprovados. Consulte https://en.wikipedia.org/wiki/Unit_circle
fonte
90 - angleInDegrees
:?Desculpe, mas tenho certeza de que a resposta de Peter está errada. Observe que o eixo y desce a página (comum em gráficos). Como tal, o cálculo deltaY deve ser revertido ou você recebe a resposta errada.
Considerar:
dá
Portanto, se no exemplo acima, P1 é (1,1) e P2 é (2,2) [porque Y aumenta a página], o código acima dará 45,0 graus para o exemplo mostrado, o que está errado. Altere a ordem do cálculo deltaY e ele funcionará corretamente.
fonte
double arc = Math.atan2(mouse.y - obj.getPy(), mouse.x - obj.getPx()); degrees = Math.toDegrees(arc); if (degrees < 0) degrees += 360; else if (degrees > 360) degrees -= 360;
Eu encontrei uma solução em Python que está funcionando bem!
fonte
Considerando a pergunta exata, colocando-nos em um sistema de coordenadas "especial" em que eixo positivo significa mover para baixo (como uma tela ou uma exibição de interface), você precisa adaptar esta função assim e negar as coordenadas Y:
Exemplo no Swift 2.0
Esta função fornece uma resposta correta para a pergunta. A resposta está em radianos, portanto, o uso, para visualizar ângulos em graus, é:
fonte
Com base na referência "Peter O" .. Aqui está a versão java
fonte
função matlab:
fonte
Uma fórmula para um ângulo de 0 a 2pi.
Se x = x2-x1 e y = y2-y1, a fórmula está funcionando para
qualquer valor de x e y. Para x = y = 0, o resultado é indefinido.
f (x, y) = pi () - pi () / 2 * (1 + sinal (x)) * (1 sinal (y ^ 2))
fonte
fonte
Teste
Para testar eu deixei hipótese gerar casos de teste.
fonte