main.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <a2ri/io.h>
  4. #include <a2ri/space_partition.h>
  5. #include <a2ri/point.h>
  6. #include <pthread.h>
  7. //Nombre moyen de points par cellule
  8. //Variable non fixé car dépend fortement du nombre de points et de leur dispersion
  9. //Laisser cette variable entre 1 et 50
  10. //Valeur forte (20-50) lorsque les sommets sont répartis régulièrement dans l'espace
  11. //Valeur faible (1-20) sinon (le cas le plus probable)
  12. #define NB_MOY_PTS 10
  13. typedef struct{
  14. space_partition *sp;
  15. vf_vertex *ve;
  16. double *longueur;
  17. int nb;
  18. }a2ri_arg_thread;
  19. void *thread_process (void *argu)
  20. {
  21. a2ri_arg_thread *arg=(a2ri_arg_thread*)argu;
  22. point3d p;
  23. double longueur;
  24. for(int i=0;i<(int)(arg->nb);i++)
  25. {
  26. point3d ptemp;
  27. point3d_init(&ptemp,arg->ve[i].x,arg->ve[i].y,arg->ve[i].z);
  28. space_partition_nearest_point(arg->sp,&ptemp,&p,&longueur,ACCEPT_ZERO_LENGTH);
  29. arg->longueur[i]=longueur;
  30. }
  31. pthread_exit (0);
  32. }
  33. int
  34. main(int argc, char* argv[])
  35. {
  36. if(argc!=3)
  37. {
  38. printf("usage: %s <modele m1> <modele m2>\n",argv[0]);
  39. return EXIT_FAILURE;
  40. }
  41. space_partition sp1,sp2;
  42. point3d ptmin,ptmax;
  43. a2ri_time depgen,fingen,depinter,fininter;
  44. double *listelongueur1=NULL,*listelongueur2=NULL;
  45. int nbpartX,nbpartY,nbpartZ;
  46. vf_model m1,m2;
  47. pthread_t th[A2RI_NB_THREAD];
  48. a2ri_arg_thread argument[A2RI_NB_THREAD];
  49. void *ret[A2RI_NB_THREAD];
  50. printf("ouverture des deux modeles\n");
  51. a2ri_vf_init(&m1);
  52. a2ri_vf_init(&m2);
  53. a2ri_vf_open_file(argv[1],&m1);
  54. a2ri_vf_open_file(argv[2],&m2);
  55. printf("M1 :\n");
  56. a2ri_vf_display(&m1);
  57. printf("M2 :\n");
  58. a2ri_vf_display(&m2);
  59. depgen=a2ri_get_time();
  60. printf("\n**************************\n\n");
  61. printf("creation des deux space_partition \n");
  62. depinter=a2ri_get_time();
  63. ptmin.x=m1.xmin;ptmin.y=m1.ymin;ptmin.z=m1.zmin;
  64. ptmax.x=m1.xmax;ptmax.y=m1.ymax;ptmax.z=m1.zmax;
  65. int nbpart=(int)(pow((m1.nbvertex/(NB_MOY_PTS*1.0)),1.0/3.0));
  66. double dx=m1.xmax-m1.xmin,dy=m1.ymax-m1.ymin,dz=m1.zmax-m1.zmin;
  67. //pour obtenir des cellules cubiques (ou presque)
  68. if(dx<=dy && dx<=dz)
  69. {
  70. //dx mini
  71. nbpartX=nbpart;
  72. nbpartY=(int)(nbpartX*(dy/dx));
  73. nbpartZ=(int)(nbpartX*(dz/dx));
  74. }
  75. else
  76. {
  77. if(dy<=dx && dy<=dz)
  78. {
  79. //dy mini
  80. nbpartY=nbpart;
  81. nbpartX=(int)(nbpartY*(dx/dy));
  82. nbpartZ=(int)(nbpartY*(dz/dy));
  83. }
  84. else
  85. {
  86. //dz mini
  87. nbpartZ=nbpart;
  88. nbpartX=(int)(nbpartZ*(dx/dz));
  89. nbpartY=(int)(nbpartZ*(dy/dz));
  90. }
  91. }
  92. space_partition_new(&sp1,&ptmin,&ptmax,nbpartX,nbpartY,nbpartZ);
  93. ptmin.x=m2.xmin;ptmin.y=m2.ymin;ptmin.z=m2.zmin;
  94. ptmax.x=m2.xmax;ptmax.y=m2.ymax;ptmax.z=m2.zmax;
  95. nbpart=(int)(pow((m1.nbvertex/(NB_MOY_PTS*1.0)),1.0/3.0));
  96. dx=m2.xmax-m2.xmin;dy=m2.ymax-m2.ymin;dz=m2.zmax-m2.zmin;
  97. if(dx<=dy && dx<=dz)
  98. {
  99. //dx mini
  100. nbpartX=nbpart;
  101. nbpartY=(int)(nbpartX*(dy/dx));
  102. nbpartZ=(int)(nbpartX*(dz/dx));
  103. }
  104. else
  105. {
  106. if(dy<=dx && dy<=dz)
  107. {
  108. //dy mini
  109. nbpartY=nbpart;
  110. nbpartX=(int)(nbpartY*(dx/dy));
  111. nbpartZ=(int)(nbpartY*(dz/dy));
  112. }
  113. else
  114. {
  115. //dz mini
  116. nbpartZ=nbpart;
  117. nbpartX=(int)(nbpartZ*(dx/dz));
  118. nbpartY=(int)(nbpartZ*(dy/dz));
  119. }
  120. }
  121. space_partition_new(&sp2,&ptmin,&ptmax,nbpartX,nbpartY,nbpartZ);
  122. a2ri_vf_space_partition(&m1,&sp1);
  123. a2ri_vf_space_partition(&m2,&sp2);
  124. fininter=a2ri_get_time();
  125. a2ri_display_interval_time("temps de creation : ",depinter,fininter);
  126. printf("\n**************************\n\n");
  127. printf("recherche du point le plus proche\n");
  128. printf("M1->M2\n");
  129. depinter=a2ri_get_time();
  130. listelongueur1=(double*)malloc(m1.nbvertex*sizeof(double));
  131. for(int i=0;i<A2RI_NB_THREAD-1;i++)
  132. {
  133. argument[i].sp=&sp2;
  134. argument[i].nb=m1.nbvertex/A2RI_NB_THREAD;
  135. argument[i].longueur=listelongueur1+i*argument[i].nb;
  136. argument[i].ve=m1.ve+i*argument[i].nb;
  137. }
  138. argument[A2RI_NB_THREAD-1].sp=&sp2;
  139. argument[A2RI_NB_THREAD-1].nb=m1.nbvertex-(A2RI_NB_THREAD-1)*(argument[0].nb);
  140. argument[A2RI_NB_THREAD-1].longueur=listelongueur1+(A2RI_NB_THREAD-1)*(argument[0].nb);
  141. argument[A2RI_NB_THREAD-1].ve=m1.ve+(A2RI_NB_THREAD-1)*(argument[0].nb);
  142. for(int i=0;i<A2RI_NB_THREAD;i++)
  143. {
  144. if (pthread_create (th+i, NULL, thread_process, argument+i) < 0) {
  145. fprintf (stderr, "pthread_create error for thread 2\n");
  146. exit (1);
  147. }
  148. }
  149. for(int i=0;i<A2RI_NB_THREAD;i++)
  150. (void)pthread_join (th[i], &ret[i]);
  151. fininter=a2ri_get_time();
  152. a2ri_display_interval_time("temps de calcul M1->M2 : ",depinter,fininter);
  153. printf("M2->M1\n\n");
  154. depinter=a2ri_get_time();
  155. listelongueur2=(double*)malloc(m2.nbvertex*sizeof(double));
  156. for(int i=0;i<A2RI_NB_THREAD-1;i++)
  157. {
  158. argument[i].sp=&sp1;
  159. argument[i].nb=m2.nbvertex/A2RI_NB_THREAD;
  160. argument[i].longueur=listelongueur2+i*argument[i].nb;
  161. argument[i].ve=m2.ve+i*argument[i].nb;
  162. }
  163. argument[A2RI_NB_THREAD-1].sp=&sp1;
  164. argument[A2RI_NB_THREAD-1].nb=m2.nbvertex-(A2RI_NB_THREAD-1)*(argument[0].nb);
  165. argument[A2RI_NB_THREAD-1].longueur=listelongueur2+(A2RI_NB_THREAD-1)*(argument[0].nb);
  166. argument[A2RI_NB_THREAD-1].ve=m2.ve+(A2RI_NB_THREAD-1)*(argument[0].nb);
  167. for(int i=0;i<A2RI_NB_THREAD;i++)
  168. {
  169. if (pthread_create (th+i, NULL, thread_process, argument+i) < 0) {
  170. fprintf (stderr, "pthread_create error for thread 2\n");
  171. exit (1);
  172. }
  173. }
  174. for(int i=0;i<A2RI_NB_THREAD;i++)
  175. (void)pthread_join (th[i], &ret[i]);
  176. fininter=a2ri_get_time();
  177. a2ri_display_interval_time("temps de calcul M2->M1 : ",depinter,fininter);
  178. fingen=a2ri_get_time();
  179. a2ri_display_interval_time("temps total : ",depgen,fingen);
  180. printf("\n**************************\n\n");
  181. printf("RESUTLATS :\n");
  182. printf("max M1->M2 : %lf\n",list_double_max(listelongueur1,m1.nbvertex));
  183. printf("max M2->M1 : %lf\n",list_double_max(listelongueur2,m2.nbvertex));
  184. space_partition_free(&sp1);
  185. space_partition_free(&sp2);
  186. free(listelongueur1);
  187. free(listelongueur2);
  188. a2ri_vf_free(&m1);
  189. a2ri_vf_free(&m2);
  190. return EXIT_SUCCESS;
  191. }