From fd494ffddcbb878511d0246d927c7a57dd1ddf7d Mon Sep 17 00:00:00 2001 From: hodasemi Date: Mon, 7 Jan 2019 21:41:52 +0100 Subject: [PATCH] Test volume --- exercise3/include/triangles.h | 114 ++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 39 deletions(-) diff --git a/exercise3/include/triangles.h b/exercise3/include/triangles.h index 8589e29..ff7f9f8 100644 --- a/exercise3/include/triangles.h +++ b/exercise3/include/triangles.h @@ -2,11 +2,14 @@ #include "util/OpenMeshUtils.h" -struct SimpleFace { +struct SimpleFace +{ std::vector he_handles; - bool is_triangulated() { - if (he_handles.size() != 3) { + bool is_triangulated() + { + if (he_handles.size() != 3) + { return false; } @@ -14,13 +17,17 @@ struct SimpleFace { } }; -struct Triangle { - Triangle(std::vector vpoints) { - if (vpoints.size() != 3) { +struct Triangle +{ + Triangle(std::vector vpoints) + { + if (vpoints.size() != 3) + { abort(); } - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 3; i++) + { points[i] = vpoints[i]; } } @@ -28,30 +35,37 @@ struct Triangle { OpenMesh::Vec3f points[3]; }; -class Triangles { -public: - Triangles(HEMesh private_mesh) { - std::vector simple_faces; +class Triangles +{ + public: + Triangles(HEMesh private_mesh) + { + std::vector simple_faces; - if (!gather_faces(private_mesh, simple_faces)) { - simple_faces.clear(); - private_mesh.triangulate(); + if (!gather_faces(private_mesh, simple_faces)) + { + simple_faces.clear(); + private_mesh.triangulate(); - if (!gather_faces(private_mesh, simple_faces)) { - abort(); - } - } + if (!gather_faces(private_mesh, simple_faces)) + { + abort(); + } + } - for (auto simple_face: simple_faces) { + for (auto simple_face : simple_faces) + { std::vector points = face_points(simple_face, private_mesh); triangles.emplace_back(points); } } - float surface_area() { + float surface_area() + { float surface_area = 0.0f; - for (Triangle& triangle : triangles) { + for (Triangle &triangle : triangles) + { OpenMesh::Vec3f p1 = triangle.points[0]; OpenMesh::Vec3f p2 = triangle.points[1]; OpenMesh::Vec3f p3 = triangle.points[2]; @@ -67,33 +81,55 @@ public: return surface_area; } -private: - bool gather_faces(const HEMesh& m, std::vector& simple_faces) { - auto faces = m.all_faces(); + float volume() + { + float volume = 0.0f; - for (auto face_handle : faces) { - HEMesh::ConstFaceHalfedgeIter fh_it = m.cfh_iter(face_handle); + for (Triangle &triangle : triangles) + { + OpenMesh::Vec3f p1 = triangle.points[0]; + OpenMesh::Vec3f p2 = triangle.points[1]; + OpenMesh::Vec3f p3 = triangle.points[2]; - SimpleFace simple_face; + volume = OpenMesh::dot(p1, OpenMesh::cross(p2, p3)); + } - for (; fh_it.is_valid(); ++fh_it) { - simple_face.he_handles.emplace_back(*fh_it); - } + return volume; + } - if (!simple_face.is_triangulated()) { - return false; - } + private: + bool gather_faces(const HEMesh &m, std::vector &simple_faces) + { + auto faces = m.all_faces(); - simple_faces.emplace_back(simple_face); - } + for (auto face_handle : faces) + { + HEMesh::ConstFaceHalfedgeIter fh_it = m.cfh_iter(face_handle); - return true; - } + SimpleFace simple_face; - std::vector face_points(SimpleFace& simple_face, const HEMesh& m) { + for (; fh_it.is_valid(); ++fh_it) + { + simple_face.he_handles.emplace_back(*fh_it); + } + + if (!simple_face.is_triangulated()) + { + return false; + } + + simple_faces.emplace_back(simple_face); + } + + return true; + } + + std::vector face_points(SimpleFace &simple_face, const HEMesh &m) + { std::vector points; - for (auto he : simple_face.he_handles) { + for (auto he : simple_face.he_handles) + { OpenMesh::VertexHandle vertex_handle = m.from_vertex_handle(he); points.emplace_back(m.point(vertex_handle));