Найти угол между двумя точками

13

Учитывая две точки Aи B, найдите угол от линии AOк линии BOотносительно точки, Oгде Oнаходится начало координат ( (0,0)). Кроме того, угол может быть положительным или отрицательным в зависимости от положения точек (см. Примеры). Ввод будет указывать точки Aи B, и может быть дан в любой удобной форме. Вывод будет углом в градусах (но он будет положительным, если AOего повернуть против часовой стрелки относительно начала координат, BOи отрицательным, если его повернуть по часовой стрелке). Если угол составляет 180 градусов, вы можете вернуть отрицательный или положительный результат. Точно так же угол может быть положительным или отрицательным вариантом того же угла ( 90 degравен -270 deg). Примеры:

  • Вход: A(5,5) B(5,-5)Выход: -90( AOповернут в -90градусах, чтобы получить BO).

  • Вход: A(5,-5) B(5,5)Выход: 90( AOповернут в 90градусах, чтобы получить BO).

Это , поэтому выигрывает самый короткий код в байтах!

Чужой G
источник
11
Какая точность требуется?
Рето Коради
2
Можем ли мы принять входные данные как два комплексных числа?
Lirtosiast
5
Каким должен быть выход, если есть одна точка (0,0)?
Lirtosiast
1
@ThomasKwa Я не знаю об OP, но я рассматривал его как ввод только целых / десятичных чисел, и ввод никогда не будет иметь (0,0) точки.
GamrCorps
2
Подсказка: угол между AOи BOобычно называется углом AOB.
ETHproductions

Ответы:

12

Pyth, 11 байт

.t-FPM.jMQ6

демонстрация

Вход дан в формате:

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

Если желательно, чтобы A был первым, это можно изменить на 1 байт.

Объяснение:

.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
источник
22

TI-BASIC, 13 байтов

Для калькуляторов серии TI-83 + / 84 +.

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

Чтобы использовать эту программу, введите список {x1,x2}через переменную Ans и {y1,y2}в командной строке.

lirtosiast
источник
Является ли команда TI-BASIC одним байтом?
CorsiKa
Все команды здесь, за исключением того ΔList(, являются один байт каждый. Это включает в себя R►Pθ(.
Lirtosiast
+1 только для использования калькулятора программирования. Возвращает меня в Триг и Исчисление в школьные годы.
ʀʀᴎᴅᴏƞᴎᴅᴏƞєᴎєƞᴎєƞ
Хорошая ссылка! Очень круто.
CorsiKa
10

CJam, 14 байтов

q~::ma:-P/180*

Это полная программа, которая читает входные данные как [[Ax Ay] [Bx By]]из STDIN.

Попробуйте онлайн в интерпретаторе CJam .

Как это устроено

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.
Деннис
источник
5
Забавно, что почти половина этой программы просто конвертирует радианы в градусы ...
Даррел Хоффман
@DarrelHoffman Я нахожу еще более забавным, что в Pyth преобразование составляет 3 байта вместо 6, поэтому, если задача, разрешенная для сообщения в радианах, будет связана с
языками
5

Минколанг 0,9 , 112 байт

Я действительно хочу реализовать функции триггеров как встроенные модули ... но это было весело! (Предостережение: это выводит положительную разность углов, а не разность углов со знаком. Учитывая мои ограничения, я думаю, что это оправдано.)

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.

Попробуй это здесь.

объяснение

Я опубликую более полное объяснение, если кто-то захочет, но суть его такова:

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'ndia Starman
источник
Поддерживает ли Минколанг комментарии? Я не мог найти это в readme.
Конор О'Брайен
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Это так же, как и другие двумерные языки - комментарии - это то, чего не достиг счетчик программы.
El'endia Starman
Ох, тогда ладно. Это имеет смысл, не знаю, о чем я думал.
Конор О'Брайен,
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Ваше явное использование комментариев в одном из ваших ответов заставляет меня задуматься о реализации аналогичной функциональности. Это изящная идея, и мне будет не очень сложно ее реализовать.
El'endia Starman
Благодарность! :DБыл ли это вызов Hello World, когда вы обратили внимание на комментарии в (FYI, интерпретатор, который я сделал для Simplex, работает в разных «режимах»: строковом режиме и режиме комментариев. Это действительно облегчает анализ и позволяет игнорировать сигнальные символы одного режим пока в другом.)
Конор О'Брайен
4

Mathematica, 22 байта

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

Пример:

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
источник
Will this work for inputs like {{0,1},{1,0}}
lirtosiast
@ThomasKwa Of course it will.
alephalpha
4

Javascript, 66 bytes

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

demo

lecoco
источник
23 seconds before me =P Nice golf though! Btw, you can omit the let f=, and it's still considered valid as an anonymous function.
Mwr247
3

Julia, 18 25 bytes

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

This assumes that "any convenient form" already allows for A and B to be given as complex numbers. Then, the complex number arithmetic does all the heavy lifting.

Edit: converted snippet to function. 18 byte version only works in the Julia REPL.

ojdo
источник
3

Python 2.7, 73 Bytes

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

Test:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0
Aetienne Sardon
источник
Welcome to PPCG! This is code-golf, so you should try to remove as many spaces as you can and shorten your code.
mbomb007
1
You can make your code shorter by recklessly adding some *s all over the place
FryAmTheEggman
3

Octave, 43 bytes

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

Input/Output:

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

octave:41> f([1,0],[0,1])
ans = 90
dcsohl
источник
3

CJam, 15 bytes

l~ma@@ma-P/180*

Thought I'll get in the CJam game as well. Try it online. Input is in form of bx by ax ay. Unfortunately, this is the shortest method of doing this challenge without copying Dennis' answer.

GamrCorps
источник
3

TeaScript, 28 bytes

I really should of implemented trig functions...

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

Try it online input is a.x a.y b.x b.y

Explanation

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

Ruby, 64, 58 bytes

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

Usage

a.call [[5, 5], [5, -5]] # => -90.0
a.call [[5, -5], [5, 5]] # => 90.0
Harsh Gupta
источник
2

JavaScript, 49 bytes

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

Input is taken in form: [aY, aX], [bY, bX] (notice the reversed x/y)

Mwr247
источник
1

Simplex v.0.7, 13 bytes

I'm glad I added mathrelations :D Unfortunately, I cannot take pointwise input. So, I input each point as a separate number (Ax, Ay, Bx, By). (I used this as a resource.)

(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

I can save a char if I can take input as (Ay, Ax, By, Bx):

(iRi^fR)2LSo
Conor O'Brien
источник
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;}

Requires compiling with GCC to take advantage of M_PI being defined in math.h as a part of GCC's built-in math constants. Try it online - since ideone doesn't use GCC (apparently), an additional few bytes are needed for enough digits of π to be accurate.

Mego
источник
Or 45/atan(1) instead of 180/3.14159.... (in the online demo).
CompuChip
@CompuChip I wasn't trying to make the online demo maximally golfed
Mego
You can remove the brackets round atan2(b-y,a-x), although you then need a space after return so it only saves 1 byte. If you can use K&R style functions then double g(x,y,a,b)double x,y,a,b; also saves six bytes.
Alchymist