| 265 | } |
| 266 | |
| 267 | void TriangleMesh::init_boundary_normals(const BoundaryPtr& bd) { |
| 268 | const size_t dim = m_mesh->get_dim(); |
| 269 | const size_t num_edges = m_boundary_edges.rows(); |
| 270 | m_boundary_normals.resize(num_edges, 3); |
| 271 | for (size_t i=0; i<num_edges; i++) { |
| 272 | const VectorI& edge = m_boundary_edges.row(i); |
| 273 | assert(2 == edge.size()); |
| 274 | VectorF v0 = m_mesh->get_vertex(edge[0]); |
| 275 | VectorF v1 = m_mesh->get_vertex(edge[1]); |
| 276 | |
| 277 | size_t face_idx = bd->get_boundary_element(i); |
| 278 | VectorF normal = m_mesh->get_attribute("face_normal").segment( |
| 279 | face_idx * 3, 3); |
| 280 | |
| 281 | Vector3F edge_v, normal_v; |
| 282 | edge_v.segment(0, dim) = v1 - v0; |
| 283 | normal_v.segment(0, 3) = normal; |
| 284 | |
| 285 | Vector3F edge_normal = edge_v.cross(normal_v).normalized(); |
| 286 | m_boundary_normals.row(i) = edge_normal; |
| 287 | } |
| 288 | } |
| 289 | |
| 290 | void TriangleMesh::init_boundary_vertex_normals() { |
| 291 | const size_t dim = getDim(); |
nothing calls this directly
no test coverage detected