Encuentra el ángulo entre dos puntos

13

Dados dos puntos Ay B, encuentre el ángulo de línea AOa línea BOsobre el punto Odonde Oestá el origen ( (0,0)). Además, el ángulo puede ser positivo o negativo dependiendo de las posiciones de los puntos (ver ejemplos). La entrada será puntos Ay B, y se puede dar en cualquier forma conveniente. La salida será el ángulo en grados (pero es positivo si AOse gira en sentido antihorario sobre el origen a obtener BOy negativo si se gira en sentido horario). Si el ángulo es de 180 grados, puede devolver una salida negativa o positiva. Del mismo modo, el ángulo puede ser la versión positiva o negativa del mismo ángulo ( 90 deges igual a -270 deg). Ejemplos:

  • Entrada: A(5,5) B(5,-5)Salida: -90( AOse rota -90grados para obtener BO).

  • Entrada: A(5,-5) B(5,5)Salida: 90( AOse rota 90grados para obtener BO).

Este es el , por lo que gana el código más corto en bytes.

Alien G
fuente
11
¿Cuánta precisión se requiere?
Reto Koradi
2
¿Podemos tomar la entrada como dos números complejos?
lirtosiast
55
¿Cuál debería ser la salida si un punto es (0,0)?
lirtosiast
1
@ThomasKwa No sé sobre el OP, pero lo traté como solo una entrada de número entero / decimal, y la entrada nunca tendría un punto (0,0).
GamrCorps
2
Sugerencia: el ángulo entre AOy BOgeneralmente se llamaría ángulo AOB.
ETHproductions

Respuestas:

12

Pyth, 11 bytes

.t-FPM.jMQ6

Demostración

La entrada se da en el formato:

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

Si se desea que A venga primero, esto se puede cambiar por 1 byte.

Explicación:

.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
fuente
22

TI-BASIC, 13 bytes

Para calculadoras de la serie TI-83 + / 84 +.

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

Para usar este programa, ingrese a la lista a {x1,x2}través de la variable Ans y {y1,y2}en el indicador.

lirtosiast
fuente
¿Es un comando TI-BASIC un solo byte?
corsiKa
Todos los comandos aquí, excepto ΔList(, son un byte cada uno. Esto incluye R►Pθ(.
lirtosiast
+1 solo por usar la programación de la calculadora. Me lleva de vuelta a Trig and Calculus en mis días de secundaria.
вʀaᴎᴅᴏƞ вєнᴎєƞ
Buena referencia! Super guay.
corsiKa
10

CJam, 14 bytes

q~::ma:-P/180*

Este es un programa completo que lee la entrada [[Ax Ay] [Bx By]]desde STDIN.

Pruébelo en línea en el intérprete de CJam .

Cómo 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
fuente
55
Divertido que casi la mitad de este programa solo está convirtiendo radianes a grados ...
Darrel Hoffman
@DarrelHoffman Me resulta aún más divertido que en Pyth la conversión sea de 3 bytes en lugar de 6, por lo que si el desafío permitiera informar en radianes, los idiomas estarían vinculados
FryAmTheEggman
5

Minkolang 0.9 , 112 bytes

Yo realmente quiero para implementar funciones trigonométricas como muebles empotrados ahora ... pero esto era divertido! (Advertencia: esto genera la diferencia de ángulo positiva, no la diferencia de ángulo con signo. Dadas mis limitaciones, creo que eso está justificado).

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.

Pruébalo aquí.

Explicación

Publicaré una explicación más completa si alguien lo quiere, pero lo esencial es:

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
fuente
¿Minkolang admite comentarios? No pude encontrarlo en el archivo Léame.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Es como otros lenguajes 2D: los comentarios son lo que no alcanza el contador del programa.
El'endia Starman
Oh, está bien entonces. Eso tiene sentido, no sé lo que estaba pensando.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Sin embargo, su uso explícito de los comentarios en una de sus respuestas me hace considerar implementar una funcionalidad similar. Es una buena idea y no sería muy difícil de implementar para mí.
El'endia Starman
¡Gracias! :D¿Fue usted el desafío de Hello World en el que notó los comentarios? modo mientras que en el otro.)
Conor O'Brien
4

Mathematica, 22 bytes

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

Ejemplo:

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

Out[1]= -90.

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

Out[2]= 90.
alephalpha
fuente
¿ {{0,1},{1,0}}
Funcionará
@ThomasKwa Por supuesto que lo hará.
alephalpha
4

Javascript, 66 bytes

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

manifestación

lecoco
fuente
23 segundos antes que yo = P ¡Buen golf! Por cierto, puede omitir el let f=, y todavía se considera válido como una función anónima.
Mwr247
3

Julia, 18 25 bytes

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

Esto supone que "cualquier forma conveniente" ya permite Ay Bse dará como números complejos. Entonces, la aritmética de números complejos hace todo el trabajo pesado.

Editar: fragmento convertido para funcionar. La versión de 18 bytes solo funciona en Julia REPL.

ojdo
fuente
3

Python 2.7, 73 bytes

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

Prueba:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0
Aetienne Sardon
fuente
Bienvenido a PPCG! Este es el código de golf, por lo que debe intentar eliminar tantos espacios como sea posible y acortar su código.
mbomb007
1
Puede acortar su código agregando imprudentemente algunos *s por todas partes
FryAmTheEggman
3

Octava, 43 bytes

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

De entrada y salida:

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

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

CJam, 15 bytes

l~ma@@ma-P/180*

Pensé que también entraría en el juego de CJam. Pruébalo en línea . La entrada está en forma de bx by ax ay. Desafortunadamente, este es el método más corto para hacer este desafío sin copiar la respuesta de Dennis.

GamrCorps
fuente
3

TeaScript, 28 bytes

Realmente debería de implementar funciones trigonométricas ...

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

Pruébalo en línea entrada esa.x a.y b.x b.y

Explicación

$.atan2(       // Arc Tangent of...
    _[3] - y,  // 4th input - 2nd input
       z - x,  // 3rd input - 1st input
) * 180 / $.PI // Converts rad -> deg
Downgoat
fuente
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
Harup Gupta
fuente
2

JavaScript, 49 bytes

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

La entrada se toma en forma: [aY, aX], [bY, bX](observe el x / y invertido)

Mwr247
fuente
1

Simplex v.0.7 , 13 bytes

Me alegro de haber agregado mathrelations: D Desafortunadamente, no puedo tomar información puntual. Entonces, ingreso cada punto como un número separado (Ax, Ay, Bx, By). (Usé esto como un 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

Puedo guardar un carácter si puedo tomar datos como (Ay, Axe, By, Bx):

(iRi^fR)2LSo
Conor O'Brien
fuente
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;}

Requiere compilar con GCC para aprovechar M_PIsu definición math.hcomo parte de las constantes matemáticas integradas de GCC . Pruébelo en línea : dado que ideone no usa GCC (aparentemente), se necesitan unos pocos bytes adicionales para que los dígitos suficientes de π sean precisos.

Mego
fuente
O en 45/atan(1)lugar de 180/3.14159....(en la demostración en línea).
CompuChip
@CompuChip No estaba tratando de hacer que la demostración en línea jugara al máximo
Mego
Puede quitar los corchetes alrededor de atan2 (by, ax), aunque luego necesita un espacio después del retorno para que solo ahorre 1 byte. Si puede usar las funciones de estilo K&R, entonces doble g (x, y, a, b) doble x, y, a, b; También ahorra seis bytes.
Alchymist