理解计算转换网格的Python代码的困难

时间:2019-08-25 12:13:59

标签: python numpy graphics

我已经从original version in MATLAB到Python基本上翻译了一些代码,但是有一部分我不理解。我有一个要转换的三角形网格。为此,计算每个三角形面的变换。之后,指定变形三角形的边缘。但是,那时我还不清楚会发生什么。如果您要分享有关以下步骤的任何数学或几何背景,我将非常感谢!

weight = np.ones(1)

fixvertex = 1
fixto = np.zeros((3))

M = scipy.sparse.lil_matrix((len(template) + fixvertex, len(template)))
dx = scipy.sparse.lil_matrix((len(template) + fixvertex, 3))
for i in range(len(faces)):
    v = faces[i, :]
    ### ... what happens inbetween is irrelevant
    # Transform triangle
    x = T @ np.array([template[v[0], :], template[v[1], :], template[v[2], :]]).reshape(3, 3).T

    p12 = x[:, 0] - x[:, 1]
    p13 = x[:, 0] - x[:, 2]
    p23 = x[:, 1] - x[:, 2]

    p12 = p12 / np.linalg.norm(p12)
    p13 = p13 / np.linalg.norm(p13)
    p23 = p23 / np.linalg.norm(p23)

    # I do not get the point of the following lines

    wts = [(p13.T).dot(p23), -(p12.T).dot(p23), (p12.T).dot(p13)]
    wij3 = [[0, wts[0] / np.sqrt(1 - wts[0] ** 2), wts[1] / np.sqrt(1 - wts[1] ** 2)],
            [0, 0, wts[2] / np.sqrt(1 - wts[2] ** 2)],
            [0, 0, 0]]
    wij3 = np.asarray(wij3)
    wij3 = wij3 + wij3.T
    WIJ = wij3 - np.diag([sum(x) for x in zip(*wij3)])
    M[np.ix_(v, v)] = M[np.ix_(v, v)] + WIJ
    dx[v, :] = dx[v, :] + (WIJ @ x.T)

weight = np.ones((fixvertex)) * weight

for i in range(fixvertex):
    M[len(template) + i, fixvertex - 1] = weight[i]

dx[len(template):len(template) + fixvertex, :] = np.multiply(fixto, np.tile(weight, (3)))

M = np.real(M)
dx = np.real(dx)
Mt = M.T

model = scipy.sparse.linalg.spsolve(Mt @ M, Mt @ dx)

0 个答案:

没有答案