python - 找到两个向量和它们之间的角度
问题描述
我有一辆车和一个代表行人的点,我能够找到向量 a 和 b(见下图),然后我试图计算它们之间的角度
我使用 cos(Angle) = 幅度(vector_a)*magnitude(vector_a))/dot_product(vector_a,vector_b) 的已知公式,但是当我计算余弦时,它远大于一,因此无法计算角度......我究竟做错了什么?
def detect_pedestrian(car,pedestrian):
#Find a vector which connects pedestrian with a car
pedestrian_position = pedestrian.body.position
car_position = car.body.position
#Find vectors a and b
car_vector = Box2D.b2Body.__GetTransform(car.body).R.GetYAxis()
pedestrian_vector = pedestrian_position - car_position
#Calculate magnitudes of both vector
pedestrian_vector_magnitude = np.linalg.norm(pedestrian_vector)
car_vector_magnitude = np.linalg.norm(car_vector)
#Normalize both vectors
pedestrian_vector_normalized = pedestrian_vector/pedestrian_vector_magnitude
car_vector_normalized = car_vector/car_vector_magnitude
#Calculate angle
magnitudes = pedestrian_vector_magnitude * car_vector_magnitude
dot_product = b2Dot(pedestrian_vector_normalized, car_vector_normalized)
cosine = magnitudes/dot_product
arccos = np.arccos(cosine)
print(cosine)
非常感谢
解决方案
您需要汽车的航向和行人相对于汽车的位置。如果你有行人和汽车在世界坐标中的位置(即绝对位置)和汽车的速度,代码很简单:
import numpy as np
def detect_pedestrian(car_vector, pedestrian_vector, car_velocity):
pedestrian_relative = pedestrian_vector - car_vector
pedestrian_length = np.linalg.norm(pedestrian_relative)
velocity_length = np.linalg.norm(car_velocity)
dot_product = np.dot(pedestrian_relative, car_velocity)
cosine = dot_product / (pedestrian_length * velocity_length)
return(np.arccos(cosine))
car = np.array([5, 2])
pedestrian = np.array([2, 3])
v = np.array([0, 2])
angle_rad = detect_pedestrian(car, pedestrian, v)
print(f"Pedestrian angle: {np.degrees(angle_rad)}°")
# Pedestrian angle: 71.56505117707799°
推荐阅读
- javascript - Fawn 交易中缺少收藏
- static - Android中的静态类
- vuejs2 - 如何使用 vuejs 存储类别名称
- java - 如何从 Spring 自定义范围中驱逐/删除 bean?
- prolog - Prolog - 与图遍历相关的问题
- r - 在 R 中使用 BDP 查找 SETTLE_DTE(在 excel 中有效,但在 R 中无效)
- spring - 使用 Maven 更新 Spring 框架版本后,Eclipse 的 Tomcat 服务器将无法启动
- typescript - Ionic 3 - 打字稿错误:算术操作数必须是“任何”、“数字”或枚举类型
- mysql - 使用重复的数据库记录创建排名和统计信息
- swift - 结构和可覆盖的协议扩展