我基本上从两点得到了角度矢量:
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 +/-分开?
答案 0 :(得分:2)
您可以使用一些三角函数:)
tan(angle)=对面/相邻
angle = arctan(相对/相邻)
您的对面将是:bb.height-aa.height
您的邻居将是:bb.width-aa.width
我希望有帮助。
答案 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 !!!!!!!