旋转期间的Python舍入

时间:2015-11-15 22:25:33

标签: python rotation rounding

我有一个在3D空间中采用点的函数,一个角度测量,以及它旋转周围点的单位Vector。

def rotate(vertices, angle, unitV): #angle and unit vector that it rotates around

RotateMatrix = [[(math.cos(angle)+(unitV[0]*(1-math.cos(angle)))),(unitV[0]*unitV[1]*(1-math.cos(angle))-(unitV[2]*math.sin(angle))),(unitV[0]*unitV[2]*(1-math.cos(angle))+(unitV[1]*math.sin(angle)))],
                [(unitV[1]*unitV[0]*(1-math.cos(angle))+(unitV[2]*math.sin(angle))),(math.cos(angle)+(unitV[1]*(1-math.cos(angle)))),(unitV[1]*unitV[2]*(1-math.cos(angle))-(unitV[0]*math.sin(angle)))],
                [(unitV[2]*unitV[0]*(1-math.cos(angle))-(unitV[1]*math.sin(angle))),(unitV[2]*unitV[1]*(1-math.cos(angle))+(unitV[0]*math.sin(angle))),(math.cos(angle)+(unitV[2]*(1-math.cos(angle))))]
                ]

for i in range(len(vertices)):
    x = ((RotateMatrix[0][0]*vertices[i][0])+(RotateMatrix[0][1]*vertices[i][1])+(RotateMatrix[0][2]*vertices[i][2]))
    y = ((RotateMatrix[1][0]*vertices[i][0])+(RotateMatrix[1][1]*vertices[i][1])+(RotateMatrix[1][2]*vertices[i][2]))
    z = ((RotateMatrix[2][0]*vertices[i][0])+(RotateMatrix[2][1]*vertices[i][1])+(RotateMatrix[2][2]*vertices[i][2]))
    vertices[i]=([x,y,z])

return vertices

旋转矩阵来自:https://en.wikipedia.org/wiki/Rotation_matrix

for循环只是将每个顶点乘以旋转矩阵,然后返回新的旋转点。问题是当我尝试在单位矢量上旋转点时,如[0.7071067811865476,0.7071067811865475,0.0]。例如,当我围绕该单位向量旋转点[0,5,0]时:

print rotate([[0,5,0]], math.radians(180), [0.7071067811865476, 0.7071067811865475, 0.0])

它将新点返回为[5.0,2.0710678118654746,4.329780281177467e-16]。但是,新点应该是[5.0,0,0]。显然python并不完美,但由于某种原因,从函数返回的点总是关闭。我仔细检查了旋转矩阵以及它与点相乘的方式,因此我能想到的唯一原因是舍入误差。

感谢您的回答!

0 个答案:

没有答案