quality.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. /*************************************/
  2. /* Auteur : Rémi Synave */
  3. /* Date de création : 03/04/07 */
  4. /* Date de modification : 18/09/16 */
  5. /* Version : 0.4 */
  6. /*************************************/
  7. /***************************************************************************/
  8. /* This file is part of a2ri. */
  9. /* */
  10. /* a2ri is free software: you can redistribute it and/or modify it */
  11. /* under the terms of the GNU Lesser General Public License as published */
  12. /* by the Free Software Foundation, either version 3 of the License, or */
  13. /* (at your option) any later version. */
  14. /* */
  15. /* a2ri is distributed in the hope that it will be useful, */
  16. /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
  17. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
  18. /* GNU Lesser General Public License for more details. */
  19. /* */
  20. /* You should have received a copy of the GNU Lesser General Public */
  21. /* License along with a2ri. */
  22. /* If not, see <http://www.gnu.org/licenses/>. */
  23. /***************************************************************************/
  24. #ifndef HASH_QUALITY__H
  25. #define HASH_QUALITY__H
  26. #include <math.h>
  27. #include <gsl/gsl_linalg.h>
  28. #include <gsl/gsl_math.h>
  29. #include <gsl/gsl_blas.h>
  30. #include "util.h"
  31. #include "vector.h"
  32. #include "point.h"
  33. #include "vertex.h"
  34. #include "face.h"
  35. #include "model.h"
  36. #include "skeleton.h"
  37. #include "matrix.h"
  38. #include "geometry.h"
  39. #include "hashtable.h"
  40. #include "topology.h"
  41. #define NO_SAMPLING 0
  42. #define SAMPLING 1
  43. /**
  44. Calcul de l'erreur mean ratio metric sur un modèle pour une face
  45. @param m le modèle
  46. @param numface numéro de la face à évaluer
  47. @return évaluation de la face
  48. */
  49. double a2ri_vf_mean_ratio_metric_for_a_face (
  50. const vf_model * const m,
  51. int numface);
  52. /**
  53. Calcul de l'erreur mean ratio metric sur un modèle complet
  54. @param m le modèle
  55. @return évaluation du modèle
  56. */
  57. double a2ri_vf_mean_ratio_metric (
  58. const vf_model * const m);
  59. /**
  60. Calcule la liste des angles des triangles composant le modèle
  61. @param m le modèle
  62. @param list pointeur sur le tableau contenant la liste des angles
  63. @param size pointeur sur la taille du tableau
  64. @return aucun
  65. */
  66. void a2ri_vf_list_angle (
  67. const vf_model * const m,
  68. double ** list,
  69. int * size);
  70. /**
  71. Calcule la liste des aires des triangles composant le modèle
  72. @param m le modèle
  73. @param list pointeur sur le tableau contenant la liste des aires
  74. @param size pointeur sur la taille du tableau
  75. @return aucun
  76. */
  77. void a2ri_vf_list_area (
  78. const vf_model * const m,
  79. double ** list,
  80. int * size);
  81. /**
  82. Calcule la liste des valences des sommets composant le modèle
  83. @param m le modèle
  84. @param list pointeur sur le tableau contenant la liste des valences
  85. @param size pointeur sur la taille du tableau
  86. @return aucun
  87. */
  88. void a2ri_vf_list_valence (
  89. const vf_model * const m,
  90. int ** list,
  91. int * size);
  92. /**
  93. Calcule la liste des longueurs des aretes composant le modèle
  94. @param m le modèle
  95. @param list pointeur sur le tableau contenant la liste des longueurs des aretes
  96. @param size pointeur sur la taille du tableau
  97. @return aucun
  98. */
  99. //On ne peut pas garantir le const du vf_model ici
  100. void a2ri_vf_list_edge_length (
  101. vf_model * m,
  102. double ** list,
  103. int * size);
  104. /**
  105. Calcule la liste des longueurs des hauteurs des triangles composant le modèle
  106. @param m le modèle
  107. @param list pointeur sur le tableau contenant la liste des hauteurs
  108. @param size pointeur sur la taille du tableau
  109. @return aucun
  110. */
  111. //On ne peut pas garantir le const du vf_model ici
  112. void a2ri_vf_list_height_length (
  113. vf_model * m,
  114. double ** list,
  115. int * size);
  116. /**
  117. Compte le nombre d'angles du modèle par intervalle de 10 degres
  118. @param m le modèle
  119. @return un tableau de 18 entiers contenant le nombre d'angle compris entre 0-10, 10-20, ... , 170-180
  120. */
  121. int * a2ri_vf_angle_measure (
  122. const vf_model * const m);
  123. /**
  124. Calcul de l'erreur de Hausdorff
  125. @param m1 premier modèle
  126. @param m2 second modèle
  127. @param sampling SAMPLING ou NO_SAMPLING <BR> indique s'il faut ou non échantillonner les faces.
  128. @return erreur de Hausdorff
  129. */
  130. double a2ri_vf_hausdorff (
  131. const vf_model * const m1,
  132. const vf_model * const m2,
  133. int sampling);
  134. /**
  135. Calcul de la distance entre un point et un ensemble de points en se basant sur la métrique Point-Point
  136. @param p le point
  137. @param points tableau de réel contenant les coordoonées des sommets du maillage
  138. @param size taille du tableau
  139. @return distance entre le point et le modèle
  140. */
  141. double DPP (
  142. const point3d *const p,
  143. const point3d * const points,
  144. int size);
  145. /**
  146. calcul de l'erreur moyenne "Emean" entre deux modèles
  147. @param m1 le premier modèle
  148. @param m2 le second modèle
  149. @param sampling SAMPLING ou NO_SAMPLING <BR> indique s'il faut ou non échantillonner les faces.
  150. @return l'erreur "Emean"
  151. */
  152. double a2ri_vf_Emn_DPP (
  153. const vf_model * const m1,
  154. const vf_model * const m2,
  155. int sampling);
  156. /**
  157. Evaluation de l'aspect ratio d'un triangle
  158. @param m le modèle
  159. @param numface numéro de la face à évaluer
  160. @return évaluation de l'aspect ratio
  161. */
  162. double a2ri_vf_triangle_aspect_ratio (
  163. const vf_model * const m,
  164. int numface);
  165. /**
  166. Evaluation de la qualité d'une face d'un triangle avec la méthode de Rypl
  167. @param m le modèle
  168. @param numface numéro de la face à évaluer
  169. @return évaluation de l'aspect ratio
  170. */
  171. double a2ri_vf_triangle_rypl (
  172. const vf_model * const m,
  173. int numface);
  174. /**
  175. Calcul de la liste d'aspect ratio d'un modèle
  176. @param m le modèle
  177. @param list pointeur sur un tableau contenant tous les aspect ratio des triangles composant le modèle
  178. @param siuze pointeur sur la taille du tableau
  179. @return aucun
  180. */
  181. void a2ri_vf_list_triangle_aspect_ratio (
  182. const vf_model * const m,
  183. double ** list,
  184. int *size);
  185. /**
  186. Calcul de la variation de taille (d'aire) entre deux faces du modèle
  187. @param m le modèle
  188. @param face1 numéro de la première face servant de base
  189. @param face2 numéro de la seconde face
  190. @return variation de la taille : Aire_face1/Aire_face2
  191. */
  192. double a2ri_vf_face_size_variation (
  193. const vf_model * const m,
  194. int face1,
  195. int face2);
  196. /**
  197. Calcul de la liste des rayons des cercles inscrit aux faces du modèles
  198. @param m le modèle
  199. @param list pointeur sur le tableau contenant la liste des rayons des cercles inscrits
  200. @param size pointeur sur la taille du tableau
  201. @return aucun
  202. */
  203. void a2ri_vf_list_radius_incircle (
  204. const vf_model * const m,
  205. double ** list,
  206. int * size);
  207. /**
  208. Calcul de la courbure de gauss pour un sommet
  209. @param m le modele
  210. @param ve numéro du sommet
  211. @return le courbure de gauss en ce sommet
  212. */
  213. double a2ri_vf_gauss_curvature (
  214. const vf_model * const m,
  215. int ve);
  216. /**
  217. Calcul de la courbure de gauss pour une liste de sommet
  218. @param m le modele
  219. @param ve liste de sommets
  220. @param size taille de la liste
  221. @param list liste des courbures associés à chaque sommet
  222. @return aucun
  223. */
  224. void a2ri_vf_gauss_curvature_list_of_vertex (
  225. const vf_model * const m,
  226. const int * const ve,
  227. int size,
  228. double ** list);
  229. /**
  230. Calcul de la mean curvature pour une arete
  231. @param m le modele
  232. @param ve1 premier sommet de l'arete
  233. @param ve2 second sommet de l'arete
  234. @return la mean curvature pour cette arete
  235. */
  236. vector3d a2ri_vf_mean_curvature (
  237. const vf_model * const m,
  238. int ve1,
  239. int ve2);
  240. /**
  241. Calcul de la mean curvature pour un chemin
  242. @param m le modele
  243. @param list chemin décrit par ses sommets
  244. @param size taille du tableau list
  245. @param list_vector liste des vector3d retourner pour chaque arete
  246. @param size_list_vector taille de la liste list_vector
  247. @return aucun
  248. */
  249. void a2ri_vf_mean_curvature_path (
  250. const vf_model * const m,
  251. const int * const list,
  252. int size,
  253. vector3d ** list_vector,
  254. int * size_list_vector);
  255. /**
  256. Calcul de la courbure de Levi-Civita
  257. @param m le modele
  258. @param numve numéro du sommet
  259. @return la courbure de Levi-Civita
  260. */
  261. double a2ri_vf_levi_civita (
  262. const vf_model * const m,
  263. int numve);
  264. /**
  265. Calcul de la courbure de Levi-Civita
  266. @param m le modele
  267. @param numve numéro du sommet
  268. @return la courbure de Levi-Civita
  269. */
  270. void a2ri_vf_levi_civita_list_of_vertex (
  271. const vf_model * const m,
  272. const int * const ve,
  273. int size,
  274. double ** list);
  275. /**
  276. Calcul des courbures avec la méthode garimella
  277. @param m le modele
  278. @param numve numéro du sommet
  279. @param K gaussian curvature
  280. @param H mean curvature
  281. @return aucun
  282. **/
  283. void a2ri_vf_garimella (
  284. const vf_model * const m,
  285. int numve,
  286. double * K,
  287. double * H);
  288. /**
  289. Calcul de la précision, justesse d'un squelette par rapport à un modèle numérique
  290. @param m le modèle
  291. @param s le squelette
  292. @return un nombre définissant la précision du squelette par rapport au modèle. Plus ce nombre sera élevé, moins le squelette sera ajusté au modèle.
  293. **/
  294. int a2ri_vf_model_skeleton_accuracy(
  295. const vf_model * const m,
  296. const skeleton * const s);
  297. #endif