geometry.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /*************************************/
  2. /* Auteur : Rémi Synave */
  3. /* Date de création : 01/03/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 GEOMETRY__H
  25. #define GEOMETRY__H
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <math.h>
  29. #include <time.h>
  30. #include "util.h"
  31. #include "point.h"
  32. #include "vector.h"
  33. #include "matrix.h"
  34. /**
  35. Calcul de la longueur entre deux point3d
  36. @param p1 premier point3d
  37. @param p2 second point3d
  38. @return longueur \f$p_1p_2\f$
  39. */
  40. double point3d_length (
  41. const point3d * const p1,
  42. const point3d * const p2);
  43. /**
  44. Calcul de la longueur au carré entre deux point3d
  45. @param p1 premier point3d
  46. @param p2 second point3d
  47. @return longueur \f$p_1p_2\f$
  48. */
  49. double point3d_square_length (
  50. const point3d * const p1,
  51. const point3d * const p2);
  52. /**
  53. Calcul de la longueur entre deux point2d
  54. @param p1 premier point2d
  55. @param p2 second point2d
  56. @return longueur \f$p_1p_2\f$
  57. */
  58. double point2d_length (
  59. const point2d * const p1,
  60. const point2d * const p2);
  61. /**
  62. Calcule l'équation d'un plan à partir d'une liste de point sous la forme ax+by+cz+d=0
  63. @param p liste de points
  64. @param size nombre de points
  65. @param aeq valeur de "a"
  66. @param beq valeur de "b"
  67. @param ceq valeur de "c"
  68. @param deq valeur de "d"
  69. @return aucun
  70. Exemple de code
  71. @code
  72. double a,b,c,d;
  73. point3d p[3];
  74. point3d_init(&(p[0]),0.0,0.0,0.0);
  75. point3d_init(&(p[1]),1.0,1.0,-2.0);
  76. point3d_init(&(p[2]),-1.0,1.0,0.0);
  77. equation_plan(p,3,&a,&b,&c,&d);
  78. printf("%dx+%dy+%dz+%d=0\n",a,b,c,d);
  79. @endcode
  80. donne le résultat
  81. @code
  82. 1.0x+1.0y+1.0z+0.0=0
  83. @endcode
  84. */
  85. void equation_plan (
  86. const point3d * const p,
  87. int size,
  88. double *aeq,
  89. double *beq,
  90. double *ceq,
  91. double *deq);
  92. /**
  93. Calcul de l'aire du triangle défini par les trois points
  94. @param p1 premier point du triangle
  95. @param p2 second point
  96. @param p3 troisième point
  97. @return aire du triangle
  98. */
  99. double point3d_area (
  100. const point3d * const p1,
  101. const point3d * const p2,
  102. const point3d * const p3);
  103. /**
  104. Transformation des coordonnées d'un point dans un espace à trois dimension en coordonnées dans un espace à deux dimensions dont la base est le couple (base1,base2) et d'origine le point3d "origin"
  105. @param p point dont les coordonnées vont etre recalculées
  106. @param origin point origine du nouveau repére
  107. @param base1 premier vecteur formant la nouvelle base
  108. @param base2 second vecteur formant la nouvelle base
  109. @param newp point contenant les coordonnées dans la nouvelle base
  110. @return aucun
  111. */
  112. void base_modification_3d_to_2d (
  113. const point3d * const p,
  114. const point3d * const origin,
  115. const vector3d * const base1,
  116. const vector3d * const base2,
  117. point2d * newp);
  118. /**
  119. Calcul du vecteur normal à AB et contenu dans le meme plan que celui formé par les vecteurs (AB,AC). Le résultat final est une base orthogonal du repére.
  120. @param AB premier vecteur de la base
  121. @param AC second vecteur du repére
  122. @param U pointeur sur le nouveau vecteur formant la base orthogonal
  123. */
  124. void find_second_base_vector (
  125. const vector3d * const AB,
  126. const vector3d * const AC,
  127. vector3d * U);
  128. /**
  129. Vérification qu'un point M se trouve bien dans le triangle ABC
  130. @param M le point à tester
  131. @param A premier sommet du triangle
  132. @param B second sommet du triangle
  133. @param C troisième sommet du triangle
  134. @return 1 si le point M appartient au triangle ABC, 0 sinon
  135. */
  136. int point_in_triangle (
  137. const point3d * const M,
  138. const point3d * const A,
  139. const point3d * const B,
  140. const point3d * const C);
  141. /**
  142. Calcule l'angle en radian formé par les deux vector3d
  143. @param v1 le premier vector3d
  144. @param v2 le second vector3d
  145. @return angle en radian
  146. */
  147. double vector3d_angle_radian (
  148. const vector3d * const v1,
  149. const vector3d * const v2);
  150. /**
  151. Calcule l'angle en degré formé par les deux vector3d
  152. @param v1 le premier vector3d
  153. @param v2 le second vector3d
  154. @return angle en degré
  155. */
  156. double vector3d_angle_degre (
  157. const vector3d * const v1,
  158. const vector3d * const v2);
  159. /**
  160. Calcule le centre du cercle inscrit à un triangle
  161. @param A premier point du triangle
  162. @param B second point
  163. @param C troisème point
  164. @return le point centre du cercle inscrit
  165. */
  166. point3d incircle_center (
  167. const point3d * const A,
  168. const point3d * const B,
  169. const point3d * const C);
  170. /**
  171. Calcule le centre du cercle circonscrit à un triangle
  172. @param A premier point du triangle
  173. @param B second point
  174. @param C troisème point
  175. @return le point centre du cercle circonscrit
  176. */
  177. point3d circumcircle_center (
  178. point3d * A,
  179. point3d * B,
  180. point3d * C);
  181. /**
  182. Calcule le centre de sphère circonscrite au tétraédre
  183. @param A premier point du tétraédre
  184. @param B second point
  185. @param C troisème point
  186. @param D quatrième point
  187. @return le point centre de la sphère circonscrite
  188. */
  189. point3d circumsphere_center (
  190. point3d * A,
  191. point3d * B,
  192. point3d * C,
  193. point3d * D);
  194. /**
  195. Calcule la distance entre un point M et une droite définie par deux points A et B
  196. @param M point
  197. @param A premier point sur la droite
  198. @param B second point sur la droite
  199. @return distance entre le point M et la droite AB
  200. */
  201. double distance_point_straight_line (
  202. point3d * M,
  203. point3d * A,
  204. point3d * B);
  205. /**
  206. Calcule la distance entre un point M et un plan définie par trois points A,b et C
  207. @param M point
  208. @param A premier point du plan
  209. @param B second point du plan
  210. @param C troisieme point du plan
  211. @return distance entre le point M et le plan ABC
  212. */
  213. double distance_point_plane (
  214. point3d * M,
  215. point3d * A,
  216. point3d * B,
  217. point3d * C);
  218. /**
  219. Calcule la distance entre un point M et un triangle défini par trois points A,b et C
  220. @param M point
  221. @param A premier point du triangle
  222. @param B second point du triangle
  223. @param C troisieme point du triangle
  224. @return distance entre le point M et le triangle ABC
  225. */
  226. double distance_point_triangle (
  227. point3d * M,
  228. point3d * A,
  229. point3d * B,
  230. point3d * C);
  231. /**
  232. Echantillonne le triangle ABC
  233. @param A point A du triangle
  234. @param B point B
  235. @param C point C
  236. @param nb_sample nombre d'échantillon à extraire
  237. @param list tableau de réel représentant les coordonées des échantillons
  238. @param size taille du tableau
  239. @return aucun
  240. */
  241. void sample_triangle (
  242. const point3d * const A,
  243. const point3d * const B,
  244. const point3d * const C,
  245. int nb_sample,
  246. point3d ** list);
  247. /**
  248. Test de l'instrsection entre une droite et un plan
  249. @param d1 premier point définissant la droite
  250. @param d2 second point définissant la droite
  251. @param p1 premier point du plan
  252. @param p2 second point du plan
  253. @param p3 troisieme point du plan
  254. @param t paramètre d'intersection
  255. @return 1 si intersection, 0 sinon
  256. */
  257. int intersection_droite_plan (
  258. point3d * d1,
  259. point3d * d2,
  260. point3d * p1,
  261. point3d * p2,
  262. point3d * p3,
  263. double *t);
  264. /**
  265. Test de l'intersection entre une droite et un triangle
  266. @param d1 premier point définissant la droite
  267. @param d2 second point définissant la droite
  268. @param p1 premier point du triangle
  269. @param p2 second point du triangle
  270. @param p3 troisieme point du triangle
  271. @return 1 si intersection, 0 sinon
  272. */
  273. int intersection_droite_triangle (
  274. point3d * d1,
  275. point3d * d2,
  276. point3d * p1,
  277. point3d * p2,
  278. point3d * p3,
  279. double *t);
  280. /**
  281. Test de l'intersection entre un segment et un triangle
  282. @param s1 premier point définissant le segment
  283. @param s2 second point définissant le segment
  284. @param p1 premier point du triangle
  285. @param p2 second point du triangle
  286. @param p3 troisieme point du triangle
  287. @return 1 si intersection, 0 sinon
  288. */
  289. int intersection_segment_triangle (
  290. point3d * s1,
  291. point3d * s2,
  292. point3d * p1,
  293. point3d * p2,
  294. point3d * p3,
  295. double *t);
  296. /**
  297. Test de l'intersection entre deux triangles
  298. @param t1 premier point définissant le premier triangle
  299. @param t2 second point définissant le premier triangle
  300. @param t3 troisieme point définissant le premier triangle
  301. @param p1 premier point du second triangle
  302. @param p2 second point du second triangle
  303. @param p3 troisieme point du second triangle
  304. @return 1 si intersection, 0 sinon
  305. */
  306. int intersection_triangle_triangle (
  307. point3d * t1,
  308. point3d * t2,
  309. point3d * t3,
  310. point3d * p1,
  311. point3d * p2,
  312. point3d * p3);
  313. /**
  314. Teste si les trois points A, B et C sont alignés
  315. @param A premier point
  316. @param B second point
  317. @param C troisieme point
  318. @return 1 si les trois points sont alignés, 0 sinon
  319. */
  320. int trois_points_alignes (
  321. point3d * A,
  322. point3d * B,
  323. point3d * C);
  324. #endif