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

2024-04-26 03:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

aa点到bb点。。。。(窗宽=800, 窗高=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轴。只有aa和bb的2d两点。窗口x线是从左到右定义的,0从左开始。你知道吗

窗口y线从下到上定义,0从底部开始。你知道吗


想说得更清楚些。。。你知道吗

向量点aa就像一个圆的中间。0度将从圆的右中边缘开始,逆时针方向将增加0度,直到达到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+/-分割?你知道吗


Tags: 定义数字windowwidth向量边缘aa角度
3条回答

你可以使用一些三角学:)

tan(角度)=相反/相邻

角度=arctan(相对/相邻)

你的对手是:bb.高度- aa.高度你知道吗

您的邻居将是:bb.宽度- aa.宽度你知道吗

我希望这有帮助。你知道吗

trigonometry

这个答案使用弧度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

明白了!你知道吗

 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

呀呀呀呀呀呀呀呀!!!!!!!你知道吗

相关问题 更多 >