property_topomesh_optimization.py 文件源码

python
阅读 18 收藏 0 点赞 0 评论 0

项目:cellcomplex 作者: VirtualPlants 项目源码 文件源码
def property_topomesh_laplacian_smoothing_force(topomesh,cellwise_smoothing=False):

    if not topomesh.has_wisp_property('vertices',degree=1,is_computed=True):
        compute_topomesh_property(topomesh,'vertices',degree=1)
    edge_vertices = topomesh.wisp_property('vertices',degree=1).values()
    reversed_edge_vertices = np.transpose([edge_vertices[:,1],edge_vertices[:,0]])
    edge_vertices = np.append(edge_vertices,reversed_edge_vertices,axis=0)

    if not topomesh.has_wisp_property('valence',degree=0,is_computed=True):
        compute_topomesh_property(topomesh,'valence',degree=0)
    vertices_degrees = topomesh.wisp_property('valence',degree=0).values()

    if cellwise_smoothing:

        laplacian_force = np.zeros_like(topomesh.wisp_property('barycenter',degree=0).values(),np.float32)

        for c in topomesh.wisps(3):

            if not topomesh.has_wisp_property('vertices',degree=3,is_computed=True):
                compute_topomesh_property(topomesh,'vertices',degree=3)
            cell_vertices = topomesh.wisp_property('vertices',degree=3)[c]

            cell_edges = np.sum(nd.sum(np.ones_like(cell_vertices),cell_vertices,index=edge_vertices),axis=1)
            cell_edge_vertices = edge_vertices[np.where(cell_edges==2)[0]]
            cell_edge_vectors = topomesh.wisp_property('barycenter',degree=0).values(cell_edge_vertices[:,1]) - topomesh.wisp_property('barycenter',degree=0).values(cell_edge_vertices[:,0])

            cell_laplacian_force = np.transpose([nd.sum(cell_edge_vectors[:,0],cell_edge_vertices[:,0],index=cell_vertices),
                                                 nd.sum(cell_edge_vectors[:,1],cell_edge_vertices[:,0],index=cell_vertices),
                                                 nd.sum(cell_edge_vectors[:,2],cell_edge_vertices[:,0],index=cell_vertices)])
            laplacian_force[cell_vertices] += cell_laplacian_force/vertices_degrees[cell_vertices,np.newaxis]

    else:
        edge_vectors = topomesh.wisp_property('barycenter',degree=0).values(edge_vertices[:,1]) - topomesh.wisp_property('barycenter',degree=0).values(edge_vertices[:,0])

        laplacian_force = np.transpose([nd.sum(edge_vectors[:,d],edge_vertices[:,0],index=list(topomesh.wisps(0))) for d in [0,1,2]])
        laplacian_force = laplacian_force/vertices_degrees[:,np.newaxis]

    return laplacian_force
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号