如何使用 magpylib 在 3d space 中旋转载流导线?

How to rotate current carrying wires in 3d space using magpylib?

我正在使用 python 的 Magpylib 库进行磁场计算。

我创建了一个带顶点的电流导线:[(0,0,0)(1,0,0)]

现在我正在尝试旋转它,使其新顶点为: [(0,0,0),(0,1,0)],[(0,0,0)(-1,0,0)],[(0,0,0)(0,-1,0)]

这是我现在的位置:

wire=mag3.current.Line(current=10,vertices=[(0,0,0),(1,0,0)],position=(0,0,0))
print(wire.vertices)
wire=wire.rotate(R.from_euler('z',90, degrees=True),anchor=(0,0,0),increment=True)
print(wire.vertices)

我得到:

[(0,0,0)(1,0,0)],[(0,0,0)(1,0,0)]

我正在寻找:[(0,0,0)(1,0,0)],[(0,0,0)(0,1,0)]

它是如何工作的?

它不应该改变,即使它有点不直观,但它是这样工作的:moverotate 方法调用不影响 vertices,但适用于positionorientation

import magpylib as mag3
from scipy.spatial.transform import Rotation as R

wire = mag3.current.Line(current=10, vertices=[(0, 0, 0), (1, 0, 0)])
print(wire.vertices)
# [[0 0 0]
#  [1 0 0]]
print(wire.position)
# [0. 0. 0.]
print(wire.orientation.as_euler('xyz', degrees=True))
# [0. 0. 0.]

wire.move((1, 2, 3))
print(wire.vertices)
# [[0 0 0]
#  [1 0 0]]
print(wire.position)
# [1. 2. 3.]
print(wire.orientation.as_euler('xyz', degrees=True))
# [0. 0. 0.]

wire.rotate(R.from_euler('z', 45, degrees=True))
print(wire.vertices)
# [[0 0 0]
#  [1 0 0]]
print(wire.position)
# [1. 2. 3.]
print(wire.orientation.as_euler('xyz', degrees=True))
# [ 0.  0. 45.]

所有这些都是针对没有任何 vertices 的对象,例如 Sphere,你看,除了简单地将其存储为单独的值之外,没有其他方法可以定义球体旋转。 (为什么我们要存储球体的旋转是另一个问题:])

无论如何,我们怎样才能做到这一点?

但是如果你想看到旋转对顶点的影响,你可以wire.orientation.apply(wire.vertices)

import magpylib as mag3
from scipy.spatial.transform import Rotation as R

wire = mag3.current.Line(current=10, vertices=[(0, 0, 0), (1, 0, 0)])

wire.rotate(R.from_euler('z', 45, degrees=True))
print(wire.vertices)
# [[0 0 0]
#  [1 0 0]]
print(wire.orientation.apply(wire.vertices))
# [[0.         0.         0.        ]
#  [0.70710678 0.70710678 0.        ]]
print(wire.vertices)
# [[0 0 0]
#  [1 0 0]]

如果你想换班,那就用wire.vertices + wire.position

import magpylib as mag3
from scipy.spatial.transform import Rotation as R

wire = mag3.current.Line(current=10, vertices=[(0, 0, 0), (1, 0, 0)])

wire.move((1, 2, 3))
wire.move((4, 3, 2))
print(wire.vertices)
# [[0 0 0]
#  [1 0 0]]
print(wire.vertices + wire.position)
# [[5. 5. 5.]
#  [6. 5. 5.]]
print(wire.vertices)
# [[0 0 0]
#  [1 0 0]]

我不知道这个包是如何同时进行移位和旋转的,问题不在于它,所以我希望现在就足够了。