找到矢量投影到平面上的角度和xy平面中的矢量同时围绕圆圈

时间:2014-07-30 18:09:23

标签: python vector projection linear algebra

我不完全确定如何描述这个,但基本上我试图找到两个矢量之间的角度在xy平面的圆圈中四处走动。为了做到这一点,我采用一个矢量,称为ve​​c,它是质心(圆心)之间的向量

cm

和圈子上的任意位置。

pt
然后我找到了相应的切线向量。

tvec

我使用它和z-dir向量来表示向量的切平面。

A

我也有一个3维特征向量,用于圆圈中的特定点。然后我将特征向量投影到切平面上并测量投影向量之间的角度

proj

和切线向量。我还希望角度范围仅在-90到90之间。这是我写的代码:

def helical_angle(i, j, cm, e1): 
        pt = np.array([[i,j,0]])
        vec = pt - cm
        zvec = np.array([[0,0,1]])
        tvec = (np.cross(vec, [0.,0,1]))
        A = np.concatenate((tvec,zvec))
        ''' need A to be in terms of tvec, zvec column vectors'''
        A = A.T
        '''e1 = eigenvector for i,j'''
        '''proj to execute equation proj = A(A.T * A) ^(-1) *A.T * e1 '''
        proj_1 = np.linalg.pinv(np.dot(A.T, A))
        proj_2 = np.dot(A, proj_1)
        proj_3 = np.dot(proj_2, A.T)
        proj = np.dot(proj_3, e1.T) 
        proj = proj.T
        ''' get back as row vector'''


        ha = np.arccos(np.vdot(tvec, proj)/ (np.sqrt(np.vdot(tvec,tvec)) * np.sqrt(np.vdot(proj, proj))))
        ha_deg = np.rad2deg(ha)
        cross_check = np.cross(tvec,proj)
        dot_check = np.vdot(cross_check,vec)
        if ha_deg > 90:
           ha_deg = ha_deg - 180
        if dot_check > 0:
            ha_deg = -ha_deg
        ''' check which vector is above or below'''

        return ha_deg



for i in range (0,192): 
    for j in range (0,192):
        e1 = tenfit.evecs[i,j,slicedim,:,0]
        if FA[i,j,slicedim] < 0.2:
             continue
        ha_array[i,j] = helical_angle(i,j,cm,e1)

除了当我打印出ha_array的图像时,圆圈的左右两边都有倒置的符号(通常,当j的幅度大于i的幅度,但并非总是而不是那么清晰时)所以如果积极的话应该是消极的。我已经尝试了浏览每个单独的组件,并且在逐个打印时它们都有意义。有没有特别有线性代数经验的人知道为什么会出错?我唯一能想到的是投射出现了一些问题,但我不知道是什么。

0 个答案:

没有答案