vertex.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  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. #include "vertex.h"
  32. /********** INTERMEDIATE TYPES AND FUNCTIONS **********/
  33. /* Les fonctions intermédiaires sont préfixées de IF */
  34. /* et les types intermédiaires de IT */
  35. /********** MAIN FUNCTIONS **********/
  36. /**
  37. Affichage du vertex
  38. @param v le vertex à afficher
  39. @return aucun
  40. */
  41. void
  42. vf_vertex_display (
  43. const vf_vertex * const v)
  44. {
  45. printf ("Vertex --> [%f,%f,%f] , valence : %d\n",
  46. v->x, v->y, v->z, v->nbincidentvertices);
  47. }
  48. /**
  49. Affichage detaille du vertex
  50. @param v le vertex à afficher
  51. @return aucun
  52. */
  53. void
  54. vf_vertex_display_detail (
  55. const vf_vertex * const v)
  56. {
  57. printf ("[%5.2f , %5.2f , %5.2f]\n\t\t\tvalency : %d - list : ",
  58. v->x, v->y, v->z, v->nbincidentvertices);
  59. if (v->nbincidentvertices > 0)
  60. printf ("%d", v->incidentvertices[0]);
  61. for (int j = 1; j < v->nbincidentvertices; j++)
  62. printf (" , %d", v->incidentvertices[j]);
  63. printf ("\n");
  64. }
  65. /**
  66. Translation d'un vertex
  67. @param v pointeur sur le vertex à translater
  68. @param dx décalage suivant l'axe X
  69. @param dy décalage suivant l'axe Y
  70. @param dz décalage suivant l'axe Z
  71. */
  72. void
  73. vf_vertex_translate (
  74. vf_vertex * v,
  75. const vector3d * const delta)
  76. {
  77. v->x += delta->dx;
  78. v->y += delta->dy;
  79. v->z += delta->dz;
  80. }
  81. /**
  82. Rotation d'un vertex en radian autour de l'axe X
  83. @param v pointeur sur le vertex
  84. @param angle angle de rotation du vertex en radian
  85. @return aucun
  86. */
  87. void
  88. vf_vertex_rotateX_radian (
  89. vf_vertex * v,
  90. double angle)
  91. {
  92. double tempvy = v->y * cos (angle) + v->z * sin (angle);
  93. double tempvz = -v->y * sin (angle) + v->z * cos (angle);
  94. v->y = tempvy;
  95. v->z = tempvz;
  96. }
  97. /**
  98. Rotation d'un vertex en degre autour de l'axe X
  99. @param v pointeur sur le vertex
  100. @param angle angle de rotation du vertex en degre
  101. @return aucun
  102. */
  103. void
  104. vf_vertex_rotateX_degre (
  105. vf_vertex * v,
  106. double angle)
  107. {
  108. double angleradian = angle * 2.0 * PI / 360.0;
  109. double tempvy = v->y * cos (angleradian) + v->z * sin (angleradian);
  110. double tempvz = -v->y * sin (angleradian) + v->z * cos (angleradian);
  111. v->y = tempvy;
  112. v->z = tempvz;
  113. }
  114. /**
  115. Rotation d'un vertex en radian suivant l'axe X de centre (cx,cy,cz)
  116. @param v pointeur sur le vertex
  117. @param angle angle de rotation du vertex en radian
  118. @param cx coordonnée x du centre de rotation
  119. @param cy coordonnée y du centre de rotation
  120. @param cz coordonnée z du centre de rotation
  121. @return aucun
  122. */
  123. void
  124. vf_vertex_rotateX_center_radian (
  125. vf_vertex * v,
  126. double angle,
  127. const point3d * const centre)
  128. {
  129. vector3d delta;
  130. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  131. vf_vertex_translate (v, &delta);
  132. vector3d_reverse (&delta);
  133. vf_vertex_rotateX_radian (v, angle);
  134. vf_vertex_translate (v, &delta);
  135. }
  136. /**
  137. Rotation d'un vertex en degre suivant l'axe X de centre (cx,cy,cz)
  138. @param v pointeur sur le vertex
  139. @param angle angle de rotation du vertex en degre
  140. @param cx coordonnée x du centre de rotation
  141. @param cy coordonnée y du centre de rotation
  142. @param cz coordonnée z du centre de rotation
  143. @return aucun
  144. */
  145. void
  146. vf_vertex_rotateX_center_degre (
  147. vf_vertex * v,
  148. double angle,
  149. const point3d * const centre)
  150. {
  151. vector3d delta;
  152. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  153. vf_vertex_translate (v, &delta);
  154. vector3d_reverse (&delta);
  155. vf_vertex_rotateX_degre (v, angle);
  156. vf_vertex_translate (v, &delta);
  157. }
  158. /**
  159. Rotation d'un vertex en radian autour de l'axe Y
  160. @param v pointeur sur le vertex
  161. @param angle angle de rotation du vertex en radian
  162. @return aucun
  163. */
  164. void
  165. vf_vertex_rotateY_radian (
  166. vf_vertex * v,
  167. double angle)
  168. {
  169. double tempvx = v->x * cos (angle) + v->z * sin (angle);
  170. double tempvz = -v->x * sin (angle) + v->z * cos (angle);
  171. v->x = tempvx;
  172. v->z = tempvz;
  173. }
  174. /**
  175. Rotation d'un vertex en degre autour de l'axe Y
  176. @param v pointeur sur le vertex
  177. @param angle angle de rotation du vertex en degre
  178. @return aucun
  179. */
  180. void
  181. vf_vertex_rotateY_degre (
  182. vf_vertex * v,
  183. double angle)
  184. {
  185. double angleradian = angle * 2.0 * PI / 360.0;
  186. double tempvx = v->x * cos (angleradian) + v->z * sin (angleradian);
  187. double tempvz = -v->x * sin (angleradian) + v->z * cos (angleradian);
  188. v->x = tempvx;
  189. v->z = tempvz;
  190. }
  191. /**
  192. Rotation d'un vertex en radian suivant l'axe Y de centre (cx,cy,cz)
  193. @param v pointeur sur le vertex
  194. @param angle angle de rotation du vertex en radian
  195. @param cx coordonnée x du centre de rotation
  196. @param cy coordonnée y du centre de rotation
  197. @param cz coordonnée z du centre de rotation
  198. @return aucun
  199. */
  200. void
  201. vf_vertex_rotateY_center_radian (
  202. vf_vertex * v,
  203. double angle,
  204. const point3d * const centre)
  205. {
  206. vector3d delta;
  207. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  208. vf_vertex_translate (v, &delta);
  209. vector3d_reverse (&delta);
  210. vf_vertex_rotateY_radian (v, angle);
  211. vf_vertex_translate (v, &delta);
  212. }
  213. /**
  214. Rotation d'un vertex en degre suivant l'axe Y de centre (cx,cy,cz)
  215. @param v pointeur sur le vertex
  216. @param angle angle de rotation du vertex en degre
  217. @param cx coordonnée x du centre de rotation
  218. @param cy coordonnée y du centre de rotation
  219. @param cz coordonnée z du centre de rotation
  220. @return aucun
  221. */
  222. void
  223. vf_vertex_rotateY_center_degre (
  224. vf_vertex * v,
  225. double angle,
  226. const point3d * const centre)
  227. {
  228. vector3d delta;
  229. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  230. vf_vertex_translate (v, &delta);
  231. vector3d_reverse (&delta);
  232. vf_vertex_rotateY_degre (v, angle);
  233. vf_vertex_translate (v, &delta);
  234. }
  235. /**
  236. Rotation d'un vertex en radian autour de l'axe Z
  237. @param v pointeur sur le vertex
  238. @param angle angle de rotation du vertex en radian
  239. @return aucun
  240. */
  241. void
  242. vf_vertex_rotateZ_radian (
  243. vf_vertex * v,
  244. double angle)
  245. {
  246. double tempvx = v->x * cos (angle) + v->y * sin (angle);
  247. double tempvy = -v->x * sin (angle) + v->y * cos (angle);
  248. v->x = tempvx;
  249. v->y = tempvy;
  250. }
  251. /**
  252. Rotation d'un vertex en degre autour de l'axe Z
  253. @param v pointeur sur le vertex
  254. @param angle angle de rotation du vertex en degre
  255. @return aucun
  256. */
  257. void
  258. vf_vertex_rotateZ_degre (
  259. vf_vertex * v,
  260. double angle)
  261. {
  262. double angleradian = angle * 2.0 * PI / 360.0;
  263. double tempvx = v->x * cos (angleradian) + v->y * sin (angleradian);
  264. double tempvy = -v->x * sin (angleradian) + v->y * cos (angleradian);
  265. v->x = tempvx;
  266. v->y = tempvy;
  267. }
  268. /**
  269. Rotation d'un vertex en radian suivant l'axe Z de centre (cx,cy,cz)
  270. @param v pointeur sur le vertex
  271. @param angle angle de rotation du vertex en radian
  272. @param cx coordonnée x du centre de rotation
  273. @param cy coordonnée y du centre de rotation
  274. @param cz coordonnée z du centre de rotation
  275. @return aucun
  276. */
  277. void
  278. vf_vertex_rotateZ_center_radian (
  279. vf_vertex * v,
  280. double angle,
  281. const point3d * const centre)
  282. {
  283. vector3d delta;
  284. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  285. vf_vertex_translate (v, &delta);
  286. vector3d_reverse (&delta);
  287. vf_vertex_rotateZ_radian (v, angle);
  288. vf_vertex_translate (v, &delta);
  289. }
  290. /**
  291. Rotation d'un vertex en degre suivant l'axe Z de centre (cx,cy,cz)
  292. @param v pointeur sur le vertex
  293. @param angle angle de rotation du vertex en degre
  294. @param cx coordonnée x du centre de rotation
  295. @param cy coordonnée y du centre de rotation
  296. @param cz coordonnée z du centre de rotation
  297. @return aucun
  298. */
  299. void
  300. vf_vertex_rotateZ_center_degre (
  301. vf_vertex * v,
  302. double angle,
  303. const point3d * const centre)
  304. {
  305. vector3d delta;
  306. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  307. vf_vertex_translate (v, &delta);
  308. vector3d_reverse (&delta);
  309. vf_vertex_rotateZ_degre (v, angle);
  310. vf_vertex_translate (v, &delta);
  311. }
  312. /**
  313. Rotation d'un vertex en degre suivant l'axe donnée
  314. @param v pointeur sur le vertex
  315. @param angle angle de rotation du vertex en degre
  316. @param axe l'axe de rotation avec (nx2 + ny2 + nz2 = 1)
  317. @return aucun
  318. **/
  319. void
  320. vf_vertex_rotate_axe_radian (
  321. vf_vertex * v,
  322. gsl_matrix * M)
  323. {
  324. double tempvx =
  325. gsl_matrix_get (M, 0, 0) * v->x +
  326. gsl_matrix_get (M, 0, 1) * v->y +
  327. gsl_matrix_get (M, 0, 2) * v->z;
  328. double tempvy =
  329. gsl_matrix_get (M, 1, 0) * v->x +
  330. gsl_matrix_get (M, 1, 1) * v->y +
  331. gsl_matrix_get (M, 1, 2) * v->z;
  332. double tempvz =
  333. gsl_matrix_get (M, 2, 0) * v->x +
  334. gsl_matrix_get (M, 2, 1) * v->y +
  335. gsl_matrix_get (M, 2, 2) * v->z;;
  336. v->x = tempvx;
  337. v->y = tempvy;
  338. v->z = tempvz;
  339. }
  340. /**
  341. Libération de la mémoire
  342. @param v le vf_vertex
  343. @return aucun
  344. **/
  345. void
  346. vf_vertex_free (
  347. vf_vertex * v)
  348. {
  349. free (v->incidentvertices);
  350. }
  351. /**
  352. Affichage du vertex
  353. @param v le vertex à afficher
  354. @return aucun
  355. */
  356. void
  357. vef_vertex_display (
  358. vef_vertex * v)
  359. {
  360. printf ("Vertex --> [%f,%f,%f] , valence : %d\n",
  361. v->x, v->y, v->z, v->nbsharededges);
  362. }
  363. /**
  364. Affichage detaille du vertex
  365. @param v le vertex à afficher
  366. @return aucun
  367. */
  368. void vef_vertex_display_detail (
  369. const vef_vertex * const v)
  370. {
  371. printf ("[%5.2f , %5.2f , %5.2f]\n\t\t\tvalency : %d - list : ",
  372. v->x, v->y, v->z, v->nbsharededges);
  373. if (v->nbsharededges > 0)
  374. printf ("%d", v->sharededges[0]);
  375. for (int j = 1; j < v->nbsharededges; j++)
  376. printf (" , %d", v->sharededges[j]);
  377. printf ("\n");
  378. }
  379. /**
  380. Translation d'un vertex
  381. @param v pointeur sur le vertex à translater
  382. @param dx décalage suivant l'axe X
  383. @param dy décalage suivant l'axe Y
  384. @param dz décalage suivant l'axe Z
  385. */
  386. void
  387. vef_vertex_translate (
  388. vef_vertex * v,
  389. const vector3d * const delta)
  390. {
  391. v->x += delta->dx;
  392. v->y += delta->dy;
  393. v->z += delta->dz;
  394. }
  395. /**
  396. Rotation d'un vertex en radian autour de l'axe X
  397. @param v pointeur sur le vertex
  398. @param angle angle de rotation du vertex en radian
  399. @return aucun
  400. */
  401. void
  402. vef_vertex_rotateX_radian (
  403. vef_vertex * v,
  404. double angle)
  405. {
  406. double tempvy = v->y * cos (angle) + v->z * sin (angle);
  407. double tempvz = -v->y * sin (angle) + v->z * cos (angle);
  408. v->y = tempvy;
  409. v->z = tempvz;
  410. }
  411. /**
  412. Rotation d'un vertex en degre autour de l'axe X
  413. @param v pointeur sur le vertex
  414. @param angle angle de rotation du vertex en degre
  415. @return aucun
  416. */
  417. void
  418. vef_vertex_rotateX_degre (
  419. vef_vertex * v,
  420. double angle)
  421. {
  422. double angleradian = angle * 2.0 * PI / 360.0;
  423. double tempvy = v->y * cos (angleradian) + v->z * sin (angleradian);
  424. double tempvz = -v->y * sin (angleradian) + v->z * cos (angleradian);
  425. v->y = tempvy;
  426. v->z = tempvz;
  427. }
  428. /**
  429. Rotation d'un vertex en radian suivant l'axe X de centre (cx,cy,cz)
  430. @param v pointeur sur le vertex
  431. @param angle angle de rotation du vertex en radian
  432. @param cx coordonnée x du centre de rotation
  433. @param cy coordonnée y du centre de rotation
  434. @param cz coordonnée z du centre de rotation
  435. @return aucun
  436. */
  437. void
  438. vef_vertex_rotateX_center_radian (
  439. vef_vertex * v,
  440. double angle,
  441. const point3d * const centre)
  442. {
  443. vector3d delta;
  444. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  445. vef_vertex_translate (v, &delta);
  446. vector3d_reverse (&delta);
  447. vef_vertex_rotateX_radian (v, angle);
  448. vef_vertex_translate (v, &delta);
  449. }
  450. /**
  451. Rotation d'un vertex en degre suivant l'axe X de centre (cx,cy,cz)
  452. @param v pointeur sur le vertex
  453. @param angle angle de rotation du vertex en degre
  454. @param cx coordonnée x du centre de rotation
  455. @param cy coordonnée y du centre de rotation
  456. @param cz coordonnée z du centre de rotation
  457. @return aucun
  458. */
  459. void
  460. vef_vertex_rotateX_center_degre (
  461. vef_vertex * v,
  462. double angle,
  463. const point3d * const centre)
  464. {
  465. vector3d delta;
  466. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  467. vef_vertex_translate (v, &delta);
  468. vector3d_reverse (&delta);
  469. vef_vertex_rotateX_degre (v, angle);
  470. vef_vertex_translate (v, &delta);
  471. }
  472. /**
  473. Rotation d'un vertex en radian autour de l'axe Y
  474. @param v pointeur sur le vertex
  475. @param angle angle de rotation du vertex en radian
  476. @return aucun
  477. */
  478. void
  479. vef_vertex_rotateY_radian (
  480. vef_vertex * v,
  481. double angle)
  482. {
  483. double tempvx = v->x * cos (angle) + v->z * sin (angle);
  484. double tempvz = -v->x * sin (angle) + v->z * cos (angle);
  485. v->x = tempvx;
  486. v->z = tempvz;
  487. }
  488. /**
  489. Rotation d'un vertex en degre autour de l'axe Y
  490. @param v pointeur sur le vertex
  491. @param angle angle de rotation du vertex en degre
  492. @return aucun
  493. */
  494. void
  495. vef_vertex_rotateY_degre (
  496. vef_vertex * v,
  497. double angle)
  498. {
  499. double angleradian = angle * 2.0 * PI / 360.0;
  500. double tempvx = v->x * cos (angleradian) + v->z * sin (angleradian);
  501. double tempvz = -v->x * sin (angleradian) + v->z * cos (angleradian);
  502. v->x = tempvx;
  503. v->z = tempvz;
  504. }
  505. /**
  506. Rotation d'un vertex en radian suivant l'axe Y de centre (cx,cy,cz)
  507. @param v pointeur sur le vertex
  508. @param angle angle de rotation du vertex en radian
  509. @param cx coordonnée x du centre de rotation
  510. @param cy coordonnée y du centre de rotation
  511. @param cz coordonnée z du centre de rotation
  512. @return aucun
  513. */
  514. void
  515. vef_vertex_rotateY_center_radian (
  516. vef_vertex * v,
  517. double angle,
  518. const point3d * const centre)
  519. {
  520. vector3d delta;
  521. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  522. vef_vertex_translate (v, &delta);
  523. vector3d_reverse (&delta);
  524. vef_vertex_rotateY_radian (v, angle);
  525. vef_vertex_translate (v, &delta);
  526. }
  527. /**
  528. Rotation d'un vertex en degre suivant l'axe Y de centre (cx,cy,cz)
  529. @param v pointeur sur le vertex
  530. @param angle angle de rotation du vertex en degre
  531. @param cx coordonnée x du centre de rotation
  532. @param cy coordonnée y du centre de rotation
  533. @param cz coordonnée z du centre de rotation
  534. @return aucun
  535. */
  536. void
  537. vef_vertex_rotateY_center_degre (
  538. vef_vertex * v,
  539. double angle,
  540. const point3d * const centre)
  541. {
  542. vector3d delta;
  543. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  544. vef_vertex_translate (v, &delta);
  545. vector3d_reverse (&delta);
  546. vef_vertex_rotateY_degre (v, angle);
  547. vef_vertex_translate (v, &delta);
  548. }
  549. /**
  550. Rotation d'un vertex en radian autour de l'axe Z
  551. @param v pointeur sur le vertex
  552. @param angle angle de rotation du vertex en radian
  553. @return aucun
  554. */
  555. void
  556. vef_vertex_rotateZ_radian (
  557. vef_vertex * v,
  558. double angle)
  559. {
  560. double tempvx = v->x * cos (angle) + v->y * sin (angle);
  561. double tempvy = -v->x * sin (angle) + v->y * cos (angle);
  562. v->x = tempvx;
  563. v->y = tempvy;
  564. }
  565. /**
  566. Rotation d'un vertex en degre autour de l'axe Z
  567. @param v pointeur sur le vertex
  568. @param angle angle de rotation du vertex en degre
  569. @return aucun
  570. */
  571. void
  572. vef_vertex_rotateZ_degre (
  573. vef_vertex * v,
  574. double angle)
  575. {
  576. double angleradian = angle * 2.0 * PI / 360.0;
  577. double tempvx = v->x * cos (angleradian) + v->y * sin (angleradian);
  578. double tempvy = -v->x * sin (angleradian) + v->y * cos (angleradian);
  579. v->x = tempvx;
  580. v->y = tempvy;
  581. }
  582. /**
  583. Rotation d'un vertex en radian suivant l'axe Z de centre (cx,cy,cz)
  584. @param v pointeur sur le vertex
  585. @param angle angle de rotation du vertex en radian
  586. @param cx coordonnée x du centre de rotation
  587. @param cy coordonnée y du centre de rotation
  588. @param cz coordonnée z du centre de rotation
  589. @return aucun
  590. */
  591. void
  592. vef_vertex_rotateZ_center_radian (
  593. vef_vertex * v,
  594. double angle,
  595. const point3d * const centre)
  596. {
  597. vector3d delta;
  598. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  599. vef_vertex_translate (v, &delta);
  600. vector3d_reverse (&delta);
  601. vef_vertex_rotateZ_radian (v, angle);
  602. vef_vertex_translate (v, &delta);
  603. }
  604. /**
  605. Rotation d'un vertex en degre suivant l'axe Z de centre (cx,cy,cz)
  606. @param v pointeur sur le vertex
  607. @param angle angle de rotation du vertex en degre
  608. @param cx coordonnée x du centre de rotation
  609. @param cy coordonnée y du centre de rotation
  610. @param cz coordonnée z du centre de rotation
  611. @return aucun
  612. */
  613. void
  614. vef_vertex_rotateZ_center_degre (
  615. vef_vertex * v,
  616. double angle,
  617. const point3d * const centre)
  618. {
  619. vector3d delta;
  620. vector3d_init (&delta, -centre->x, -centre->y, -centre->z);
  621. vef_vertex_translate (v, &delta);
  622. vector3d_reverse (&delta);
  623. vef_vertex_rotateZ_degre (v, angle);
  624. vef_vertex_translate (v, &delta);
  625. }
  626. /**
  627. Rotation d'un vertex en degre suivant l'axe donnée
  628. @param v pointeur sur le vertex
  629. @param angle angle de rotation du vertex en degre
  630. @param axe l'axe de rotation avec (nx2 + ny2 + nz2 = 1)
  631. @return aucun
  632. **/
  633. void
  634. vef_vertex_rotate_axe_radian (
  635. vef_vertex * v,
  636. gsl_matrix * M)
  637. {
  638. double tempvx =
  639. gsl_matrix_get (M, 0, 0) * v->x +
  640. gsl_matrix_get (M, 0, 1) * v->y +
  641. gsl_matrix_get (M, 0, 2) * v->z;
  642. double tempvy =
  643. gsl_matrix_get (M, 1, 0) * v->x +
  644. gsl_matrix_get (M, 1, 1) * v->y +
  645. gsl_matrix_get (M, 1, 2) * v->z;
  646. double tempvz =
  647. gsl_matrix_get (M, 2, 0) * v->x +
  648. gsl_matrix_get (M, 2, 1) * v->y +
  649. gsl_matrix_get (M, 2, 2) * v->z;;
  650. v->x = tempvx;
  651. v->y = tempvy;
  652. v->z = tempvz;
  653. }
  654. /**
  655. Libération de la mémoire
  656. @param v le vef_vertex
  657. @return aucun
  658. **/
  659. void
  660. vef_vertex_free (
  661. vef_vertex * v)
  662. {
  663. free (v->sharededges);
  664. }