找出两点之间的角度


13

给定两个点AB,求AO出线BO与点之间的夹角,O其中点O为((0,0))。另外,取决于点的位置,角度可以为正或负(请参见示例)。输入将是点AB,并且可以任何方便的形式给出。输出将是以度为单位的角度(但如果AO绕原点逆时针旋转则为正,如果顺时针旋转BO则为负)。如果角度为180度,则可能会返回负或正输出。同样,角度可以是相同角度(90 deg等于-270 deg)的正或负形式。例子:

  • 输入:A(5,5) B(5,-5)输出:-90AO旋转-90度得到BO)。

  • 输入:A(5,-5) B(5,5)输出:90AO旋转90度得到BO)。

这是,因此以字节为单位的最短代码胜出!


11
需要多少精度?
Reto Koradi 2015年

2
我们可以将输入作为两个复数吗?
lirtosiast,2015年

5
如果一点是输出应该是(0,0)什么?
lirtosiast,2015年

1
@ThomasKwa我不了解OP,但我只将其视为整数/十进制数输入,并且输入永远不会有(0,0)点。
GamrCorps,2015年

2
提示:间的夹角AOBO通常会被称为角AOB
ETHproductions 2015年

Answers:


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

22

TI-BASIC,13个字节

适用于TI-83 + / 84 +系列计算器。

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

要使用此程序,请{x1,x2}通过Ans变量并{y1,y2}在提示下输入列表。


TI-BASIC命令是单个字节吗?
corsiKa

除了以外ΔList(,此处的所有命令均为一个字节。这包括R►Pθ(
lirtosiast

+1仅用于使用计算器编程。高中时代带我回到Trig和Calculus。
2015年

不错的参考!超酷。
corsiKa 2015年

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
可笑的是,该程序几乎有一半只是将弧度转换为度...
Darrel Hoffman

@DarrelHoffman我发现更有趣的是,在Pyth中,转换是3个字节而不是6个字节,因此,如果允许以弧度为单位进行报告的挑战,则将这些语言捆绑在一起
FryAmTheEggman 2015年

5

Minkolang 0.9,112字节

真的很想现在将trig函数实现为内置函数...但这很有趣!(注意:这输出的是正角度差,而不是正负角度差。鉴于我的限制,我认为这是合理的。)

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.

minkolang是否支持评论?我在自述文件中找不到它。
科纳·奥布赖恩2015年

1
@CᴏɴᴏʀO'Bʀɪᴇɴ:就像其他2D语言一样,注释是程序计数器无法达到的。
El'endia Starman

哦,那好吧。这是有道理的,不知道我在想什么。
Conor O'Brien 2015年

@CᴏɴᴏʀO'Bʀɪᴇɴ:您在答案之一中明确使用注释使我考虑实现类似的功能。这是个好主意,对我来说实施起来并不难。
El'endia Starman

谢谢!:D是您在Hello World挑战中注意到的吗?模式,而在其他)。
康纳尔奥布莱恩

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.

请问这项工作的投入一样{{0,1},{1,0}}
lirtosiast

@ThomasKwa当然会。
alephalpha

4

Javascript,66个字节

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

演示


我之前23秒= P高尔夫不错!顺便说一句,您可以省略let f=,它仍然被视为有效的匿名函数。
Mwr247

3

朱莉娅,18 25字节

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

假定“任何方便的形式”已经允许AB以复数形式给出。然后,复数算法完成了所有繁重的工作。

编辑:将代码段转换为功能。18字节版本仅在Julia REPL中有效。



3

八度,43字节

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

输入输出:

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

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

3

CJam,15个字节

l~ma@@ma-P/180*

以为我也会参加CJam游戏。在线尝试。输入形式为bx by ax ay。不幸的是,这是在不复制丹尼斯答案的情况下进行挑战的最短方法。


3

TeaScript,28个字节

我真的应该实现触发功能...

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

尝试一下在线输入是a.x a.y b.x b.y

说明

$.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个字节

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

用法

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

2

JavaScript,49个字节

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

输入采用以下格式:([aY, aX], [bY, bX]注意x / y取反)


1

单面v.0.7,13个字节

我很高兴我添加了mathrelations:D不幸的是,我不能接受逐点输入。因此,我将每个点输入为单独的数字(Ax,Ay,Bx,By)。(我以此为资源。)

(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

如果可以将输入作为(Ay,Ax,By,Bx),则可以保存一个char:

(iRi^fR)2LSo

1

C,88字节

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

需要使用GCC进行编译,以利用M_PI被定义math.hGCC内置数学常量的一部分的优势。 在线尝试 -由于ideone不使用GCC(显然),因此需要额外的几个字节才能使π的足够位数准确。


45/atan(1)代替180/3.14159....(在在线演示中)。
CompuChip

@CompuChip我并没有试图最大限度地提高在线演示的效率
Mego,

您可以删除圆括号atan2(by,ax)的括号,尽管返回后需要一个空格,所以它仅保存1个字节。如果可以使用K&R样式函数,则将g(x,y,a,b)加倍,将x,y,a,b;加倍。还节省了六个字节。
Alchymist 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.