Tìm góc giữa hai điểm


13

Với hai điểm AB, tìm góc từ dòng AOđến dòng BOvề điểm Onơi Olà nguồn gốc ( (0,0)). Ngoài ra, góc có thể dương hoặc âm tùy thuộc vào vị trí của các điểm (xem ví dụ). Đầu vào sẽ là các điểm AB, và có thể được đưa ra dưới bất kỳ hình thức thuận tiện nào. Đầu ra sẽ là góc tính theo độ (nhưng nó là dương nếu AOđược quay ngược chiều kim đồng hồ về gốc BOtọa độ và âm nếu nó được xoay theo chiều kim đồng hồ). Nếu góc là 180 độ, bạn có thể trả lại đầu ra âm hoặc dương. Tương tự, góc có thể là phiên bản dương hoặc âm của cùng một góc ( 90 degbằng -270 deg). Ví dụ:

  • Đầu vào: A(5,5) B(5,-5)Đầu ra: -90( AOđược xoay -90độ để lấy BO).

  • Đầu vào: A(5,-5) B(5,5)Đầu ra: 90( AOđược xoay 90độ để lấy BO).

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


11
Cần bao nhiêu độ chính xác?
Reto Koradi

2
Chúng ta có thể lấy đầu vào là hai số phức?
lirtosiast

5
Đầu ra phải là gì nếu một điểm là (0,0)?
lirtosiast

1
@ThomasKwa Tôi không biết về OP, nhưng tôi chỉ coi nó là đầu vào số nguyên / số thập phân và đầu vào sẽ không bao giờ có điểm (0,0).
GamrCorps

2
Gợi ý: Góc giữa AOBOthường được gọi là góc AOB.
Sản phẩm ETH

Câu trả lời:


12

Bình thường, 11 byte

.t-FPM.jMQ6

Trình diễn

Đầu vào được đưa ra trong định dạng:

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

Nếu muốn A đến trước, điều này có thể được thay đổi trong 1 byte.

Giải trình:

.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

22

TI-BASIC, 13 byte

Đối với máy tính sê-ri TI-83 + / 84 +.

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

Để sử dụng chương trình này, hãy nhập danh sách {x1,x2}thông qua biến Ans và {y1,y2}tại dấu nhắc.


Là một lệnh TI-BASIC là một byte đơn?
corsiKa

Tất cả các lệnh ở đây, ngoại trừ ΔList(, là một byte mỗi. Điều này bao gồm R►Pθ(.
lirtosiast

+1 chỉ để sử dụng lập trình máy tính. Đưa tôi trở lại Trig và Giải tích trong những ngày học trung học.
вʀaᴎᴅᴏƞ вєнᴎєƞ

Tham khảo tốt đẹp! Siêu mát.
corsiKa

10

CJam, 14 byte

q~::ma:-P/180*

Đây là một chương trình đầy đủ đọc đầu vào như [[Ax Ay] [Bx By]]từ STDIN.

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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
Thật thú vị khi gần một nửa chương trình này chỉ chuyển đổi radian sang độ ...
Darrel Hoffman

@DarrelHoffman Tôi thấy thú vị hơn nữa là trong Pyth, chuyển đổi là 3 byte thay vì 6, vì vậy, nếu thử thách cho phép báo cáo bằng radian, các ngôn ngữ sẽ bị ràng buộc
FryAmTheEggman

5

Chồn 0,9 , 112 byte

Tôi thực sự muốn thực hiện các chức năng trig như được tích hợp ngay bây giờ ... nhưng điều này thật thú vị! (Hãy cẩn thận: điều này tạo ra sự khác biệt góc dương, không phải là sự khác biệt góc đã ký. Với những hạn chế của tôi, tôi nghĩ đó là hợp lý.)

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.

Hãy thử nó ở đây.

Giải trình

Tôi sẽ đăng một lời giải thích đầy đủ hơn nếu bất cứ ai muốn nó, nhưng ý chính của nó là:

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.

Có chồn ủng hộ ý kiến? Tôi không thể tìm thấy nó trên readme.
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ: Nó cũng giống như các ngôn ngữ 2D khác - nhận xét là bất cứ điều gì không đạt được bởi bộ đếm chương trình.
El'endia Starman

Oh được rồi. Điều đó có ý nghĩa, dunno những gì tôi đã nghĩ.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ: Việc sử dụng bình luận rõ ràng của bạn trong một trong những câu trả lời của bạn khiến tôi cân nhắc việc thực hiện chức năng tương tự. Đó là một ý tưởng gọn gàng và sẽ không quá khó để tôi thực hiện.
El'endia Starman

Cảm ơn! :DCó phải đó là thử thách Hello World mà bạn nhận thấy các nhận xét trong (FYI trình thông dịch tôi đã thực hiện cho Simplex chạy ở các "chế độ" khác nhau: chế độ chuỗi và chế độ nhận xét. Nó thực sự dễ dàng phân tích và cho phép bạn bỏ qua các ký tự tín hiệu của một chế độ trong khi ở chế độ khác.)
Conor O'Brien

4

Toán học, 22 byte

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

Thí dụ:

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

Out[1]= -90.

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

Out[2]= 90.

Điều này có hoạt động cho các đầu vào như{{0,1},{1,0}}
lirtosiast

@ThomasKwa Tất nhiên rồi.
alephalpha

4

Javascript, 66 byte

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

bản giới thiệu


23 giây trước tôi = P Dù chơi golf đẹp! Btw, bạn có thể bỏ qua let f=và nó vẫn được coi là hợp lệ như một hàm ẩn danh.
Mwr247

3

Julia, 18 25 byte

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

Điều này giả định rằng "bất kỳ hình thức thuận tiện" nào đã cho phép ABđược đưa ra dưới dạng số phức. Sau đó, số học số phức làm tất cả các công việc nặng.

Chỉnh sửa: chuyển đoạn trích thành chức năng. Phiên bản 18 byte chỉ hoạt động trong Julia REPL.


3

Python 2.7, 73 byte

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

Kiểm tra:

f((5,5),(5,-5)) #-90.0
f((5,-5),(5,5)) #90.0

Chào mừng đến với PPCG! Đây là môn đánh gôn, vì vậy bạn nên cố gắng xóa càng nhiều khoảng trống càng tốt và rút ngắn mã của mình.
mbomb007

1
Bạn có thể làm cho mã của bạn ngắn hơn bằng cách thiếu thận trọng thêm một số *ở khắp mọi nơi
FryAmTheEggman

3

Octave, 43 byte

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

Đầu ra đầu vào:

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

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

3

CJam, 15 byte

l~ma@@ma-P/180*

Nghĩ rằng tôi cũng sẽ tham gia vào trò chơi CJam. Hãy thử trực tuyến . Đầu vào ở dạng bx by ax ay. Thật không may, đây là phương pháp ngắn nhất để thực hiện thử thách này mà không sao chép câu trả lời của Dennis.


3

TeaScript, 28 byte

Tôi thực sự nên thực hiện các chức năng trig ...

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

Hãy thử đầu vào trực tuyếna.x a.y b.x b.y

Giải trình

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

2

Ruby, 64 , 58 byte

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

Sử dụng

a.call [[5, 5], [5, -5]] # => -90.0
a.call [[5, -5], [5, 5]] # => 90.0

2

JavaScript, 49 byte

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

Đầu vào được thực hiện dưới dạng: [aY, aX], [bY, bX](chú ý x / y đảo ngược)


1

Simplex v.0.7 , 13 byte

Tôi rất vui vì tôi đã thêm mathrelations: D Thật không may, tôi không thể lấy đầu vào theo chiều. Vì vậy, tôi nhập mỗi điểm dưới dạng một số riêng biệt (Ax, Ay, Bx, By). (Tôi đã sử dụng điều này như một tài nguyên.)

(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

Tôi có thể lưu một char nếu tôi có thể lấy đầu vào là (Ay, Ax, By, Bx):

(iRi^fR)2LSo

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

Yêu cầu biên dịch với GCC để tận dụng lợi thế của M_PIviệc được định nghĩa math.hnhư là một phần của hằng số toán học tích hợp của GCC . Hãy thử trực tuyến - vì ideone không sử dụng GCC (rõ ràng), nên cần thêm một vài byte cho đủ các chữ số π là chính xác.


Hoặc 45/atan(1)thay vì 180/3.14159....(trong bản demo trực tuyến).
CompuChip

@CompuChip Tôi đã không cố gắng làm cho bản demo trực tuyến được chơi tối đa
Mego

Bạn có thể xóa dấu ngoặc tròn atan2 (by, ax), mặc dù sau đó bạn cần một khoảng trắng sau khi trả về để nó chỉ tiết kiệm 1 byte. Nếu bạn có thể sử dụng các hàm kiểu K & R thì nhân đôi g (x, y, a, b) double x, y, a, b; cũng tiết kiệm sáu byte.
Alchymist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.