在Python中2D旋转线

时间:2014-02-06 22:16:08

标签: python rotation

我有一个小问题,我有2D旋转线的功能,只有在C [0] == C 1时才有效,哪里应该是错误?如果C [0]!= C 1旋转线长于原始线。

def rotmat(alpha):                    # angle in radians
    ca, sa = cos(alpha), sin(alpha)
    return array([[ca, -sa],[sa, ca]])

def rotate(X, Y, alpha, C=(0,0)):
    """
    X,Y - coordinates of points, C - center of rotation, default (0,0)

    """
    Ca = asarray(C)
    XY = asarray([X,Y])
    Xr,Yr = Ca + dot(rotmat(alpha), XY-Ca)
    return Xr,Yr

X = (1,2); Y=(2,1)
Xr,Yr = rotate(X,Y,pi/2.,(0.,5.))
plot(X,Y,Xr,Yr,'r')
axis('scaled')
show()

blue - original, red - rotated

蓝色是原始的,红色是旋转的

1 个答案:

答案 0 :(得分:2)

矢量在点空间中没有位置。如果D是轮换矩阵,则它们只是转换为v' = Dv,而不是像代码那样转换为v' = D(v-c)+c

您正在处理矢量,就像它表示一个点的坐标一样,然后您可能正在测量这些坐标中与原点的距离。

如果旋转中心不是原点,则该距离在旋转下不是不变的,而矢量的长度在旋转时总是不变的。

编辑问题后编辑:

您减去Ca是错误的。 Numpy广播将导致从每行中减去中心,而不是按照您的意图从每列中减去。您可以通过为Ca构建完整矩阵来解决此问题:

Ca = asarray([[C[0]]*len(X), [C[1]]*len(X)])

可能有一些更好的numpy解决方案来做正确的形状铸造,我现在还没有意识到。