当前位置: 首页 > 面试题库 >

计算两点之间的角度(顺时针)

翁俊良
2023-03-14
问题内容

我已经很长时间没有使用数学了,这应该是一个简单的问题。

假设我有两个点A:(1、0)和B:(1,-1)。

我想使用一个程序(Python或其他编程语言)来计算A,原点(0,0)和B之间的顺时针角度。它将是这样的:

angle_clockwise(point1, point2)

请注意,参数的顺序很重要。由于角度计算将是顺时针方向:

  • 如果我调用angle_clockwise(A,B),则返回45。
  • 如果我调用angle_clockwise(B,A),则返回315。

换句话说,算法是这样的:

  1. 在第一个点参数与(0,0)之间绘制一条线(线1)。
  2. 在第二个点参数与(0,0)之间绘制一条线(线2)。
  3. 将线1顺时针旋转(0,0),直到与线2重叠。
  4. 行进的角距离线1将是返回的角度。

有什么办法可以编码这个问题?


问题答案:

使用两个向量的内积和行列式。如果您想了解其工作原理,那么这就是您应该真正了解的内容。您需要了解/阅读矢量数学才能理解。

请参阅:https :
//en.wikipedia.org/wiki/Dot_product和https://en.wikipedia.org/wiki/Determinant

from math import acos
from math import sqrt
from math import pi

def length(v):
    return sqrt(v[0]**2+v[1]**2)
def dot_product(v,w):
   return v[0]*w[0]+v[1]*w[1]
def determinant(v,w):
   return v[0]*w[1]-v[1]*w[0]
def inner_angle(v,w):
   cosx=dot_product(v,w)/(length(v)*length(w))
   rad=acos(cosx) # in radians
   return rad*180/pi # returns degrees
def angle_clockwise(A, B):
    inner=inner_angle(A,B)
    det = determinant(A,B)
    if det<0: #this is a property of the det. If the det < 0 then B is clockwise of A
        return inner
    else: # if the det > 0 then A is immediately clockwise of B
        return 360-inner

在行列式计算中,您将两个向量连接起来形成一个2 x 2矩阵,为此您要计算行列式。



 类似资料:
  • 问题内容: 我需要为自己的Point类计算两个点之间的角度,以度为单位,Point a为中心点。 方法: 测试1://返回45 测试2://返回-90,预期值:270 如何将返回的结果转换为0到359之间的数字? 问题答案: 您可以添加以下内容: 顺便说一句,为什么您不想在这里使用双精度?

  • 问题内容: 我正在尝试计算python中两条线之间的角度。我搜索了互联网,找到了如何做的方程式。但是我并不总是能得到准确的结果。当其他结果似乎正确时,其中一些结果显然是错误的。我的代码如下: 它产生的结果是: 问题是我不明白为什么第二个结果,第五个和最后一个结果被归零,因为它们共享一个点,而另一个点却不重复,因为数组中的值不同。 问题答案: 看起来您正在使用Python2,如果两个参数均为int

  • 问题内容: 我需要创建一个类来计算两点之间的距离。我被困住了,我是一个完全的初学者。这是我的课程: 第二课。 我不确定如何在两个定义的点之间获取点对象(中间点)。 我可以创建点对象,但不确定如何通过位于这两个点对象之间的方法返回点对象。 问题答案: 平面上的两个点(x1,y1)和(x2,y2)之间的距离为: 但是,如果您想要的只是两个点的中点,则应将中点函数更改为: 这将返回一个全新的点对象,其点

  • 问题内容: 这是我的尝试,这只是我的代码的一部分: 我正在使用以下公式来获取经度和纬度: 问题答案: 上面Dommer给出的Java代码给出的结果略有不正确,但是如果你正在处理GPS轨迹,则小错误加起来。这是Java中Haversine方法的实现,该方法还考虑了两点之间的高度差。

  • 问题内容: 我有一个带有StartDate列的表,我想计算两个连续记录之间的时间差。 谢谢。 @ Mark Byers和@ Yahia,我将请求表作为requestId,startdate 我想知道requestid 1和2、2和3、3和4等之间的时差是多少。我知道我需要在表上进行自我连接,但是我在子句上没有得到正确的支持。 问题答案: 要实现您的要求,请尝试以下操作(从OP编辑后进行更新): 如

  • 问题内容: 我需要计算两个日期之间经过的时间。 这里要注意的是,我需要像YouTube一样用视频评论时间戳来显示它。也就是说,仅以最大的方式显示它。 例如, 如果时间是50秒前,应该说是50秒前。 如果时间超过一分钟,则应说一分钟前/十分钟前,等等。 如果时差是1小时30分钟,则应显示:一个小时前。 如果时间是一个半星期而不是一个星期前应该说的话。 如果时间超过一个月,则应说一个月前/两个月前,等

  • 我有两个位置的谷歌api链接 http://maps.googleapis.com/maps/api/directions/json? 我从两个位置得到响应(距离

  • 我有3个锚节点,比如A,B,C。A连接到B,B连接到C,形成一个“开放三角形”。 我需要计算B点两条线形成的角度。 这怎么可能呢?