From 1772005c1b72b9ea10b0c73954269ef60ee4d8aa Mon Sep 17 00:00:00 2001 From: ccolin Date: Thu, 1 Oct 2020 23:14:31 +0200 Subject: [PATCH] implements statistics computation on face areas --- README | 1 + src/main.cpp | 24 +++++++++++++++++++----- util/plot.py | 12 ++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100755 util/plot.py diff --git a/README b/README index c06945a..75629fa 100644 --- a/README +++ b/README @@ -2,3 +2,4 @@ Pour compiler la première fois : `mkdir build && make' Pour recompiler les fois suivantes : `make' Pour nettoyer les fichiers de compilation : `make clean' Pour exécuter le programme : `LD_LIBRARY_PATH=libs/OpenMesh/liblinux/ ./build/tp1 ' +Pour faire un bel histogramme coloré : LD_LIBRARY_PATH=libs/OpenMesh/liblinux/ build/tp1 | util/plot.py [nombre de classes, 10 par défaut] diff --git a/src/main.cpp b/src/main.cpp index 7587b2f..bfc5897 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -77,6 +77,18 @@ float total_area(MyMesh &mesh) { } +void stats_surface_area(MyMesh &mesh) { + if (!check_faces_are_triangles(mesh)) { + std::cerr << "Le calcul de l’aire ne peu se faire que sur un maillage triangulaire." << std::endl; + return; + } + for (const MyMesh::FaceHandle &face : mesh.faces()) { + std::cout << face_area(mesh, face) << " "; + } + std::cout << std::endl; +} + + int main(int argc, char *argv[]) { using namespace std; @@ -86,18 +98,20 @@ int main(int argc, char *argv[]) { } MyMesh mesh; OpenMesh::IO::read_mesh(mesh, argv[1]); - cout << "Les faces sont des triangles : " + cerr << "Les faces sont des triangles : " << (check_faces_are_triangles(mesh) ? "oui" : "non") << endl; - cout << "Les faces ont des voisines : " + cerr << "Les faces ont des voisines : " << (check_faces_arent_lonely(mesh) ? "oui" : "non") << endl; - cout << "Les sommets sont sur une arête : " + cerr << "Les sommets sont sur une arête : " << (check_vertices_arent_lonely(mesh) ? "oui" : "non") << endl; - cout << "Les arêtes sont sur une face : " + cerr << "Les arêtes sont sur une face : " << (check_edges_arent_lonely(argv[1]) ? "oui" : "non") << endl; - cout << "Aire totale : " << total_area(mesh) << endl; + cerr << "Aire totale : " << total_area(mesh) << endl; + // stats_to_csv(stats_surface_area(mesh)); + stats_surface_area(mesh); return 0; } diff --git a/util/plot.py b/util/plot.py new file mode 100755 index 0000000..3fd57e8 --- /dev/null +++ b/util/plot.py @@ -0,0 +1,12 @@ +#!/bin/python3 +import sys +from matplotlib import pyplot as plt + +data = list(map(float, sys.stdin.readline().split())) +vals, bins, _ = plt.hist(data, bins=10 if len(sys.argv) == 1 else int(sys.argv[1]), color='deeppink') +for i, v in zip([a + (b-a) / 2 for a, b in zip(bins, bins[1:])], vals): + plt.text(i, v, str(int(v)), color='darkviolet', ha='center', fontweight='bold') +plt.xticks(ticks=bins, + labels=list(map(lambda e: f'{e:.5}', bins)), + rotation=30, ha='right') +plt.show()