我想围绕一个可能与[0,0,0]不同的原点旋转一个点(但是轴不要改变方向)。知道数学,我在MATLAB中尝试了,一切都按预期工作。
P = [10 2 33];
O = [1 10 5];
O1 = [0 0 0];
B = zeros(3,100);
for i=1:100
c = cos(i/10);
s = sin(i/10);
Rz = [c -s 0; s c 0; 0 0 1];
A = P - O;
B(:,i) = Rz*A' + O';
end
plot3(B(1,:),B(2,:),B(3,:),'ob');
hold on
plot3(O(1),O(2),O(3),'or');
hold on
plot3(O1(1),O1(2),O1(3),'og');
接下来我想把这个东西插入一个更大的python脚本中,所以我从this solution获取灵感来编写这段代码。我想要旋转的点的坐标位于self.line
,原点位于self.tvec2
内,并且这两个点都是从代码的其余部分不断更新的
import numpy as np
#many other lines of code
theta = np.radians(1)
c, s = np.cos(theta), np.sin(theta)
Rz = np.matrix([[c, -s, 0], [s, c, 0], [0, 0, 1]])
self.line_T = self.line[:] - [self.tvec2[0], self.tvec2[1], 0]
print [self.tvec2[0], self.tvec2[1], 0]
for ii in range(self.line_T.shape[0]):
self.line[ii,:] = np.dot(Rz,self.line_T[ii,:]) + [self.tvec2[0], self.tvec2[1], 0]
代码有效,但现在似乎self.line
始终围绕[0,0,0]旋转,无论self.tvec2
的价值是多少(我使用print
来看看这个)。
有什么问题?我的错误在哪里?我不是numpy和python的专家,但是
np.dot(Rz,self.line_T[ii,:])
有效,而不是带换位的这一行
Rz*(self.line_T[ii,:].T)
,结果应该是一样的。
注意,沿Z轴的每个坐标的第三个值不应受绕Z轴旋转的影响。
答案 0 :(得分:1)
这是您的代码的工作版本。值得注意的变化:
matrix
替换为array
@
运算符要旋转的点是self.line
的行。
import numpy as np
class Test:
def __init__(self, tvec2, line):
self.line = np.asanyarray(line)
self.tvec2 = np.asanyarray(tvec2)
def rot(self, theta):
c, s = np.cos(theta), np.sin(theta)
Rz = np.array([[c, -s, 0], [s, c, 0], [0, 0, 1]])
offset = np.array([self.tvec2[0], self.tvec2[1], 0])
shifted = self.line - offset
self.line = shifted @ Rz.T + offset
test = Test([-1,-2], [[1,2,3],[3,4,5]])
for i in range(8):
test.rot(np.pi/8)
print(test.line)