Temukan sudut antara dua titik

13

Diberi dua titik Adan B, cari sudut dari garis AOke garis BOtentang titik di Omana titik Oasal ( (0,0)). Selain itu, sudut mungkin positif atau negatif tergantung pada posisi titik (lihat contoh). Masukan akan berupa poin Adan B, dan dapat diberikan dalam bentuk apa pun yang mudah. Output akan menjadi sudut dalam derajat (tetapi positif jika AOdiputar berlawanan arah jarum jam tentang asal untuk mendapatkan BOdan negatif jika diputar searah jarum jam). Jika sudutnya 180 derajat Anda dapat mengembalikan output negatif atau positif. Demikian pula, sudut dapat menjadi versi positif atau negatif dari sudut yang sama ( 90 degsama dengan -270 deg). Contoh:

  • Input: A(5,5) B(5,-5)Output: -90( AOdiputar -90derajat untuk mendapatkan BO).

  • Input: A(5,-5) B(5,5)Output: 90( AOdiputar 90derajat untuk mendapatkan BO).

Ini adalah , jadi kode terpendek dalam byte menang!

Alien G
sumber
11
Berapa banyak presisi yang dibutuhkan?
Reto Koradi
2
Bisakah kita mengambil input sebagai dua bilangan kompleks?
lirtosiast
5
Apa yang seharusnya menjadi output jika satu titik (0,0)?
lirtosiast
1
@ThomasKwa Saya tidak tahu tentang OP, tapi saya memperlakukannya hanya sebagai input bilangan bulat / desimal, dan inputnya tidak akan pernah memiliki (0,0) poin.
GamrCorps
2
Petunjuk: Sudut antara AOdan BObiasanya akan disebut sudut AOB.
ETHproduk

Jawaban:

12

Pyth, 11 byte

.t-FPM.jMQ6

Demonstrasi

Masukan diberikan dalam format:

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

Jika diinginkan bahwa A lebih dulu, ini dapat diubah untuk 1 byte.

Penjelasan:

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

TI-BASIC, 13 byte

Untuk kalkulator TI-83 + / 84 + series.

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

Untuk menggunakan program ini, masukkan daftar {x1,x2}melalui variabel Ans, dan {y1,y2}saat diminta.

lirtosiast
sumber
Apakah perintah TI-BASIC satu byte?
corsiKa
Semua perintah di sini, kecuali ΔList(, masing-masing satu byte . Ini termasuk R►Pθ(.
lirtosiast
+1 hanya untuk menggunakan pemrograman kalkulator. Membawa saya kembali ke Trig dan Calculus di masa SMA saya.
вʀaᴎᴅᴏƞ вєнᴎєƞ
Referensi yang bagus! Sangat keren.
corsiKa
10

CJam, 14 byte

q~::ma:-P/180*

Ini adalah program lengkap yang membaca input sebagai [[Ax Ay] [Bx By]] dari STDIN.

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

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
sumber
5
Menghibur bahwa hampir setengah dari program ini hanya mengubah radian menjadi derajat ...
Darrel Hoffman
@DarrelHoffman Saya merasa lebih lucu bahwa di Pyth konversi adalah 3 byte, bukan 6, jadi jika tantangan diizinkan untuk melaporkan dalam bahasa radian bahasa akan diikat
FryAmTheEggman
5

Minkolang 0,9 , 112 byte

Saya benar - benar ingin menerapkan fungsi trigonometri sebagai bawaan sekarang ... tapi ini menyenangkan! (Peringatan: ini menghasilkan perbedaan sudut positif, bukan perbedaan sudut yang ditandatangani. Mengingat keterbatasan saya, saya pikir itu dibenarkan.)

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.

Coba di sini.

Penjelasan

Saya akan memposting penjelasan yang lebih lengkap jika ada yang menginginkannya, tetapi intinya adalah:

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
sumber
Apakah minkolang mendukung komentar? Saya tidak dapat menemukannya di readme.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Sama seperti bahasa 2D lainnya - komentar adalah apa pun yang tidak dicapai oleh penghitung program.
El'endia Starman
Oh, baiklah kalau begitu. Masuk akal, tidak tahu apa yang saya pikirkan.
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Penggunaan komentar Anda secara eksplisit di salah satu jawaban Anda membuat saya mempertimbangkan untuk mengimplementasikan fungsi yang serupa. Itu ide yang rapi dan tidak akan terlalu sulit untuk saya terapkan.
El'endia Starman
Terima kasih! :DApakah itu tantangan Hello World yang Anda perhatikan komentarnya (FYI penerjemah yang saya buat untuk Simplex berjalan di "mode" yang berbeda: mode string dan mode komentar. Itu membuatnya sangat mudah untuk menguraikan dan memungkinkan Anda untuk mengabaikan karakter sinyal dari satu mode sementara yang lain.)
Conor O'Brien
4

Mathematica, 22 byte

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

Contoh:

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
sumber
Apakah ini akan berfungsi untuk input seperti{{0,1},{1,0}}
lirtosiast
@ThomasKwa Tentu saja akan.
alephalpha
4

Javascript, 66 byte

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

demo

lecoco
sumber
23 detik sebelum saya = P Golf yang bagus! Btw, Anda dapat menghilangkan let f=, dan itu masih dianggap valid sebagai fungsi anonim.
Mwr247
3

Julia, 18 25 byte

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

Ini mengasumsikan bahwa "segala bentuk yang mudah" sudah memungkinkan Adan Bdiberikan sebagai bilangan kompleks. Kemudian, bilangan aritmatika kompleks melakukan semua pengangkatan berat.

Sunting: cuplikan yang dikonversi berfungsi. Versi 18 byte hanya berfungsi di REPL Julia.

ojdo
sumber
3

Python 2.7, 73 Bytes

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

Uji:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0
Aetienne Sardon
sumber
Selamat datang di PPCG! Ini adalah kode-golf, jadi Anda harus mencoba menghapus sebanyak mungkin ruang dan mempersingkat kode Anda.
mbomb007
1
Anda dapat membuat kode Anda lebih pendek dengan menambahkan sembarangan *di beberapa tempat
FryAmTheEggman
3

Oktaf, 43 byte

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
sumber
3

CJam, 15 byte

l~ma@@ma-P/180*

Kupikir aku akan masuk ke game CJam juga. Cobalah online . Input dalam bentuk bx by ax ay. Sayangnya, ini adalah metode terpendek untuk melakukan tantangan ini tanpa menyalin jawaban Dennis.

GamrCorps
sumber
3

TeaScript, 28 byte

Saya benar-benar harus menerapkan fungsi trig ...

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

Coba input online inia.x a.y b.x b.y

Penjelasan

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

Ruby, 64 , 58 byte

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

Pemakaian

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

JavaScript, 49 byte

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

Input diambil dalam bentuk: [aY, aX], [bY, bX](perhatikan pembalikan x / y)

Mwr247
sumber
1

Simplex v.0.7 , 13 byte

Saya senang saya menambahkan mathrelations: D Sayangnya, saya tidak dapat mengambil input yang tepat. Jadi, saya memasukkan setiap titik sebagai angka yang terpisah (Ax, Ay, Bx, By). (Saya menggunakan ini sebagai sumber daya.)

(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

Saya dapat menyimpan char jika saya dapat mengambil input sebagai (Ay, Ax, By, Bx):

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

C, 88 byte

#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;}

Membutuhkan kompilasi dengan GCC untuk mengambil keuntungan dari M_PIdidefinisikan math.hsebagai bagian dari konstanta matematika bawaan GCC . Cobalah online - karena ideone tidak menggunakan GCC (tampaknya), beberapa byte tambahan diperlukan untuk enough angka yang cukup agar akurat.

Mego
sumber
Atau 45/atan(1)alih-alih 180/3.14159....(dalam demo online).
CompuChip
@CompuChip Saya tidak mencoba membuat demo online golf secara maksimal
Mego
Anda dapat menghapus kurung atan2 (by, kapak), meskipun Anda kemudian membutuhkan ruang setelah kembali sehingga hanya menghemat 1 byte. Jika Anda dapat menggunakan fungsi gaya K&R maka g ganda (x, y, a, b) gandakan x, y, a, b; juga menghemat enam byte.
Alchymist