overlap.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. /*************************************/
  2. /* Auteur : Rémi Synave */
  3. /* Date de création : 01/03/07 */
  4. /* Date de modification : 15/03/15 */
  5. /* Version : 0.4 */
  6. /*************************************/
  7. /*************************************/
  8. /* Auteur : Romain Leguay */
  9. /* Nguyen Haiduong */
  10. /* Solange Houeto */
  11. /* Marianne Fichoux */
  12. /* Date de modification : 06/06/09 */
  13. /* Version : 0.2 */
  14. /*************************************/
  15. /***************************************************************************/
  16. /* This file is part of a2ri. */
  17. /* */
  18. /* a2ri is free software: you can redistribute it and/or modify it */
  19. /* under the terms of the GNU Lesser General Public License as published */
  20. /* by the Free Software Foundation, either version 3 of the License, or */
  21. /* (at your option) any later version. */
  22. /* */
  23. /* a2ri is distributed in the hope that it will be useful, */
  24. /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
  25. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
  26. /* GNU Lesser General Public License for more details. */
  27. /* */
  28. /* You should have received a copy of the GNU Lesser General Public */
  29. /* License along with a2ri. */
  30. /* If not, see <http://www.gnu.org/licenses/>. */
  31. /***************************************************************************/
  32. #include "overlap.h"
  33. /********** INTERMEDIATE TYPES AND FUNCTIONS **********/
  34. /* Les fonctions intermédiaires sont préfixées de IF */
  35. /* et les types intermédiaires de IT */
  36. typedef struct
  37. {
  38. point3d *liste_centre1,
  39. *liste_centre2;
  40. double *liste_rayon1,
  41. *liste_rayon2;
  42. double sensibility;
  43. int nbtest1deb,
  44. nbtest1fin,
  45. nbtest2;
  46. int **retour,
  47. *nbelt;
  48. vf_model *m;
  49. } IToverlap_thread_argument;
  50. void *
  51. IFthread_process_overlap (
  52. void *argu)
  53. {
  54. IToverlap_thread_argument *arg = (IToverlap_thread_argument *) argu;
  55. *(arg->retour) = NULL;
  56. *(arg->nbelt) = 0;
  57. for (int i = arg->nbtest1deb; i <= arg->nbtest1fin; i++)
  58. {
  59. //on vérifie l'intersection de la bounding ball de la face du modèle m
  60. //avec l'ensemble des bounding ball du modèle base
  61. if (intersection_bounding_ball_with_bounding_ball_list
  62. (&(arg->liste_centre1[i]), arg->liste_rayon1[i], arg->liste_centre2,
  63. arg->liste_rayon2, arg->nbtest2, arg->sensibility))
  64. {
  65. //s'il y a internsetion , on ajoute les somemts de cette face à une liste en évitant les redondances
  66. list_int_add (arg->retour, arg->nbelt, arg->m->fa[i].ve1,
  67. WITHOUT_REDUNDANCE);
  68. list_int_add (arg->retour, arg->nbelt, arg->m->fa[i].ve2,
  69. WITHOUT_REDUNDANCE);
  70. list_int_add (arg->retour, arg->nbelt, arg->m->fa[i].ve3,
  71. WITHOUT_REDUNDANCE);
  72. }
  73. }
  74. pthread_exit (0);
  75. }
  76. /********** MAIN FUNCTIONS **********/
  77. /**
  78. Test de l'intersection d'une AABB avec une liste d'AABB
  79. @param min coin inférieur de la AABB
  80. @param max coin supérieur de la AABB
  81. @param listmin liste des coins inférieurs des AABB
  82. @param listmax liste des coins supérieurs des AABB
  83. @param size taille de la liste des AABB
  84. @return 1 si intersection, 0 sinon
  85. **/
  86. int
  87. intersection_axis_aligned_bounding_box_with_axis_aligned_bounding_box_list (
  88. const point3d * const min,
  89. const point3d * const max,
  90. const point3d * const listmin,
  91. const point3d * const listmax,
  92. int size)
  93. {
  94. for (int i = 0; i < size; i++)
  95. {
  96. if ((min->x < listmax[i].x) && (max->x > listmin[i].x) &&
  97. (min->y < listmax[i].y) && (max->y > listmin[i].y) &&
  98. (min->z < listmax[i].z) && (max->z > listmin[i].z))
  99. return 1;
  100. }
  101. return 0;
  102. }
  103. /**
  104. Test de l'instesection d'une bounding ball avec une liste de bounding ball
  105. @param cx coordonnée x du centre de la bounding ball
  106. @param cy coordonnée y du centre de la bounding ball
  107. @param cz coordonnée z du centre de la bounding ball
  108. @param rayon rayon de la bounding ball
  109. @param listx liste des coordonnées x des centres des bounding ball
  110. @param listy liste des coordonnées y des centres des bounding ball
  111. @param listz liste des coordonnées z des centres des bounding ball
  112. @param rayon liste des rayons des bounding ball
  113. @param nbelt taille de la liste
  114. @param alpha
  115. **/
  116. int
  117. intersection_bounding_ball_with_bounding_ball_list (
  118. const point3d * const c,
  119. double rayon,
  120. const point3d * const listcentre,
  121. const double * const listrayon,
  122. int nbelt,
  123. double alpha)
  124. {
  125. for (int i = 0; i < nbelt; i++)
  126. if (point3d_length (c, &(listcentre[i])) <= (rayon + listrayon[i]) * alpha)
  127. return 1;
  128. return 0;
  129. }
  130. /**
  131. Calcule le taux de recouvrement en utilisant les bounding ball de ritter
  132. @param base modèle de base
  133. @param m modèle dont on veux trouver le taux de recouvrement avec le modèle de base
  134. @return le taux de recouvrement trouvé
  135. **/
  136. double
  137. a2ri_vf_bounding_ball_ritter_compute_overlap (
  138. const vf_model * const base,
  139. const vf_model * const m,
  140. double sensibility)
  141. {
  142. double *listrayonmodelm = NULL,
  143. *listrayonbase = NULL;
  144. int *facesmodelm = NULL,
  145. *facesbase = NULL,
  146. nbfacesmodelm,
  147. nbfacesbase,
  148. nbintersection = 0,
  149. *numvertex = NULL,
  150. nbelt = 0;
  151. point3d *listcentrebase = NULL,
  152. *listcentremodelm = NULL;
  153. facesmodelm = (int *) malloc (m->nbface * sizeof (int));
  154. a2ri_erreur_critique_si (facesmodelm == NULL,
  155. "erreur allocation memoire pour facesmodelm\na2ri_vf_bounding_ball_ritter_compute_overlap");
  156. facesbase = (int *) malloc (base->nbface * sizeof (int));
  157. a2ri_erreur_critique_si (facesbase == NULL,
  158. "erreur allocation memoire pour facesbase\na2ri_vf_bounding_ball_ritter_compute_overlap");
  159. //on va calculer le taux de recouvrement à partir de toutes les faces du modèle m
  160. for (int i = 0; i < m->nbface; i++)
  161. facesmodelm[i] = i;
  162. nbfacesmodelm = m->nbface;
  163. //on va calculer le taux de recouvrement à partir de toutes les faces du modèle base
  164. for (int i = 0; i < base->nbface; i++)
  165. facesbase[i] = i;
  166. nbfacesbase = base->nbface;
  167. //on demande les bounding ball de ritter pour toutes les faces
  168. a2ri_vf_bounding_ball_ritter (base, facesbase, nbfacesbase,
  169. &listcentrebase, &listrayonbase);
  170. a2ri_vf_bounding_ball_ritter (m, facesmodelm, nbfacesmodelm,
  171. &listcentremodelm, &listrayonmodelm);
  172. //pour toutes les bounding ball des faces du modèle m
  173. for (int i = 0; i < nbfacesmodelm; i++)
  174. {
  175. //on vérifie l'intersection de la bounding ball de la face du modèle m
  176. //avec l'ensemble des bounding ball du modèle base
  177. if (intersection_bounding_ball_with_bounding_ball_list
  178. (&(listcentremodelm[i]), listrayonmodelm[i], listcentrebase,
  179. listrayonbase, nbfacesbase, sensibility))
  180. {
  181. //s'il y a internsetion , on ajoute les somemts de cette face à une liste en évitant les redondances
  182. list_int_add (&numvertex, &nbelt, m->fa[i].ve1, WITHOUT_REDUNDANCE);
  183. list_int_add (&numvertex, &nbelt, m->fa[i].ve2, WITHOUT_REDUNDANCE);
  184. list_int_add (&numvertex, &nbelt, m->fa[i].ve3, WITHOUT_REDUNDANCE);
  185. nbintersection++;
  186. }
  187. }
  188. free (listrayonmodelm);
  189. free (listrayonbase);
  190. free (facesmodelm);
  191. free (facesbase);
  192. free (numvertex);
  193. free (listcentrebase);
  194. free (listcentremodelm);
  195. //le taux de recouvrement est la taille de la liste de sommet divisé par le nombre de sommet du modèle
  196. return (nbelt * 1.0) / ((m->nbvertex) * 1.0);
  197. }
  198. /**
  199. Calcule le taux de recouvrement en utilisant les bounding ball minimale
  200. @param base modèle de base
  201. @param m modèle dont on veux trouver le taux de recouvrement avec le modèle de base
  202. @return le taux de recouvrement trouvé
  203. **/
  204. //Remarque : les maillages devraient etre qualifiés de const mais impossible a cause de l'utilisation de pthread
  205. double
  206. a2ri_vf_bounding_ball_minimale_compute_overlap (
  207. vf_model * base,
  208. vf_model * m,
  209. double sensibility)
  210. {
  211. double *listrayonmodelm = NULL,
  212. *listrayonbase = NULL;
  213. int *facesmodelm = NULL,
  214. *facesbase = NULL,
  215. nbfacesmodelm,
  216. nbfacesbase,
  217. *numvertex = NULL,
  218. nbelt = 0;
  219. point3d *listcentrebase = NULL,
  220. *listcentremodelm = NULL;
  221. pthread_t th[A2RI_NB_THREAD];
  222. IToverlap_thread_argument argument[A2RI_NB_THREAD];
  223. void *ret[A2RI_NB_THREAD];
  224. int *liste_retour[A2RI_NB_THREAD],
  225. size_liste_retour[A2RI_NB_THREAD];
  226. facesmodelm = (int *) malloc (m->nbface * sizeof (int));
  227. a2ri_erreur_critique_si (facesmodelm == NULL,
  228. "erreur allocation memoire pour facesmodelm\na2ri_vf_bounding_ball_ritter_compute_overlap");
  229. facesbase = (int *) malloc (base->nbface * sizeof (int));
  230. a2ri_erreur_critique_si (facesbase == NULL,
  231. "erreur allocation memoire pour facesbase\na2ri_vf_bounding_ball_ritter_compute_overlap");
  232. //on va calculer le taux de recouvrement à partir de toutes les faces du modèle m
  233. for (int i = 0; i < m->nbface; i++)
  234. facesmodelm[i] = i;
  235. nbfacesmodelm = m->nbface;
  236. //on va calculer le taux de recouvrement à partir de toutes les faces du modèle base
  237. for (int i = 0; i < base->nbface; i++)
  238. facesbase[i] = i;
  239. nbfacesbase = base->nbface;
  240. //on demande les bounding ball minimales pour toutes les faces
  241. a2ri_vf_bounding_ball_minimale (base, facesbase, nbfacesbase,
  242. &listcentrebase, &listrayonbase);
  243. a2ri_vf_bounding_ball_minimale (m, facesmodelm, nbfacesmodelm,
  244. &listcentremodelm, &listrayonmodelm);
  245. for (int i = 0; i < A2RI_NB_THREAD - 1; i++)
  246. {
  247. argument[i].liste_centre2 = listcentrebase;
  248. argument[i].liste_rayon2 = listrayonbase;
  249. argument[i].nbtest2 = nbfacesbase;
  250. argument[i].nbtest1deb = (nbfacesmodelm / A2RI_NB_THREAD) * i;
  251. argument[i].nbtest1fin = (nbfacesmodelm / A2RI_NB_THREAD) * (i + 1) - 1;
  252. argument[i].liste_centre1 = listcentremodelm;
  253. argument[i].liste_rayon1 = listrayonmodelm;
  254. argument[i].sensibility = sensibility;
  255. argument[i].retour = &liste_retour[i];
  256. argument[i].nbelt = &size_liste_retour[i];
  257. argument[i].m = m;
  258. }
  259. argument[A2RI_NB_THREAD - 1].liste_centre2 = listcentrebase;
  260. argument[A2RI_NB_THREAD - 1].liste_rayon2 = listrayonbase;
  261. argument[A2RI_NB_THREAD - 1].nbtest2 = nbfacesbase;
  262. argument[A2RI_NB_THREAD - 1].nbtest1deb =
  263. (nbfacesmodelm / A2RI_NB_THREAD) * (A2RI_NB_THREAD - 1);
  264. argument[A2RI_NB_THREAD - 1].nbtest1fin = nbfacesmodelm - 1;
  265. argument[A2RI_NB_THREAD - 1].liste_centre1 = listcentremodelm;
  266. argument[A2RI_NB_THREAD - 1].liste_rayon1 = listrayonmodelm;
  267. argument[A2RI_NB_THREAD - 1].sensibility = sensibility;
  268. argument[A2RI_NB_THREAD - 1].retour = &liste_retour[A2RI_NB_THREAD - 1];
  269. argument[A2RI_NB_THREAD - 1].nbelt = &size_liste_retour[A2RI_NB_THREAD - 1];
  270. argument[A2RI_NB_THREAD - 1].m = m;
  271. for (int i = 0; i < A2RI_NB_THREAD; i++)
  272. {
  273. if (pthread_create (th + i, NULL, IFthread_process_overlap, argument + i)
  274. < 0)
  275. exit (1);
  276. }
  277. for (int i = 0; i < A2RI_NB_THREAD; i++)
  278. (void) pthread_join (th[i], &ret[i]);
  279. for (int i = 1; i < A2RI_NB_THREAD; i++)
  280. for (int j = 0; j < size_liste_retour[i]; j++)
  281. list_int_add (&liste_retour[0], &size_liste_retour[0],
  282. liste_retour[i][j], WITHOUT_REDUNDANCE);
  283. nbelt = size_liste_retour[0];
  284. free (listrayonmodelm);
  285. free (listrayonbase);
  286. free (facesmodelm);
  287. free (facesbase);
  288. free (numvertex);
  289. free (listcentrebase);
  290. free (listcentremodelm);
  291. //le taux de recouvrement est la taille de la liste de sommet divisé par le nombre de sommet du modèle
  292. return (nbelt * 1.0) / ((m->nbvertex) * 1.0);
  293. }
  294. /**
  295. Calcule le taux de recouvrement en utilisant les axis aligned bounding box
  296. @param base modèle de base
  297. @param m modèle dont on veux trouver le taux de recouvrement avec le modèle de base
  298. @return le taux de recouvrement trouvé
  299. **/
  300. double
  301. a2ri_vf_axis_aligned_bounding_box_compute_overlap (
  302. const vf_model * const base,
  303. const vf_model * const m)
  304. {
  305. point3d *ptminbase = NULL,
  306. *ptmaxbase = NULL,
  307. *ptminmodelm = NULL,
  308. *ptmaxmodelm = NULL;
  309. int *facesmodelm,
  310. *facesbase,
  311. nbfacesmodelm,
  312. nbfacesbase,
  313. nbintersection = 0,
  314. *numvertex = NULL,
  315. nbelt = 0;
  316. facesmodelm = (int *) malloc (m->nbface * sizeof (int));
  317. a2ri_erreur_critique_si (facesmodelm == NULL,
  318. "erreur allocation memoire pour facesmodelm\na2ri_vf_axis_aligned_bounding_box_compute_overlap");
  319. facesbase = (int *) malloc (base->nbface * sizeof (int));
  320. a2ri_erreur_critique_si (facesbase == NULL,
  321. "erreur allocation memoire pour facesbase\na2ri_vf_axis_aligned_bounding_box_compute_overlap");
  322. //on va calculer le taux de recouvrement à partir de toutes les faces du modèle m
  323. for (int i = 0; i < m->nbface; i++)
  324. facesmodelm[i] = i;
  325. nbfacesmodelm = m->nbface;
  326. //on va calculer le taux de recouvrement à partir de toutes les faces du modèle base
  327. for (int i = 0; i < base->nbface; i++)
  328. facesbase[i] = i;
  329. nbfacesbase = base->nbface;
  330. //on demande les bounding box de toutes les faces
  331. a2ri_vf_axis_aligned_bounding_box (base, facesbase, nbfacesbase,
  332. &ptminbase, &ptmaxbase);
  333. a2ri_vf_axis_aligned_bounding_box (m, facesmodelm, nbfacesmodelm,
  334. &ptminmodelm, &ptmaxmodelm);
  335. //pour toutes les faces du modèle m
  336. for (int i = 0; i < nbfacesmodelm; i++)
  337. {
  338. //on vérifie si la bounding box de la face s'intersecte avec la liste des bounding box du modèle base
  339. if (intersection_axis_aligned_bounding_box_with_axis_aligned_bounding_box_list (&(ptminmodelm[i]), &(ptmaxmodelm[i]), ptminbase, ptmaxbase, nbfacesbase))
  340. {
  341. //dans ce cas, on ajoute les trois sommets à une liste en évitant les redondances
  342. list_int_add (&numvertex, &nbelt, m->fa[i].ve1, WITHOUT_REDUNDANCE);
  343. list_int_add (&numvertex, &nbelt, m->fa[i].ve2, WITHOUT_REDUNDANCE);
  344. list_int_add (&numvertex, &nbelt, m->fa[i].ve3, WITHOUT_REDUNDANCE);
  345. nbintersection++;
  346. }
  347. }
  348. free (ptminbase);
  349. free (ptmaxbase);
  350. free (ptminmodelm);
  351. free (ptmaxmodelm);
  352. free (facesmodelm);
  353. free (facesbase);
  354. free (numvertex);
  355. //le taux de recouvrement est égale à la taille de la liste divisé par le nombre de sommets du modèle
  356. return (nbelt * 1.0) / ((m->nbvertex) * 1.0);
  357. }
  358. /**
  359. Calcule la liste des faces du modèle m s'intersectant avec le modèle base en utilisant les bounding ball de ritter.
  360. @param base modèle servant de base
  361. @param m modèle dont on cherche les faces s'intersectant avec le modèle de base
  362. @param list liste des faces s'intersectant
  363. @param size taille de la liste
  364. @param alpha variable alpha servant lors du test d'intesection
  365. @return aucun
  366. **/
  367. void
  368. a2ri_vf_bounding_ball_ritter_find_face_overlapping (
  369. const vf_model * const base,
  370. const vf_model * const m,
  371. int **list,
  372. int *size,
  373. double alpha)
  374. {
  375. *list = NULL;
  376. *size = 0;
  377. double *listrayonmodelm = NULL,
  378. *listrayonbase = NULL;
  379. int *facesmodelm,
  380. *facesbase,
  381. nbfacesmodelm,
  382. nbfacesbase;
  383. point3d *listcentrebase = NULL,
  384. *listcentremodelm = NULL;
  385. //on va demander les bounding ball de toutes les faces des deux modèles
  386. facesmodelm = (int *) malloc (m->nbface * sizeof (int));
  387. a2ri_erreur_critique_si (facesmodelm == NULL,
  388. "erreur allocation memoire pour facesmodelm\na2ri_vf_bounding_ball_ritter_find_face_overlapping");
  389. facesbase = (int *) malloc (base->nbface * sizeof (int));
  390. a2ri_erreur_critique_si (facesbase == NULL,
  391. "erreur allocation memoire pour facesbase\na2ri_vf_bounding_ball_ritter_find_face_overlapping");
  392. for (int i = 0; i < m->nbface; i++)
  393. facesmodelm[i] = i;
  394. nbfacesmodelm = m->nbface;
  395. for (int i = 0; i < base->nbface; i++)
  396. facesbase[i] = i;
  397. nbfacesbase = base->nbface;
  398. a2ri_vf_bounding_ball_ritter (base, facesbase, nbfacesbase,
  399. &listcentrebase, &listrayonbase);
  400. a2ri_vf_bounding_ball_ritter (m, facesmodelm, nbfacesmodelm,
  401. &listcentremodelm, &listrayonmodelm);
  402. //pour toutes les faces du modèles m
  403. for (int i = 0; i < nbfacesmodelm; i++)
  404. {
  405. //on vérifie s'il y a intersection entre la bounding ball et l'ensemble des bounding ball des faces de l'autre modèle
  406. if (intersection_bounding_ball_with_bounding_ball_list
  407. (&(listcentremodelm[i]), listrayonmodelm[i], listcentrebase,
  408. listrayonbase, nbfacesbase, alpha))
  409. //dans ce cas, on ajoute la face à la liste
  410. list_int_add (list, size, i, WITH_REDUNDANCE);
  411. }
  412. free (listrayonmodelm);
  413. free (listrayonbase);
  414. free (facesmodelm);
  415. free (facesbase);
  416. free (listcentrebase);
  417. free (listcentremodelm);
  418. }
  419. /**
  420. Calcule la liste des faces du modèle m s'intersectant avec le modèle base en utilisant les bounding ball de ritter.
  421. @param base modèle servant de base
  422. @param m modèle dont on cherche les faces s'intersectant avec le modèle de base
  423. @param list liste des faces s'intersectant
  424. @param size taille de la liste
  425. @param alpha variable alpha servant lors du test d'intesection
  426. @return aucun
  427. **/
  428. void
  429. a2ri_vf_bounding_ball_minimale_find_face_overlapping (
  430. const vf_model * const base,
  431. const vf_model * const m,
  432. int **list,
  433. int *size,
  434. double alpha)
  435. {
  436. *list = NULL;
  437. *size = 0;
  438. double *listrayonmodelm = NULL,
  439. *listrayonbase = NULL;
  440. int *facesmodelm,
  441. *facesbase,
  442. nbfacesmodelm,
  443. nbfacesbase;
  444. point3d *listcentrebase = NULL,
  445. *listcentremodelm = NULL;
  446. //on va demander les bounding ball de toutes les faces des deux modèles
  447. facesmodelm = (int *) malloc (m->nbface * sizeof (int));
  448. a2ri_erreur_critique_si (facesmodelm == NULL,
  449. "erreur allocation memoire pour facesmodelm\na2ri_vf_bounding_ball_ritter_find_face_overlapping");
  450. facesbase = (int *) malloc (base->nbface * sizeof (int));
  451. a2ri_erreur_critique_si (facesbase == NULL,
  452. "erreur allocation memoire pour facesbase\na2ri_vf_bounding_ball_ritter_find_face_overlapping");
  453. for (int i = 0; i < m->nbface; i++)
  454. facesmodelm[i] = i;
  455. nbfacesmodelm = m->nbface;
  456. for (int i = 0; i < base->nbface; i++)
  457. facesbase[i] = i;
  458. nbfacesbase = base->nbface;
  459. a2ri_vf_bounding_ball_minimale (base, facesbase, nbfacesbase,
  460. &listcentrebase, &listrayonbase);
  461. a2ri_vf_bounding_ball_minimale (m, facesmodelm, nbfacesmodelm,
  462. &listcentremodelm, &listrayonmodelm);
  463. //pour toutes les faces du modèles m
  464. for (int i = 0; i < nbfacesmodelm; i++)
  465. {
  466. //on vérifie s'il y a intersection entre la bounding ball et l'ensemble des bounding ball des faces de l'autre modèle
  467. if (intersection_bounding_ball_with_bounding_ball_list
  468. (&(listcentremodelm[i]), listrayonmodelm[i], listcentrebase,
  469. listrayonbase, nbfacesbase, alpha))
  470. //dans ce cas, on ajoute la face à la liste
  471. list_int_add (list, size, i, WITH_REDUNDANCE);
  472. }
  473. free (listrayonmodelm);
  474. free (listrayonbase);
  475. free (facesmodelm);
  476. free (facesbase);
  477. free (listcentrebase);
  478. free (listcentremodelm);
  479. }
  480. /**
  481. Calcule la liste des faces du modèle m s'intersectant avec le modèle base en utilisant les AABB
  482. @param base modèle servant de base
  483. @param m modèle dont on cherche les faces s'intersectant avec le modèle de base
  484. @param list liste des faces s'intersectant
  485. @param size taille de la liste
  486. @return aucun
  487. **/
  488. void
  489. a2ri_vf_axis_aligned_bounding_box_find_face_overlapping (
  490. const vf_model * const base,
  491. const vf_model * const m,
  492. int **listface,
  493. int *size)
  494. {
  495. *listface = NULL;
  496. *size = 0;
  497. int *facesmodelm,
  498. *facesbase,
  499. nbfacesmodelm,
  500. nbfacesbase;
  501. point3d *listptminbase = NULL,
  502. *listptminm = NULL,
  503. *listptmaxbase = NULL,
  504. *listptmaxm = NULL;
  505. //on va demander les bounding box de toutes les faces des deux modèles
  506. facesmodelm = (int *) malloc (m->nbface * sizeof (int));
  507. a2ri_erreur_critique_si (facesmodelm == NULL,
  508. "erreur allocation memoire pour facesmodelm\na2ri_vf_axis_aligned_bounding_box_find_face_overlapping");
  509. facesbase = (int *) malloc (base->nbface * sizeof (int));
  510. a2ri_erreur_critique_si (facesbase == NULL,
  511. "erreur allocation memoire pour facesbase\na2ri_vf_axis_aligned_bounding_box_find_face_overlapping");
  512. for (int i = 0; i < m->nbface; i++)
  513. facesmodelm[i] = i;
  514. nbfacesmodelm = m->nbface;
  515. for (int i = 0; i < base->nbface; i++)
  516. facesbase[i] = i;
  517. nbfacesbase = base->nbface;
  518. a2ri_vf_axis_aligned_bounding_box (base, facesbase, nbfacesbase,
  519. &listptminbase, &listptmaxbase);
  520. a2ri_vf_axis_aligned_bounding_box (m, facesmodelm, nbfacesmodelm,
  521. &listptminm, &listptmaxm);
  522. //pour toutes les faces du modèles m
  523. for (int i = 0; i < nbfacesmodelm; i++)
  524. {
  525. //on vérifie s'il y a intersection entre la bounding box et l'ensemble des bounding box des faces de l'autre modèle
  526. if (intersection_axis_aligned_bounding_box_with_axis_aligned_bounding_box_list (&(listptminm[i]), &(listptmaxm[i]), listptminbase, listptmaxbase, nbfacesbase))
  527. //dans ce cas, on ajoute la face à la liste
  528. list_int_add (listface, size, i, WITH_REDUNDANCE);
  529. }
  530. free (listptminbase);
  531. free (listptmaxbase);
  532. free (facesmodelm);
  533. free (facesbase);
  534. free (listptminm);
  535. free (listptmaxm);
  536. }