如何使用 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)]
它是如何工作的?
它不应该改变,即使它有点不直观,但它是这样工作的:move
和 rotate
方法调用不影响 vertices
,但适用于position
和 orientation
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]]
我不知道这个包是如何同时进行移位和旋转的,问题不在于它,所以我希望现在就足够了。
我正在使用 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)]
它是如何工作的?
它不应该改变,即使它有点不直观,但它是这样工作的:move
和 rotate
方法调用不影响 vertices
,但适用于position
和 orientation
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]]
我不知道这个包是如何同时进行移位和旋转的,问题不在于它,所以我希望现在就足够了。