model.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956
  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. /* Marianne Fichoux */
  11. /* Date de modification : 26/05/09 */
  12. /* Version : 0.2 */
  13. /*************************************/
  14. /***************************************************************************/
  15. /* This file is part of a2ri. */
  16. /* */
  17. /* a2ri is free software: you can redistribute it and/or modify it */
  18. /* under the terms of the GNU Lesser General Public License as published */
  19. /* by the Free Software Foundation, either version 3 of the License, or */
  20. /* (at your option) any later version. */
  21. /* */
  22. /* a2ri is distributed in the hope that it will be useful, */
  23. /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
  24. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
  25. /* GNU Lesser General Public License for more details. */
  26. /* */
  27. /* You should have received a copy of the GNU Lesser General Public */
  28. /* License along with a2ri. */
  29. /* If not, see <http://www.gnu.org/licenses/>. */
  30. /***************************************************************************/
  31. #ifndef MODEL__H
  32. #define MODEL__H
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include <math.h>
  36. #include <gsl/gsl_linalg.h>
  37. #include <gsl/gsl_math.h>
  38. #include <string.h>
  39. #include "util.h"
  40. #include "vertex.h"
  41. #include "edge.h"
  42. #include "face.h"
  43. #include "point.h"
  44. #include "geometry.h"
  45. #include "hashtable.h"
  46. #include "space_partition.h"
  47. /**
  48. * \struct vf_model model.h vf_model
  49. * Structure de données pour stocker un maillage triangulaire grâce à une liste de sommets et une liste de faces. Une face étant définie par trois sommets identifiés par leur numéro d'incide dans la liste de sommets.
  50. */
  51. typedef struct
  52. {
  53. vf_vertex *ve;
  54. vf_face *fa;
  55. int nbvertex;
  56. int nbface;
  57. double xmin,
  58. ymin,
  59. zmin,
  60. xmax,
  61. ymax,
  62. zmax;
  63. } vf_model;
  64. typedef vf_model * pt_vf_model;
  65. /**
  66. * \struct vef_model model.h vef_model
  67. * Structure de données pour stocker un maillage triangulaire grâce à une liste de sommets,une liste d'arêtes et une liste de faces. Une arête étant définie par deux sommets identifiés par leur numéro d'incide dans la liste de sommets. Une face étant définie par trois arêtes identifiées par leur numéro d'indice dans la liste d'arêtes.
  68. */
  69. typedef struct
  70. {
  71. vef_vertex *ve;
  72. vef_edge *ed;
  73. vef_face *fa;
  74. int nbvertex;
  75. int nbedge;
  76. int nbface;
  77. double xmin,
  78. ymin,
  79. zmin,
  80. xmax,
  81. ymax,
  82. zmax;
  83. } vef_model;
  84. typedef void (
  85. *ptf_func_hashtable) (
  86. vf_edge *,
  87. const vf_model * const,
  88. hashtable *);
  89. /**
  90. Initialisation d'un modèle avec un maillage vide
  91. @param m pointeur sur le modèle
  92. @return aucun
  93. */
  94. void a2ri_vf_init (
  95. vf_model * m);
  96. /**
  97. Libération de l'espace mémoire utilisé
  98. @param m pointeur sur le modèle
  99. */
  100. void a2ri_vf_free (
  101. vf_model * m);
  102. /**
  103. Clonage du vf_model
  104. @param m pointeur sur le modèle
  105. @return un vf_model identique
  106. */
  107. vf_model * a2ri_vf_clone (
  108. const vf_model * const m);
  109. /**
  110. Affichage des caractéristiques générales d'un modèle (nombre de sommets et de faces)
  111. @param m le modèle
  112. @return aucun
  113. */
  114. void a2ri_vf_display (
  115. const vf_model * const m);
  116. /**
  117. Affichage des caractéristiques détaillées d'un modèle (nombre de sommets, de faces et leurs adjacences)
  118. @param m le modèle
  119. @return aucun
  120. */
  121. void a2ri_vf_display_detail (
  122. const vf_model * const m);
  123. /**
  124. mis à jour du numéro d'arete en fonction de la taille de la table de hachage
  125. @param e arete à mettre à jour
  126. @param m le modele - parametre inutilisé
  127. @param table la table de hachage
  128. @return aucun
  129. */
  130. void a2ri_vf_update_num_edge (
  131. vf_edge * e,
  132. const vf_model * const m,
  133. const hashtable * const table);
  134. /**
  135. mis à jour de la longueur de l'arete
  136. @param e arete à mettre à jour
  137. @param m le modele
  138. @param table la table de hachage - parametre inutilisé
  139. @return aucun
  140. */
  141. void a2ri_vf_update_length_edge (
  142. vf_edge * e,
  143. const vf_model * const m,
  144. hashtable * table);
  145. /**
  146. Construction de la table de hachage contenant toutes les aretes d'un vf_model
  147. @param m le modele
  148. @param func tableau de fonctions devant etre appliqué
  149. @param nbfunc taille du tableau de fonctions
  150. @return la table de hachage
  151. */
  152. hashtable *a2ri_vf_construction_edge_table (
  153. const vf_model * const m,
  154. ptf_func_hashtable * func,
  155. int nbfunc);
  156. /**
  157. Ajout d'un vertex (x,y,z) au modèle
  158. @param m pointeur sur le modèle
  159. @param x coordonnée x du vertex
  160. @param y coordonnée y
  161. @param z coordonnée z
  162. @return 1 si succès, 0 sinon
  163. */
  164. int a2ri_vf_add_vertex (
  165. vf_model * m,
  166. double x,
  167. double y,
  168. double z);
  169. /**
  170. Recherche d'un vertex dans un modèle
  171. @param m le modèle
  172. @param x coordonnée x du vertex à rechercher
  173. @param y coordonnée y
  174. @param z coordonnée z
  175. @return numéro du vertex dans la liste de vertex du modèle, -1 si le vertex n'est pas trouvé.
  176. */
  177. int a2ri_vf_search_vertex (
  178. const vf_model * const m,
  179. double x,
  180. double y,
  181. double z);
  182. /**
  183. Retrait d'un sommet du modèle. L'opération ne peut être effectué que si le sommet n'est référencée dans aucune face.
  184. @param m le modèle
  185. @param numvertex numèro du vertex à retirer
  186. @return 1 si succès, 0 sinon
  187. */
  188. int a2ri_vf_remove_vertex (
  189. vf_model * m,
  190. int numvertex);
  191. /**
  192. Retrait d'une liste de sommets du modèle. L'opération ne peut être effectué que si le sommet n'est référencée dans aucune face.
  193. @param m le modèle
  194. @param numvertex numèro du vertex à retirer
  195. @return 1 si succès, 0 sinon
  196. */
  197. int a2ri_vf_remove_list_of_vertex (
  198. vf_model * m,
  199. int *listvertex,
  200. int sizelist);
  201. /**
  202. Ajout d'une face défini par trois points (numéros d'index dans la liste de points) au modèle
  203. @param m pointeur sur le modèle
  204. @param ve1 index du premier point
  205. @param ve2 index du second point
  206. @param ve3 index du troisième point
  207. @return 1 si succès, 0 sinon
  208. */
  209. int a2ri_vf_add_face (
  210. vf_model * m,
  211. int ve1,
  212. int ve2,
  213. int ve3);
  214. /**
  215. Recherche d'une face dans un modèle
  216. @param m le modèle
  217. @param ve1 index d'un point
  218. @param ve2 index d'un point
  219. @param ve3 index d'un point
  220. @return numéro de la face dans la liste de face du modèle, -1 si la face n'est pas trouvée.
  221. @warning Cette fonction est sensible à l'orientation de la face.
  222. Exemple pour un modèle m:
  223. @code
  224. liste de faces (index -> ve1 ve2 ve3):
  225. 0 -> 0 1 2
  226. 1 -> 0 2 3
  227. 2 -> 0 3 1
  228. 3 -> 1 3 2
  229. @endcode
  230. le code
  231. @code
  232. a2ri_vf_search_face(m,0,3,1);
  233. ou
  234. a2ri_vf_search_face(m,3,1,0);
  235. ou
  236. a2ri_vf_search_face(m,1,0,3);
  237. @endcode
  238. retournera 2 alors que
  239. @code
  240. a2ri_vf_search_face(m,3,0,1);
  241. @endcode
  242. retournera -1
  243. */
  244. int a2ri_vf_search_face (
  245. const vf_model * const m,
  246. int ve1,
  247. int ve2,
  248. int ve3);
  249. /**
  250. Retrait d'une face du modèle. La fonction enlève également les sommets qui ne sont plus utilisés.
  251. @param m le modèle
  252. @param numface numèro de la face à retirer
  253. @return 1 si succès, 0 sinon
  254. */
  255. int a2ri_vf_remove_face (
  256. vf_model * m,
  257. int numface);
  258. /**
  259. Retrait d'une liste de faces du modèle. La fonction enlève également les sommets qui ne sont plus utilisés.
  260. @param m le modèle
  261. @param numface numèro de la face à retirer
  262. @return 1 si succès, 0 sinon
  263. */
  264. int a2ri_vf_remove_list_of_face (
  265. vf_model * m,
  266. int *listface,
  267. int sizelist);
  268. /**
  269. Translation du modèle
  270. @param m pointeur sur le modèle à translater
  271. @param delta pointeur sur le vecteur de translation
  272. @return aucun
  273. */
  274. void a2ri_vf_translate (
  275. vf_model * m,
  276. const vector3d * const delta);
  277. /**
  278. Translation d'un modele afin qu'il se trouve centré sur l'origine (0,0,0)
  279. @param m le modele a centrer
  280. @return aucun
  281. **/
  282. void a2ri_vf_center (
  283. vf_model * m);
  284. /**
  285. Rotation d'un modèle en radian autour de l'axe X
  286. @param v pointeur sur le modèle
  287. @param angle angle de rotation du modèle en radian
  288. @return aucun
  289. */
  290. void a2ri_vf_rotateX_radian (
  291. vf_model * m,
  292. double angle);
  293. /**
  294. Rotation d'un modèle en degré autour de l'axe X
  295. @param v pointeur sur le modèle
  296. @param angle angle de rotation du modèle en degré
  297. @return aucun
  298. */
  299. void a2ri_vf_rotateX_degre (
  300. vf_model * m,
  301. double angle);
  302. /**
  303. Rotation d'un modèle en radian suivant l'axe X de centre (cx,cy,cz)
  304. @param v pointeur sur le modèle
  305. @param angle angle de rotation du modèle en radian
  306. @param centre pointeur sur le point3d servant de centre à la rotation
  307. @return aucun
  308. */
  309. void a2ri_vf_rotateX_radian_center (
  310. vf_model * m,
  311. double angle,
  312. const point3d * const centre);
  313. /**
  314. Rotation d'un modèle en degre suivant l'axe X de centre (cx,cy,cz)
  315. @param v pointeur sur le modèle
  316. @param angle angle de rotation du modèle en degre
  317. @param centre pointeur sur le point3d servant de centre à la rotation
  318. @return aucun
  319. */
  320. void a2ri_vf_rotateX_degre_center (
  321. vf_model * m,
  322. double angle,
  323. const point3d * const centre);
  324. /**
  325. Rotation d'un modèle en radian autour de l'axe Y
  326. @param v pointeur sur le modèle
  327. @param angle angle de rotation du modèle en radian
  328. @return aucun
  329. */
  330. void a2ri_vf_rotateY_radian (
  331. vf_model * m,
  332. double angle);
  333. /**
  334. Rotation d'un modèle en degré autour de l'axe Y
  335. @param v pointeur sur le modèle
  336. @param angle angle de rotation du modèle en degré
  337. @return aucun
  338. */
  339. void a2ri_vf_rotateY_degre (
  340. vf_model * m,
  341. double angle);
  342. /**
  343. Rotation d'un modèle en radian suivant l'axe Y de centre (cx,cy,cz)
  344. @param v pointeur sur le modèle
  345. @param angle angle de rotation du modèle en radian
  346. @param centre pointeur sur le point3d servant de centre à la rotation
  347. @return aucun
  348. */
  349. void a2ri_vf_rotateY_radian_center (
  350. vf_model * m,
  351. double angle,
  352. const point3d * const centre);
  353. /**
  354. Rotation d'un modèle en degre suivant l'axe Y de centre (cx,cy,cz)
  355. @param v pointeur sur le modèle
  356. @param angle angle de rotation du modèle en degre
  357. @param centre pointeur sur le point3d servant de centre à la rotation
  358. @return aucun
  359. */
  360. void a2ri_vf_rotateY_degre_center (
  361. vf_model * m,
  362. double angle,
  363. const point3d * const centre);
  364. /**
  365. Rotation d'un modèle en radian autour de l'axe Z
  366. @param v pointeur sur le modèle
  367. @param angle angle de rotation du modèle en radian
  368. @return aucun
  369. */
  370. void a2ri_vf_rotateZ_radian (
  371. vf_model * m,
  372. double angle);
  373. /**
  374. Rotation d'un modèle en degré autour de l'axe Z
  375. @param v pointeur sur le modèle
  376. @param angle angle de rotation du modèle en degré
  377. @return aucun
  378. */
  379. void a2ri_vf_rotateZ_degre (
  380. vf_model * m,
  381. double angle);
  382. /**
  383. Rotation d'un modèle en radian suivant l'axe Z de centre (cx,cy,cz)
  384. @param v pointeur sur le modèle
  385. @param angle angle de rotation du modèle en radian
  386. @param centre pointeur sur le point3d servant de centre à la rotation
  387. @return aucun
  388. */
  389. void a2ri_vf_rotateZ_radian_center (
  390. vf_model * m,
  391. double angle,
  392. const point3d * const centre);
  393. /**
  394. Rotation d'un modèle en degre suivant l'axe Z de centre (cx,cy,cz)
  395. @param v pointeur sur le modèle
  396. @param angle angle de rotation du modèle en degre
  397. @param centre pointeur sur le point3d servant de centre à la rotation
  398. @return aucun
  399. */
  400. void a2ri_vf_rotateZ_degre_center (
  401. vf_model * m,
  402. double angle,
  403. const point3d * const centre);
  404. /**
  405. Rotation d'un modèle en degre suivant l'axe donnée
  406. @param m pointeur sur le modèle
  407. @param angle angle de rotation du modèle en degre
  408. @param axe l'axe de rotation
  409. @return aucun
  410. */
  411. void a2ri_vf_rotate_axe_radian (
  412. vf_model * m,
  413. double angle,
  414. const vector3d * const axe);
  415. /**
  416. Calcul de l'aire totale d'un modèle
  417. @param m le modèle
  418. @return aire totale du modèle
  419. */
  420. double a2ri_vf_area (
  421. const vf_model * const m);
  422. /**
  423. Trouve les faces entourant un sommet
  424. @param m le modèle
  425. @param numve numéro du sommet
  426. @param list liste des numéros de faces
  427. @param size nombre de faces
  428. @return aucun
  429. **/
  430. void a2ri_vf_faces_next_vertex (
  431. const vf_model * const m,
  432. int numve,
  433. int **list,
  434. int *size);
  435. /**
  436. Trouve les faces entourant un sommet avec une hashtable contenant les aretes fournie
  437. @param m le modèle
  438. @param numve numéro du sommet
  439. @param list liste des numéros de faces
  440. @param size nombre de faces
  441. @param table la hashtable
  442. @return aucun
  443. **/
  444. void a2ri_vf_faces_next_vertex_with_hashtable (
  445. const vf_model * const m,
  446. int numve,
  447. int **list,
  448. int *size,
  449. const hashtable * const table);
  450. /**
  451. calcul d'une normale à la face
  452. @param m le modele
  453. @param numfa numéro de la face
  454. @return vecteur normal à la face
  455. */
  456. //TODO retourner un vector3d *
  457. vector3d a2ri_vf_normal_face (
  458. const vf_model * const m,
  459. int numfa);
  460. /**
  461. calcul d'une normale au sommet comme étant la moyenne des normales des faces adjacentes au sommet
  462. @param m le modele
  463. @param numve numéro du sommet
  464. @return vecteur normal au sommet
  465. */
  466. //TODO retourner un vector3d *
  467. vector3d a2ri_vf_normal_vertex (
  468. const vf_model * const m,
  469. int numve);
  470. /**
  471. calcul d'une normale au sommet comme étant la moyenne des normales des faces adjacentes au sommet
  472. @param m le modele
  473. @param numve numéro du sommet
  474. @param table table de hachage contenant les aretes
  475. @return vecteur normal au sommet
  476. */
  477. //TODO retourner un vector3d *
  478. vector3d a2ri_vf_normal_vertex_with_hashtable (
  479. const vf_model * const m,
  480. int numve,
  481. const hashtable * const table);
  482. /**
  483. Concaténation de plusieurs maillages dans un seul modèle
  484. @param m tableau de modèle
  485. @param size nombre de modele numérique
  486. @return un maillage content tous les maillages.
  487. */
  488. vf_model * a2ri_vf_concat (
  489. const pt_vf_model * const m,
  490. int size);
  491. /**
  492. Ajout des points d'un vf_model dans une partition de l'espace
  493. @param m le modèle
  494. @param sp la partition de l'espace
  495. @return aucun
  496. */
  497. void a2ri_vf_space_partition (
  498. const vf_model * const m,
  499. space_partition * sp);
  500. /**
  501. Conversion d'un vf_model en liste de point3d
  502. @param m le modèle
  503. @return la liste de point3d
  504. **/
  505. point3d * a2ri_vf_to_list_point3d(
  506. const vf_model * const m);
  507. /**
  508. Conversion d'un vf_model en vef_model
  509. @param le modèle à convertir
  510. @return le vef_model
  511. **/
  512. vef_model * a2ri_vf_to_vef (
  513. const vf_model * const m);
  514. /**
  515. Initialisation d'un modèle avec un maillage vide
  516. @param m pointeur sur le modèle
  517. @return aucun
  518. */
  519. void a2ri_vef_init (
  520. vef_model * m);
  521. /**
  522. Libération de l'espace mémoire utilisé
  523. @param m pointeur sur le modèle
  524. */
  525. void a2ri_vef_free (
  526. vef_model * m);
  527. /**
  528. Affichage des caractéristiques générales d'un modèle (nombre de sommets et de faces)
  529. @param m le modèle
  530. @return aucun
  531. */
  532. void a2ri_vef_display (
  533. const vef_model * const m);
  534. /**
  535. Affichage des caractéristiques détaillées d'un modèle (nombre de sommets, de faces et leurs adjacences)
  536. @param m le modèle
  537. @return aucun
  538. */
  539. void a2ri_vef_display_detail (
  540. const vef_model * const m);
  541. /**
  542. Ajout d'un vertex (x,y,z) au modèle
  543. @param m pointeur sur le modèle
  544. @param x coordonnée x du vertex
  545. @param y coordonnée y
  546. @param z coordonnée z
  547. @return 1 si succès, 0 sinon
  548. */
  549. int a2ri_vef_add_vertex (
  550. vef_model * m,
  551. double x,
  552. double y,
  553. double z);
  554. /**
  555. Recherche d'un vertex dans un modèle
  556. @param m le modèle
  557. @param x coordonnée x du vertex à rechercher
  558. @param y coordonnée y
  559. @param z coordonnée z
  560. @return numéro du vertex dans la liste de vertex du modèle, -1 si le vertex n'est pas trouvé.
  561. */
  562. int a2ri_vef_search_vertex (
  563. const vef_model * const m,
  564. double x,
  565. double y,
  566. double z);
  567. /**
  568. Retrait d'un sommet du modèle. L'opération ne peut être effectué que si le sommet n'est référencée dans aucune arete.
  569. @param m le modèle
  570. @param numvertex numèro du vertex à retirer
  571. @return 1 si succès, 0 sinon
  572. */
  573. int a2ri_vef_remove_vertex (
  574. vef_model * m,
  575. int numvertex);
  576. /**
  577. Retrait d'un sommet du modèle. L'opération ne peut être effectué que si le sommet n'est référencée dans aucune arete.
  578. @param m le modèle
  579. @param numvertex numèro du vertex à retirer
  580. @return 1 si succès, 0 sinon
  581. */
  582. int a2ri_vef_remove_list_of_vertex (
  583. vef_model * m,
  584. int *listvertex,
  585. int size);
  586. /**
  587. Ajout d'une arete (ve1,ve2) au modèle
  588. @param m pointeur sur le modèle
  589. @param ve1 index du premier point
  590. @param ve2 index du second point
  591. @param verif 1 s'il faut vérifier si l'arete existe deja, 0 sinon
  592. @return 1 si succès, 0 sinon
  593. */
  594. int a2ri_vef_add_edge (
  595. vef_model * m,
  596. int ve1,
  597. int ve2,
  598. int verif);
  599. /**
  600. Recherche d'une arete dans un modèle
  601. @param m le modèle
  602. @param ve1 indice d'un point
  603. @param ve2 indice d'un point
  604. @return index de l'arete, -1 si l'arete n'est pas trouvée.
  605. @warning a2ri_vef_search_edge(m,0,1) retournera le meme resultat que a2ri_vef_search_edge(m,1,0).
  606. */
  607. int a2ri_vef_search_edge (
  608. const vef_model * const m,
  609. int ve1,
  610. int ve2);
  611. /**
  612. Retrait d'une arete du modèle. L'opération ne peut être effectué que si l'arete n'est référencée dans aucune face.
  613. @param m le modèle
  614. @param numvertex numèro du vertex à retirer
  615. @return 1 si succès, 0 sinon
  616. */
  617. int a2ri_vef_remove_edge (
  618. vef_model * m,
  619. int numedge);
  620. /**
  621. Retrait d'une liste d'arete du modèle. L'opération ne peut être effectué que si l'arete n'est référencée dans aucune face.
  622. @param m le modèle
  623. @param numvertex numèro du vertex à retirer
  624. @return 1 si succès, 0 sinon
  625. */
  626. int a2ri_vef_remove_list_of_edge (
  627. vef_model * m,
  628. int *listedge,
  629. int size);
  630. /**
  631. Ajout d'une face défini par trois points (numéros d'index dans la liste de points) au modèle
  632. @param m pointeur sur le modèle
  633. @param ed1 index de la premiere arete
  634. @param ed2 index de la seconde arete
  635. @param ed3 index de la troiseieme arete
  636. @return 1 si succès, 0 sinon
  637. */
  638. int a2ri_vef_add_face (
  639. vef_model * m,
  640. int ed1,
  641. int ed2,
  642. int ed3);
  643. /**
  644. Recherche d'une face dans un modèle
  645. @param m le modèle
  646. @param ed1 index de la premiere arete
  647. @param ed2 index de la seconde arete
  648. @param ed3 index de la troiseieme arete
  649. @return numéro de la face dans la liste de face du modèle, -1 si la face n'est pas trouvée.
  650. @warning Cette fonction est sensible à l'orientation de la face.
  651. Exemple pour un modèle m:
  652. @code
  653. liste de faces (index -> ve1 ve2 ve3):
  654. 0 -> 0 1 2
  655. 1 -> 0 2 3
  656. 2 -> 0 3 1
  657. 3 -> 1 3 2
  658. @endcode
  659. le code
  660. @code
  661. a2ri_vef_search_face(m,0,3,1);
  662. ou
  663. a2ri_vef_search_face(m,3,1,0);
  664. ou
  665. a2ri_vef_search_face(m,1,0,3);
  666. @endcode
  667. retournera 2 alors que
  668. @code
  669. a2ri_vef_search_face(m,3,0,1);
  670. @endcode
  671. retournera -1
  672. */
  673. int a2ri_vef_search_face (
  674. const vef_model * const m,
  675. int ed1,
  676. int ed2,
  677. int ed3);
  678. /**
  679. Retrait d'une face du modèle. La fonction enlève également les sommets qui ne sont plus utilisés.
  680. @param m le modèle
  681. @param numface numèro de la face à retirer
  682. @return 1 si succès, 0 sinon
  683. */
  684. int a2ri_vef_remove_face (
  685. vef_model * m,
  686. int numface);
  687. /**
  688. Retrait d'une liste de face du modèle. La fonction enlève également les sommets qui ne sont plus utilisés.
  689. @param m le modèle
  690. @param numface numèro de la face à retirer
  691. @return 1 si succès, 0 sinon
  692. */
  693. int a2ri_vef_remove_list_of_face (
  694. vef_model * m,
  695. int *listface,
  696. int size);
  697. /**
  698. Translation du modèle
  699. @param m pointeur sur le modèle à translater
  700. @param delta pointeur sur le vecteur de translation
  701. @return aucun
  702. */
  703. void a2ri_vef_translate (
  704. vef_model * m,
  705. const vector3d * const delta);
  706. /**
  707. Rotation d'un modèle en radian autour de l'axe X
  708. @param v pointeur sur le modèle
  709. @param angle angle de rotation du modèle en radian
  710. @return aucun
  711. */
  712. void a2ri_vef_rotateX_radian (
  713. vef_model * m,
  714. double angle);
  715. /**
  716. Rotation d'un modèle en degré autour de l'axe X
  717. @param v pointeur sur le modèle
  718. @param angle angle de rotation du modèle en degré
  719. @return aucun
  720. */
  721. void a2ri_vef_rotateX_degre (
  722. vef_model * m,
  723. double angle);
  724. /**
  725. Rotation d'un modèle en radian suivant l'axe X de centre (cx,cy,cz)
  726. @param v pointeur sur le modèle
  727. @param angle angle de rotation du modèle en radian
  728. @param centre pointeur sur le point3d servant de centre à la rotation
  729. @return aucun
  730. */
  731. void a2ri_vef_rotateX_radian_center (
  732. vef_model * m,
  733. double angle,
  734. const point3d * const centre);
  735. /**
  736. Rotation d'un modèle en degre suivant l'axe X de centre (cx,cy,cz)
  737. @param v pointeur sur le modèle
  738. @param angle angle de rotation du modèle en degre
  739. @param centre pointeur sur le point3d servant de centre à la rotation
  740. @return aucun
  741. */
  742. void a2ri_vef_rotateX_degre_center (
  743. vef_model * m,
  744. double angle,
  745. const point3d * const centre);
  746. /**
  747. Rotation d'un modèle en radian autour de l'axe Y
  748. @param v pointeur sur le modèle
  749. @param angle angle de rotation du modèle en radian
  750. @return aucun
  751. */
  752. void a2ri_vef_rotateY_radian (
  753. vef_model * m,
  754. double angle);
  755. /**
  756. Rotation d'un modèle en degré autour de l'axe Y
  757. @param v pointeur sur le modèle
  758. @param angle angle de rotation du modèle en degré
  759. @return aucun
  760. */
  761. void a2ri_vef_rotateY_degre (
  762. vef_model * m,
  763. double angle);
  764. /**
  765. Rotation d'un modèle en radian suivant l'axe Y de centre (cx,cy,cz)
  766. @param v pointeur sur le modèle
  767. @param angle angle de rotation du modèle en radian
  768. @param centre pointeur sur le point3d servant de centre à la rotation
  769. @return aucun
  770. */
  771. void a2ri_vef_rotateY_radian_center (
  772. vef_model * m,
  773. double angle,
  774. const point3d * const centre);
  775. /**
  776. Rotation d'un modèle en degre suivant l'axe Y de centre (cx,cy,cz)
  777. @param v pointeur sur le modèle
  778. @param angle angle de rotation du modèle en degre
  779. @param centre pointeur sur le point3d servant de centre à la rotation
  780. @return aucun
  781. */
  782. void a2ri_vef_rotateY_degre_center (
  783. vef_model * m,
  784. double angle,
  785. const point3d * const centre);
  786. /**
  787. Rotation d'un modèle en radian autour de l'axe Z
  788. @param v pointeur sur le modèle
  789. @param angle angle de rotation du modèle en radian
  790. @return aucun
  791. */
  792. void a2ri_vef_rotateZ_radian (
  793. vef_model * m,
  794. double angle);
  795. /**
  796. Rotation d'un modèle en degré autour de l'axe Z
  797. @param v pointeur sur le modèle
  798. @param angle angle de rotation du modèle en degré
  799. @return aucun
  800. */
  801. void a2ri_vef_rotateZ_degre (
  802. vef_model * m,
  803. double angle);
  804. /**
  805. Rotation d'un modèle en radian suivant l'axe Z de centre (cx,cy,cz)
  806. @param v pointeur sur le modèle
  807. @param angle angle de rotation du modèle en radian
  808. @param centre pointeur sur le point3d servant de centre à la rotation
  809. @return aucun
  810. */
  811. void a2ri_vef_rotateZ_radian_center (
  812. vef_model * m,
  813. double angle,
  814. const point3d * const centre);
  815. /**
  816. Rotation d'un modèle en degre suivant l'axe Z de centre (cx,cy,cz)
  817. @param v pointeur sur le modèle
  818. @param angle angle de rotation du modèle en degre
  819. @param centre pointeur sur le point3d servant de centre à la rotation
  820. @return aucun
  821. */
  822. void a2ri_vef_rotateZ_degre_center (
  823. vef_model * m,
  824. double angle,
  825. const point3d * const centre);
  826. /**
  827. Rotation d'un modèle en degre suivant l'axe donnée
  828. @param m pointeur sur le modèle
  829. @param angle angle de rotation du modèle en degre
  830. @param axe l'axe de rotation
  831. @return aucun
  832. */
  833. void a2ri_vef_rotate_axe_radian (
  834. vef_model * m,
  835. double angle,
  836. const vector3d * const axe);
  837. /**
  838. Calcul de l'aire totale d'un modèle
  839. @param m le modèle
  840. @return aire totale du modèle
  841. */
  842. double a2ri_vef_area_model (
  843. const vef_model * const m);
  844. /**
  845. Ajout des points d'un vef_model dans une partition de l'espace
  846. @param m le modèle
  847. @param sp la partition de l'espace
  848. @return aucun
  849. */
  850. void a2ri_vef_space_partition (
  851. const vef_model * const m,
  852. space_partition * sp);
  853. /**
  854. Conversion d'un vef_model en liste de point3d
  855. @param m le modèle
  856. @return la liste de point3d
  857. **/
  858. point3d * a2ri_vef_to_list_point3d(
  859. const vef_model * const m);
  860. /**
  861. Conversion d'un vef_model en vf_model
  862. @param m le modèle à convertir
  863. @return un pointeur sur le vf_model
  864. **/
  865. vf_model * a2ri_vef_to_vf(
  866. const vef_model * const m);
  867. #endif