如何将计算出的角度(矢量)转换成表示该角度的单个数字?

时间:2019-05-16 20:14:28

标签: python math vector angle

我基本上从两点得到了角度矢量:

aa点将指向bb点...(Window.width = 800,Window.height = 600)

 aa = (50.0*Window.width/100.0, 50.0*Window.height/100.0)
 bb = (10.0*Window.width/100.0, 70.0*Window.height/100.0)

 Angle = Vector(bb)-Vector(aa)

 print(Angle)

 [-320, 120]

是否有一种方法可以将向量转换为表示角度的单个数字...例如90.0、45.0、180等...?请记住,我们要从aa转到bb。...那个角度。

另一种表达方式是,我要将上面的“角度”值转换为一个数字。


这里没有Z轴。只有2d的AA和BB两点。定义窗口的x-cord从左到右,从左开始为0。

窗口y线的定义是从底部到顶部,从底部开始为0。


试图在这里变得更加清晰...

向量点aa就像一个圆的中心。零度将从圆的右中边缘开始,逆时针方向将增加度,直到您单击360,将您放回到右中角。

向量点aa可以移动,但是无论其在窗口中的位置如何,我都想计算aa与它朝向(bb)的点之间的夹角,其中aa是圆心,而度数则像我一样逆时针旋转

希望能带来更多启示。


好吧,我发现了一个有效但不完美的python函数。

 def GetAngleOfLineBetweenTwoPoints(self, p1, p2):
     xDiff = p2[0] - p1[0]
     yDiff = p2[1] - p1[1]
     return degrees(atan2(yDiff, xDiff))

会发生什么,

我的确得到了正确的度数,但是它是分屏的格式,我的意思是,我的屏幕的上半部分从右到左是0到180正。屏幕的右下角从右到左是0到-180。

看看那里发生了什么吗?

如何使该函数返回一个介于0到360之间的值,就像整个圆,而不是像当前正在执行的那样从0到180 +/-分开?

3 个答案:

答案 0 :(得分:2)

您可以使用一些三角函数:)

tan(angle)=对面/相邻

angle = arctan(相对/相邻)

您的对面将是:bb.height-aa.height

您的邻居将是:bb.width-aa.width

我希望有帮助。

trigonometry

答案 1 :(得分:0)

此答案使用弧度https://stackoverflow.com/a/2827475/4711754

# Copy of link
import math

def dotproduct(v1, v2):
  return sum((a*b) for a, b in zip(v1, v2))

def length(v):
  return math.sqrt(dotproduct(v, v))

def angle(v1, v2):
  """angle between two vectors"""
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))

要转换为除以2*math.pi的度数,再除以360的倍数。

鉴于我相信您想要与水平方向成角度

def angle(v1, v2=(1,0)):
  """angle between two vectors"""
  return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))*(360/(2*math.pi))

示例

>>> a=(0, 100)
>>> angle(a)
90.0
>>> a=(100, 0)
>>> angle(a)
0.0
>>> a=(40, 40)
>>> angle(a)
45.00000000000001
>>> a=(-40, 40)
>>> angle(a)
135.0

编辑

下面是版本是原点向量是窗口中心

def angle(v1):
  """angle around window"""
  v2=(1, 0)
  v1 = (v1[0] - Window.width/2, v1[1] - Window.height/2)
  angle_between_radians = math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
  angle_between_degrees = angle_between_radians *(360/(2*math.pi))
  if v1[1] >= 0:
      return angle_between_degrees 
  else:
      return 360 - angle_between_degrees

# or hardcoded this would be

def angle(v1):
  """angle around window"""
  v2=(1, 0)
  v1 = (v1[0] - 400, v1[1] - 300)
  angle_between_radians = math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
  angle_between_degrees = angle_between_radians *(360/(2*math.pi))
  if v1[1] >= 0:
      return angle_between_degrees 
  else:
      return 360 - angle_between_degrees

示例

>>> angle((400, 400))
90.0
>>> angle((500, 300))
0.0
>>> angle((440, 340))
45.00000000000001
>>> angle((360, 340))
135.0
>>> angle((360, 260))
225.0

答案 2 :(得分:0)

知道了!

 from math import atan2, degrees, pi, cos, sin

 def GetAngleOfLineBetweenTwoPoints(self, p1, p2):
     xDiff = p2[0] - p1[0]
     yDiff = p2[1] - p1[1]
     val = degrees(atan2(yDiff, xDiff))
     if str(val).find('-')!=-1:
         val = float(360)-float(val)
     return val

Yaaaaaayyyyyyy !!!!!!!