Encontre o ângulo entre dois pontos

13

Dados dois pontos Ae B, encontre o ângulo de linha AOa linha BOsobre o ponto Oonde Oestá a origem ( (0,0)). Além disso, o ângulo pode ser positivo ou negativo, dependendo das posições dos pontos (veja exemplos). A entrada será pontos Ae B, e pode ser dada de qualquer forma conveniente. A saída será o ângulo em graus (mas é positivo se AOfor girado no sentido anti-horário sobre a origem a ser BOobtida e negativo se for girado no sentido horário). Se o ângulo for 180 graus, você poderá retornar uma saída negativa ou positiva. Da mesma forma, o ângulo pode ser a versão positiva ou negativa do mesmo ângulo ( 90 degé igual a -270 deg). Exemplos:

  • Entrada: A(5,5) B(5,-5)Saída: -90( AOé girado -90graus para obter BO).

  • Entrada: A(5,-5) B(5,5)Saída: 90( AOé girado 90graus para obter BO).

Isso é , então o código mais curto em bytes vence!

Alien G
fonte
11
Quanta precisão é necessária?
Reto Koradi 26/10/2015
2
Podemos considerar a entrada como dois números complexos?
lirtosiast
5
Qual deve ser a saída se um ponto é (0,0)?
lirtosiast
1
@ThomasKwa Eu não sei sobre o OP, mas o tratei como apenas entrada de número inteiro / número decimal, e a entrada nunca teria um ponto (0,0).
GamrCorps
2
Dica: O ângulo entre AOe BOnormalmente seria chamado de ângulo AOB.
ETHproductions

Respostas:

12

Pitão, 11 bytes

.t-FPM.jMQ6

Demonstração

A entrada é fornecida no formato:

[[Bx, By], [Ax, Ay]]

Se desejar que A seja o primeiro, isso pode ser alterado para 1 byte.

Explicação:

.t-FPM.jMQ6
               Implicit: Q = eval(input())
      .jMQ     Convert input pairs to complex numbers.
    PM         Take their phases (angles in the complex plane).
  -F           Take the difference.
.t        6    Convert to degrees
isaacg
fonte
22

TI-BASIC, 13 bytes

Para calculadoras da série TI-83 + / 84 +.

Degree
Input Y
min(ΔList(R►Pθ(Ans,∟Y

Para usar este programa, digite a lista {x1,x2}através da variável Ans e {y1,y2}no prompt.

lirtosiast
fonte
Um comando TI-BASIC é um único byte?
corsiKa
Todos os comandos aqui, exceto ΔList(, são um byte cada. Isso inclui R►Pθ(.
lirtosiast
+1 apenas para usar a programação da calculadora. Me leva de volta ao Trig and Calculus nos meus dias de escola.
# 26/15
Boa referência! Muito legal.
corsiKa
10

CJam, 14 bytes

q~::ma:-P/180*

Este é um programa completo que lê a entrada como [[Ax Ay] [Bx By]] de STDIN.

Experimente on-line no intérprete CJam .

Como funciona

q~             e# Read and evaluate all input.
  ::ma         e# Replace each point (x, y) with atan2(x, y).
               e# This returns its angle with the positive y axis, measured clockwise.
      :-       e# Compute the difference of the two resulting angles.
               e# This returns the angle between the points, measured counter-clockwise.
        P/180* e# Divide by Pi and multiply by 180 to convert to degrees.
Dennis
fonte
5
Divertindo que quase metade deste programa é apenas converter radianos para graus ...
Darrel Hoffman
@DarrelHoffman acho que é ainda mais divertido que em Pyth a conversão é de 3 bytes em vez de 6, por isso, se o desafio permitido para relatar em radianos as línguas iria ser amarrado
FryAmTheEggman
5

Minkolang 0.9 , 112 bytes

Eu realmente quero implementar funções trigonométricas como built-ins agora ... mas isso foi divertido! (Advertência: isso gera a diferença de ângulo positivo, não a diferença de ângulo assinado. Dadas as minhas limitações, acho que isso se justifica.)

4[n]0c2c*1c3c*+r4[2;1R]r+1R+0g*12$:;$:8[0ci2*3+d1R;0g$:1i1+[i2*1+d1+$:*]*]$+'3.141592654'25*9;$:$:12$:r-66*5**N.

Experimente aqui.

Explicação

Vou postar uma explicação mais completa, se alguém quiser, mas a essência é:

4[n]                                    Take in 4 integers from input
0c2c*1c3c*+                             dot product
r4[2;1R]r+1R+0g*12$:;                   magnitudes of vectors
$:                                      dot product divided by magnitudes (z)
8[0ci2*3+d1R;0g$:1i1+             *]    Taylor series for arccos
                     [i2*1+d1+$:*]      In particular, the coefficient (1/2 * 3/4 * ...)
$+                                      Add them all up!
'3.141592654'25*9;$:$:                  Divide by pi for converting to degrees
12$:r-                                  Subtract from 1/2 - I now have arccos(z)
66*5**                                  Convert to degrees
N.                                      Output as number and stop.
El'endia Starman
fonte
O minkolang suporta comentários? Não consegui encontrá-lo no leia-me.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: É como outras linguagens 2D - os comentários são os que não são alcançados pelo contador de programas.
El'endia Starman 26/10/2015
Oh, ok então. Isso faz sentido, não sei o que eu estava pensando.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Seu uso explícito de comentários em uma de suas respostas me leva a pensar em implementar funcionalidades semelhantes. É uma ideia interessante e não seria muito difícil de implementar.
El'endia Starman 26/10/2015
Obrigado! :DFoi o desafio do Hello World em que você notou os comentários (o FYI, o intérprete que eu fiz para o Simplex, é executado em diferentes "modos": modo de seqüência de caracteres e modo de comentário. Facilita a análise e permite ignorar os caracteres de sinal de um enquanto estiver no outro.)
Conor O'Brien
4

Mathematica, 22 bytes

{-1,1.}.ArcTan@@@#/°&

Exemplo:

In[1]:= {-1,1.}.ArcTan@@@#/°&[{{5,5},{5,-5}}]

Out[1]= -90.

In[2]:= {-1,1.}.ArcTan@@@#/°&[{{5,-5},{5,5}}]

Out[2]= 90.
alefalpha
fonte
Será que isso funciona para entradas como{{0,1},{1,0}}
lirtosiast
@ThomasKwa Claro que sim.
Alephalpha # 27/15
4

Javascript, 66 bytes

let f=(a,b)=>(Math.atan2(b.y,b.x)-Math.atan2(a.y,a.x))*180/Math.PI;

demonstração

lecoco
fonte
23 segundos antes de mim = P Golfe agradável! Aliás, você pode omitir o let f=e ainda é considerado válido como uma função anônima.
Mwr247
3

Julia, 18 25 bytes

f(A,B)=angle(B/A)/pi*180

Isso pressupõe que "qualquer forma conveniente" já permita Ae Bseja dada como números complexos. Então, a aritmética de números complexos faz todo o trabalho pesado.

Editar: snippet convertido para funcionar. A versão de 18 bytes funciona apenas no Julia REPL.

ojdo
fonte
3

Python 2.7, 73 bytes

from math import*
f=lambda A,B:degrees(atan2(B[1],B[0])-atan2(A[1],A[0]))

Teste:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0
Aetienne Sardon
fonte
Bem-vindo ao PPCG! Isso é código-golfe, então você deve tentar remover o máximo de espaços possível e diminuir o seu código.
mbomb007
1
Você pode tornar seu código mais curto por forma imprudente adicionar algum *s em todo o lugar
FryAmTheEggman
3

Oitava, 43 bytes

f=@(a,b)(cart2pol(b)-cart2pol(a))(1)*180/pi

Entrada / Saída:

octave:40> f([5,5],[5,-5])
ans = -90

octave:41> f([1,0],[0,1])
ans = 90
dcsohl
fonte
3

CJam, 15 bytes

l~ma@@ma-P/180*

Pensei que também entrarei no jogo CJam. Experimente online . A entrada está no formato de bx by ax ay. Infelizmente, esse é o método mais curto para fazer esse desafio sem copiar a resposta de Dennis.

GamrCorps
fonte
3

TeaScript, 28 bytes

Eu realmente deveria de funções trigonométricas implementadas ...

$.atan2(_[3]-y,z-x)*180/$.PI

Experimente a entrada on-line éa.x a.y b.x b.y

Explicação

$.atan2(       // Arc Tangent of...
    _[3] - y,  // 4th input - 2nd input
       z - x,  // 3rd input - 1st input
) * 180 / $.PI // Converts rad -> deg
Downgoat
fonte
2

Ruby, 64 , 58 bytes

a=->(b){b.map{|c|Math.atan2(*c)}.reduce(:-)*180/Math::PI}

Uso

a.call [[5, 5], [5, -5]] # => -90.0
a.call [[5, -5], [5, 5]] # => 90.0
Harsh Gupta
fonte
2

JavaScript, 49 bytes

(a,b)=>((c=Math.atan2)(...b)-c(...a))/Math.PI*180

A entrada é obtida no formato: [aY, aX], [bY, bX](observe o x / y invertido)

Mwr247
fonte
1

Simplex v.0.7 , 13 bytes

Fico feliz por ter acrescentado mathrelations: D Infelizmente, não posso aceitar entradas pontuais. Então, insiro cada ponto como um número separado (Ax, Ay, Bx, By). (Eu usei isso como um recurso.)

(iRi~^fR)2LSo
(       )2    ~~ repeat inner twice
 iRi          ~~ take two chars of input (x,y)
    ~         ~~ switch top 2 on stack
     ^f       ~~ apply atan2 on (y,x)
       R      ~~ go right
          L   ~~ go left
           S  ~~ subtract result
            o ~~ output as number

Posso salvar um caractere se eu puder receber informações como (Ay, Ax, By, Bx):

(iRi^fR)2LSo
Conor O'Brien
fonte
1

C, 88 bytes

#include<math.h>
typedef double d;d g(d x,d y,d a,d b){return atan2(b-y,a-x)*180/M_PI;}

Requer a compilação com o GCC para aproveitar a vantagem de M_PIser definido math.hcomo parte das constantes matemáticas internas do GCC . Experimente online - como o ideone não usa o GCC (aparentemente), são necessários alguns bytes adicionais para que dígitos suficientes de π sejam precisos.

Mego
fonte
Ou em 45/atan(1)vez de 180/3.14159....(na demonstração online).
CompuChip
@CompuChip Eu não estava tentando fazer a demo online com o máximo de golfe
Mego
Você pode remover os colchetes em atan2 (por, ax), embora precise de um espaço após o retorno, para economizar apenas 1 byte. Se você pode usar as funções do estilo K&R, então g g (x, y, a, b) x g, y, a, b; também salva seis bytes.
Alchymist