implements statistics computation on face areas

This commit is contained in:
ccolin 2020-10-01 23:14:31 +02:00
parent 47a9897747
commit 1772005c1b
3 changed files with 32 additions and 5 deletions

1
README
View File

@ -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 <obj>'
Pour faire un bel histogramme coloré : LD_LIBRARY_PATH=libs/OpenMesh/liblinux/ build/tp1 <obj> | util/plot.py [nombre de classes, 10 par défaut]

View File

@ -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 laire 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;
}

12
util/plot.py Executable file
View File

@ -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()