绕点旋转:不是python中的desidered输出

时间:2017-11-22 16:10:05

标签: python numpy rotation

我想围绕一个可能与[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轴旋转的影响。

1 个答案:

答案 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)