我们有一个巨大的空间坐标(x,y和z)代表3d空间中的原子,我正在构建一个将这些点转换为新坐标系的函数.将坐标移动到任意原点很简单,但我无法绕过下一步:3d点旋转计算.换句话说,我试图将点从(x,y,z)转换为(x',y',z'),其中x',y'和z'是i',j'和k',我在euclid python模块的帮助下制作的新轴向量.
我认为我需要的只是一个欧几里德四元数来做到这一点,即
>>> q * Vector3(x, y, z)
Vector3(x', y', z')
Run Code Online (Sandbox Code Playgroud)
但是为了使我相信我需要一个旋转轴向量和一个旋转角度.但我不知道如何从i',j'和k'计算这些.这似乎是一个从头开始编码的简单程序,但我怀疑这样的东西需要线性代数来自行解决.非常感谢你在正确的方向上轻推.
我正在用Python实现3D Vector类.我的向量有坐标x,y和z(所有浮点数),我需要决定如何存储这些信息.我在这里至少可以看到三个选项:
1)制作三个独立的浮点字段:self.x,self.y,self.z
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
Run Code Online (Sandbox Code Playgroud)
2)制作一个列表,比如说self.data,有三个元素.如果对象可以是常量,我也可以使用元组.
class Vector:
def __init__(self, x, y, z):
self.data = [x,y,z]
Run Code Online (Sandbox Code Playgroud)
3)制作一个numpy数组,比如self.data,有三个元素.
import numpy as np
class Vector:
def __init__(self, x, y, z):
self.data = np.array([x,y,z])
Run Code Online (Sandbox Code Playgroud)
对于选项(2)和(3),我可以实现属性和设置器来访问单个坐标
@property
def x(self):
return self.data[0]
Run Code Online (Sandbox Code Playgroud)
4)为什么不进行冗余?我可以同时拥有一个列表(或元组或numpy数组)和单独的字段x,y和z.
该类用于执行常见操作,例如向量添加,内积,叉积,旋转等.需要考虑这些操作的性能.
是否有我更喜欢的解决方案,为什么?