vector.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  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. /* 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. #include "vector.h"
  25. /********** INTERMEDIATE TYPES AND FUNCTIONS **********/
  26. /* Les fonctions intermédiaires sont préfixées de IF */
  27. /* et les types intermédiaires de IT */
  28. /********** MAIN FUNCTIONS **********/
  29. /**
  30. Initialisation d'un vector3d (dx,dy,dz)
  31. @param v pointeur sur le vector3d
  32. @param dx dx
  33. @param dy dy
  34. @param dz dz
  35. @return aucun
  36. */
  37. void
  38. vector3d_init (
  39. vector3d * v,
  40. double dx,
  41. double dy,
  42. double dz)
  43. {
  44. v->dx = dx;
  45. v->dy = dy;
  46. v->dz = dz;
  47. }
  48. /**
  49. Affichage d'un vector3d
  50. @param v le vector3d à afficher
  51. @return aucun
  52. */
  53. void
  54. vector3d_display (
  55. const vector3d * const v)
  56. {
  57. printf ("VECTOR --> [%f %f %f]\n", v->dx, v->dy, v->dz);
  58. }
  59. /**
  60. Calcule la longueur d'un vector3d
  61. @param v le vector3d à mesurer
  62. @return taille du vector3d
  63. */
  64. double
  65. vector3d_size (
  66. const vector3d * const v)
  67. {
  68. return sqrt (v->dx * v->dx + v->dy * v->dy + v->dz * v->dz);
  69. }
  70. /**
  71. Teste si deux vector3d sont égaux
  72. @param v1 le premier vector3d
  73. @param v2 le second vector3d à tester
  74. @return 1 si les deux vector3d sont égaux, 0 sinon
  75. */
  76. int
  77. vector3d_equal (
  78. const vector3d * const v1,
  79. const vector3d * const v2)
  80. {
  81. return (v1->dx == v2->dx && v1->dy == v2->dy && v1->dz == v2->dz);
  82. }
  83. /**
  84. Normalise le vector3d : transforme le vector3d de sorte que sa longueur soit égale à 1.0
  85. @param v poiteur sur le vector3d
  86. @return aucun
  87. */
  88. void
  89. vector3d_normalize (
  90. vector3d * v)
  91. {
  92. if (v->dx == 0 && v->dy == 0 && v->dz == 0)
  93. return;
  94. double size = vector3d_size (v);
  95. v->dx /= size;
  96. v->dy /= size;
  97. v->dz /= size;
  98. }
  99. /**
  100. Produit scalaire de deux vector3d
  101. @param v1 le premier vector3d
  102. @param v2 le second vector3d
  103. @return produit scalaire v1.v2
  104. */
  105. double
  106. vector3d_scalarproduct (
  107. const vector3d * const v1,
  108. const vector3d * const v2)
  109. {
  110. return v1->dx * v2->dx + v1->dy * v2->dy + v1->dz * v2->dz;
  111. }
  112. /**
  113. Produit vectoriel de deux vector3d
  114. @param v1 le premier vector3d
  115. @param v2 le second vector3d
  116. @return un vector3d résultat de v1^v2
  117. */
  118. vector3d
  119. vector3d_vectorialproduct (
  120. const vector3d * const v1,
  121. const vector3d * const v2)
  122. {
  123. vector3d W;
  124. W.dx = v1->dy * v2->dz - v1->dz * v2->dy;
  125. W.dy = -(v1->dx * v2->dz - v1->dz * v2->dx);
  126. W.dz = v1->dx * v2->dy - v1->dy * v2->dx;
  127. return W;
  128. }
  129. /**
  130. Inverse le vecteur
  131. @param v pointeur sur le vecteur à inverser
  132. @return aucun
  133. **/
  134. void
  135. vector3d_reverse (
  136. vector3d * v)
  137. {
  138. v->dx *= -1;
  139. v->dy *= -1;
  140. v->dz *= -1;
  141. }
  142. /**
  143. Addition de deux vecteurs3d v1+v2
  144. @param v1 premier vecteur
  145. @param v2 second vecteur
  146. @param un vector3d résultat de v1+v2
  147. **/
  148. vector3d
  149. vector3d_add (
  150. const vector3d * const v1,
  151. const vector3d * const v2)
  152. {
  153. vector3d v;
  154. v.dx = v1->dx + v2->dx;
  155. v.dy = v1->dy + v2->dy;
  156. v.dz = v1->dz + v2->dz;
  157. return v;
  158. }
  159. /**
  160. Soustraction de deux vecteurs3d v1-v2
  161. @param v1 premier vecteur
  162. @param v2 second vecteur
  163. @param un vector3d résultat de v1-v2
  164. **/
  165. vector3d
  166. vector3d_sub (
  167. const vector3d * const v1,
  168. const vector3d * const v2)
  169. {
  170. vector3d v;
  171. v.dx = v1->dx - v2->dx;
  172. v.dy = v1->dy - v2->dy;
  173. v.dz = v1->dz - v2->dz;
  174. return v;
  175. }
  176. /**
  177. Retourne la position de la valeur tosearch, -1 sinon
  178. @param list tableau de vector3d
  179. @param size taille du tableau
  180. @param tosearch vector3d à chercher
  181. @return position de la première occurence, -1 s'il n'apparait pas dans le tableau
  182. */
  183. int
  184. list_vector3d_contains (
  185. const vector3d * const list,
  186. int size,
  187. const vector3d * const tosearch)
  188. {
  189. int i;
  190. for (i = 0; i < size; i++)
  191. if (vector3d_equal (&(list[i]), tosearch))
  192. return i;
  193. return -1;
  194. }
  195. /**
  196. Ajoute le vector3d toadd en fin de liste
  197. @param list pointeur sur le premier élément du tableau
  198. @param size pointeur sur la taille du tableau
  199. @param toadd vector3d à ajouter
  200. @param add_type WITH_REDUNDANCE ou WITHOUT_REDUNDANCE <BR> avec redondance : ajout simple <BR> sans redondance : ajout si la valeur n'apparait pas dans la liste
  201. @return 1 si succès, 0 sinon
  202. */
  203. int
  204. list_vector3d_add (
  205. vector3d ** list,
  206. int *size,
  207. const vector3d * const toadd,
  208. int add_type)
  209. {
  210. if (add_type == WITHOUT_REDUNDANCE)
  211. if (list_vector3d_contains (*list, *size, toadd) != -1)
  212. return 1;
  213. else
  214. {
  215. vector3d *newlist =
  216. (vector3d *) malloc (((*size) + 1) * sizeof (vector3d));
  217. a2ri_erreur_critique_si (newlist == NULL,
  218. "erreur allocation memoire pour newlist\nlist_vector3d_add");
  219. int i;
  220. for (i = 0; i < *size; i++)
  221. vector3d_init (&(newlist[i]), ((*list)[i]).dx, ((*list)[i]).dy,
  222. ((*list)[i]).dz);
  223. vector3d_init (&(newlist[*size]), toadd->dx, toadd->dy, toadd->dz);
  224. free (*list);
  225. (*list) = newlist;
  226. *size = (*size) + 1;
  227. }
  228. else
  229. {
  230. vector3d *temp;
  231. temp = (vector3d *) realloc (*list, (*size + 1) * sizeof (vector3d));
  232. a2ri_erreur_critique_si (temp == NULL,
  233. "erreur allocation memoire pour list\nlist_vector3d_add");
  234. *list=temp;
  235. vector3d_init (&((*list)[*size]), toadd->dx, toadd->dy, toadd->dz);
  236. *size = (*size) + 1;
  237. }
  238. return 1;
  239. }
  240. /**
  241. Affichage de la liste de vector3d
  242. @param list tableau de vector3d
  243. @param size taille du tableau
  244. @return aucun
  245. */
  246. void
  247. list_vector3d_display (
  248. const vector3d * const list,
  249. int size)
  250. {
  251. int i;
  252. if (size == 0)
  253. return;
  254. printf ("liste :\n");
  255. for (i = 0; i < size; i++)
  256. vector3d_display (&(list[i]));
  257. }