将NumPy用于3D矢量

时间:2017-01-31 22:22:46

标签: python numpy vector

我必须承认,我在Python方面并不是那么糟糕,但在数学方面却不是那么好。在那里,我说了。我打算用3D坐标系建立游戏。经典,非常简单。就像我的第一个房间是0,0,0,而东边的那个房间将是1,0,0。

更难的是我需要搜索这些坐标。例如,找一个半房间内X,Y,Z坐标周围的所有房间。我也可以用它来寻路。所以我在考虑使用NumPy来提高性能(因为我不知道最后会有多少个坐标)所以非常简单:

import numpy as np
a = np.array([0.0, 0.0, 0.0])
b = np.array([1.0, 0.0, 0.0])

但这就是我的微薄技能达到死胡同的地方。从理论上讲,我可以将一个减去另一个来获得绝对距离,但即便如此,我也会陷入困境。所以我会把我的需求放在这里......希望有人可以帮助我解决问题:

  1. 返回两个向量之间的距离(作为int,或者float会更好)。
  2. 寻找接近另一个的向量:close的概念将是一个距离,所以从理论上讲,这意味着浏览所有向量并将它们与另一个向量相距离。我不知道它在性能方面是否很好。
  3. 获取2D方向(以度数或辐射度,A和B之间)和垂直方向(相同,但使用Z坐标)。
  4. “转动”一个矢量,保持其距离(标准),但保持不同的方向,如果有意义的话,这意味着围绕Z坐标旋转。围绕X或Y转动的事情会很棒。
  5. 规范化此向量,因此它将处于相同的“方向”,但距离(范数)为1,距离为0,0,0 ,.
  6. 如果这没有多大意义,我很抱歉。我的用例在我的脑海中非常清楚,但不是很了解向量,也许我在一个或多个简单的概念上缺失。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

一点点线性代数将大大有助于完成你想要的大部分工作。

  1. 两个向量之间的距离。您可以定义c = a- b,然后找到此差异向量的大小。找到向量的大小很简单:mag = np.sqrt(np.dot(c,c))

  2. 既然您有办法计算两点之间的距离,您可以按照建议进行操作,但检查每个可能的向量对将是O(N ^ 2)。

  3. 我不完全确定你的2D方向和垂直方向是什么意思。但是可以使用A点B = | A | * | B | * cos(theta)的事实来找到两个向量之间的角度,其中| A |是A的大小,theta是角度。所以你可以这样做:

    magA = np.sqrt(np.dot(A,A)) magB = np.sqrt(np.dot(B,B)) angle = np.arccos(np.dot(A,B)/(magA*magB))

  4. 这是rotation matrices的用途。给定一个角度,你可以定义一个旋转矩阵M,只需用np.dot(M, A)来获得旋转的矢量。

  5. 要标准化矢量,只需将每个分量除以幅度即可。所以normA = A / (np.sqrt(np.dot(A,A))

  6. 这不是一个完整的答案,但希望它能让你朝着正确的方向前进。