def property_topomesh_laplacian_epidermis_convexity_force(topomesh):
"""todo"""
if not topomesh.has_wisp_property('vertices',degree=1,is_computed=True):
compute_topomesh_property(topomesh,'vertices',degree=1)
if not topomesh.has_wisp_property('barycenter',degree=3,is_computed=True):
compute_topomesh_property(topomesh,'barycenter',degree=3)
if not topomesh.has_wisp_property('epidermis',degree=1,is_computed=True):
compute_topomesh_property(topomesh,'epidermis',degree=1)
if not topomesh.has_wisp_property('cells',degree=0,is_computed=True):
compute_topomesh_property(topomesh,'cells',degree=0)
if not topomesh.has_wisp_property('cells',degree=1,is_computed=True):
compute_topomesh_property(topomesh,'cells',degree=1)
epidermis_convexity_force = array_dict(np.zeros_like(topomesh.wisp_property('barycenter',degree=0).values(),np.float32),np.array(list(topomesh.wisps(0))))
edge_cells_degree = np.array(map(len,topomesh.wisp_property('cells',degree=1).values()))
# edge_vertices = topomesh.wisp_property('vertices',degree=1).values()[np.where((topomesh.wisp_property('epidermis',degree=1).values()))]
# edge_vertices = topomesh.wisp_property('vertices',degree=1).values()[np.where((topomesh.wisp_property('epidermis',degree=1).values())&(edge_cells_degree>1))]
edge_vertices = topomesh.wisp_property('vertices',degree=1).values()[np.where((edge_cells_degree>2)|((topomesh.wisp_property('epidermis',degree=1).values())&(edge_cells_degree>1)))]
epidermis_vertices = np.unique(edge_vertices)
vertices_degrees = np.array(nd.sum(np.ones_like(edge_vertices),edge_vertices,index=epidermis_vertices),int)
reversed_edge_vertices = np.transpose([edge_vertices[:,1],edge_vertices[:,0]])
edge_vertices = np.append(edge_vertices,reversed_edge_vertices,axis=0)
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[:,0],edge_vertices[:,0],index=epidermis_vertices),
nd.sum(edge_vectors[:,1],edge_vertices[:,0],index=epidermis_vertices),
nd.sum(edge_vectors[:,2],edge_vertices[:,0],index=epidermis_vertices)])
laplacian_force = laplacian_force/vertices_degrees[:,np.newaxis]
# vertex_cell_barycenter = np.array([np.mean(topomesh.wisp_property('barycenter',degree=3).values(c),axis=0) for c in topomesh.wisp_property('cells',0).values(epidermis_vertices)])
# vertices_directions = topomesh.wisp_property('barycenter',degree=0).values(epidermis_vertices) - vertex_cell_barycenter
# vertices_directions = vertices_directions/np.linalg.norm(vertices_directions,axis=1)[:,np.newaxis]
# vertices_products = np.einsum('ij,ij->i',laplacian_force,vertices_directions)
# convex_points = np.where(vertices_products<0.)[0]
# laplacian_force[convex_points] -= vertices_directions[convex_points]*vertices_products[convex_points,np.newaxis]
# laplacian_force[convex_points] = np.array([0.,0.,0.])
epidermis_convexity_force.update(laplacian_force,keys=epidermis_vertices,erase_missing_keys=False)
return epidermis_convexity_force.values()
property_topomesh_optimization.py 文件源码
python
阅读 19
收藏 0
点赞 0
评论 0
评论列表
文章目录