| 288 | } |
| 289 | |
| 290 | void TriangleMesh::init_boundary_vertex_normals() { |
| 291 | const size_t dim = getDim(); |
| 292 | const size_t num_bd_vertices = getNbrBoundaryNodes(); |
| 293 | m_boundary_vertex_normals.resize(num_bd_vertices, 3); |
| 294 | for (size_t bvi=0; bvi<num_bd_vertices; bvi++) { |
| 295 | VectorI adj_edges = getBoundaryNodeAdjacentBoundaryFaces(bvi); |
| 296 | VectorF normal = VectorF::Zero(3); |
| 297 | const size_t num_adj_edges = adj_edges.size(); |
| 298 | for (size_t j=0; j<num_adj_edges; j++) { |
| 299 | size_t bej = adj_edges[j]; |
| 300 | VectorF edge_normal = getBoundaryFaceNormal(bej); |
| 301 | Float edge_len = getBoundaryFaceArea(bej); |
| 302 | normal += edge_normal * edge_len; |
| 303 | } |
| 304 | normal.normalize(); |
| 305 | m_boundary_vertex_normals.row(bvi) = normal; |
| 306 | } |
| 307 | } |
| 308 | |