Mesh.cpp
上传用户:lin85885
上传日期:2013-04-27
资源大小:796k
文件大小:33k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Mesh.cpp: implementation of the CMesh class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include <gl/gl.h>
  6. #include "Mesh.h"
  7. #include "Heap.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CMesh::CMesh()
  17. {
  18. m_Triangle = NULL;
  19. m_sTriangle = NULL;
  20. m_Vertex = NULL;
  21. m_sVertex = NULL;
  22. m_nTriangle = 0 ;
  23. m_nVertex = 0;
  24. m_VNormal = NULL;
  25. m_TNormal = NULL;
  26. m_sVNormal = NULL;
  27. m_sTNormal = NULL;
  28. m_pProgress = NULL;
  29. }
  30. CMesh::~CMesh()
  31. {
  32. if (m_Vertex)
  33. delete []m_Vertex;
  34. if (m_sVertex)
  35. delete []m_sVertex;
  36. if (m_Triangle)
  37. delete []m_Triangle;
  38. if (m_sTriangle)
  39. delete []m_sTriangle;
  40. if (m_VNormal)
  41. delete []m_VNormal;
  42. if (m_TNormal)
  43. delete []m_TNormal;
  44. if (m_sVNormal)
  45. delete []m_sVNormal;
  46. if (m_sTNormal)
  47. delete []m_sTNormal;
  48. }
  49. int CMesh::ReadData(FILE *fp)
  50. {
  51. int i,j;
  52. float box[2][3];
  53. float center[3];
  54. fscanf(fp,"%d%d",&m_nVertex,&m_nTriangle);
  55. if (m_pProgress)
  56. m_pProgress->SetRange(0, m_nVertex+m_nTriangle);
  57. m_Vertex = new Coord3[m_nVertex];
  58. m_Triangle = new Triangle[m_nTriangle];
  59. for (i=0;i<m_nVertex;i++)
  60. {
  61. fscanf(fp,"%f%f%f", &(m_Vertex[i][0]), &(m_Vertex[i][1]), &(m_Vertex[i][2]));
  62. m_pProgress->SetPos(i);
  63. }
  64. for (i=0;i<m_nTriangle;i++)
  65. {
  66. fscanf(fp,"%d%d%d", &(m_Triangle[i][0]), &(m_Triangle[i][1]), &(m_Triangle[i][2]));
  67. m_pProgress->SetPos(i+m_nVertex);
  68. }
  69. box[0][0] = box[0][1] = box[0][2] = MAXFLOAT;
  70. box[1][0] = box[1][1] = box[1][2] = -MAXFLOAT;
  71. for (i=0;i<m_nVertex;i++)
  72. for (j=0;j<3;j++)
  73. {
  74. if (box[0][j]>m_Vertex[i][j])
  75. box[0][j] = m_Vertex[i][j];
  76. if (box[1][j]<m_Vertex[i][j])
  77. box[1][j] = m_Vertex[i][j];
  78. }
  79. center[0] = (box[0][0]+box[1][0])/2.0;
  80. center[1] = (box[0][1]+box[1][1])/2.0;
  81. center[2] = (box[0][2]+box[1][2])/2.0;
  82. float scale;
  83. scale = FMAX(box[1][0]-box[0][0],FMAX(box[1][1]-box[0][1],box[1][2]-box[0][2]));
  84. scale /=2.0;
  85. for (i=0;i<m_nVertex;i++)
  86. {
  87. VEC3_VOPV_OP_S(m_Vertex[i],m_Vertex[i],-,center,/,scale);
  88. }
  89. VEC3_VOPV_OP_S(box[0],box[0],-,center,/,scale);
  90. VEC3_VOPV_OP_S(box[1],box[1],-,center,/,scale);
  91. VEC3_ZERO(center);
  92. m_VNormal = new Coord3[m_nVertex];
  93. m_TNormal = new Coord3[m_nTriangle];
  94. m_nsTriangle = m_nTriangle;
  95. m_nsVertex = m_nVertex;
  96. m_sTriangle = new Triangle[m_nTriangle];
  97. m_sVertex = new Coord3[m_nVertex];
  98. for (i=0;i<m_nVertex;i++)
  99. {
  100. VEC3_ASN_OP(m_sVertex[i],=,m_Vertex[i]);
  101. }
  102. for (i=0;i<m_nTriangle;i++)
  103. {
  104. VEC3_ASN_OP(m_sTriangle[i],=,m_Triangle[i]);
  105. }
  106. for (i=0;i<m_nVertex;i++)
  107. {
  108. VEC3_ZERO(m_VNormal[i]);
  109. }
  110. for (i=0;i<m_nTriangle;i++)
  111. {
  112. Coord3 vect[3];
  113. VEC3_V_OP_V(vect[0],m_Vertex[m_Triangle[i][1]],-,m_Vertex[m_Triangle[i][0]]);
  114. VEC3_V_OP_V(vect[1],m_Vertex[m_Triangle[i][2]],-,m_Vertex[m_Triangle[i][0]]);
  115. CROSSPROD3(vect[2],vect[0],vect[1]);
  116. V3Standarize(vect[2]);
  117. VEC3_ASN_OP(m_TNormal[i],=,vect[2]);
  118. for (j=0;j<3;j++)
  119. {
  120. VEC3_V_OP_V(m_VNormal[m_Triangle[i][j]],m_VNormal[m_Triangle[i][j]],+,vect[2]);
  121. }
  122. }
  123. for (i=0;i<m_nVertex;i++)
  124. V3Standarize(m_VNormal[i]);
  125. m_sVNormal = new Coord3[m_nVertex];
  126. m_sTNormal = new Coord3[m_nTriangle];
  127. for (i=0;i<m_nVertex;i++)
  128. {
  129. VEC3_ASN_OP(m_sVNormal[i],=,m_VNormal[i]);
  130. }
  131. for (i=0;i<m_nTriangle;i++)
  132. {
  133. VEC3_ASN_OP(m_sTNormal[i],=,m_TNormal[i]);
  134. }
  135. return m_nTriangle;
  136. }
  137. void CMesh::SaveData(FILE *fp)
  138. {
  139. int i;
  140. fprintf(fp,"%d %dn",m_nsVertex,m_nsTriangle);
  141. if (m_pProgress)
  142. m_pProgress->SetRange(0, m_nsVertex+m_nsTriangle);
  143. for (i=0;i<m_nsVertex;i++)
  144. {
  145. fprintf(fp,"%f %f %fn", m_sVertex[i][0], m_sVertex[i][1], m_sVertex[i][2]);
  146. m_pProgress->SetPos(i);
  147. }
  148. for (i=0;i<m_nsTriangle;i++)
  149. {
  150. fprintf(fp,"%d %d %dn", m_sTriangle[i][0], m_sTriangle[i][1], m_sTriangle[i][2]);
  151. m_pProgress->SetPos(i+m_nsVertex);
  152. }
  153. }
  154. int CMesh::DrawModel(int RenderMode, int RenderModel)
  155. {
  156. int i;
  157. if (RenderMode == 0)
  158. {
  159. glDisable(GL_LIGHTING);
  160. if (RenderModel == 0)
  161. {
  162. for (i=0; i<m_nTriangle; i++)
  163. {
  164. glBegin(GL_LINE_LOOP);
  165. glVertex3fv(m_Vertex[m_Triangle[i][0]]);
  166. glVertex3fv(m_Vertex[m_Triangle[i][1]]);
  167. glVertex3fv(m_Vertex[m_Triangle[i][2]]);
  168. glEnd();
  169. }
  170. }
  171. else if (RenderModel == 1)
  172. {
  173. for (i=0; i<m_nsTriangle; i++)
  174. {
  175. glBegin(GL_LINE_LOOP);
  176. glVertex3fv(m_sVertex[m_sTriangle[i][0]]);
  177. glVertex3fv(m_sVertex[m_sTriangle[i][1]]);
  178. glVertex3fv(m_sVertex[m_sTriangle[i][2]]);
  179. glEnd();
  180. }
  181. }
  182. glEnable(GL_LIGHTING);
  183. }
  184. else if (RenderMode == 1)
  185. {
  186. glBegin(GL_TRIANGLES);
  187. if (RenderModel == 0)
  188. {
  189. for (i=0; i<m_nTriangle; i++)
  190. {
  191. glNormal3fv(m_TNormal[i]);
  192. glVertex3fv(m_Vertex[m_Triangle[i][0]]);
  193. glVertex3fv(m_Vertex[m_Triangle[i][1]]);
  194. glVertex3fv(m_Vertex[m_Triangle[i][2]]);
  195. }
  196. }
  197. else if (RenderModel == 1)
  198. {
  199. for (i=0; i<m_nsTriangle; i++)
  200. {
  201. glNormal3fv(m_sTNormal[i]);
  202. glVertex3fv(m_sVertex[m_sTriangle[i][0]]);
  203. glVertex3fv(m_sVertex[m_sTriangle[i][1]]);
  204. glVertex3fv(m_sVertex[m_sTriangle[i][2]]);
  205. }
  206. }
  207. glEnd();
  208. }
  209. glEnable(GL_LIGHTING);
  210. if (RenderModel == 0)
  211. return m_nTriangle;
  212. else if (RenderModel == 1)
  213. return m_nsTriangle;
  214. else
  215. return 0;
  216. }
  217. int CMesh::Simplify(float ratio)
  218. {
  219.   Matrix4x4 *tri_Q;
  220.   Matrix4x4 *vex_Q;
  221.   Coord3 *Vertex;
  222.   Triangle *Mesh;
  223.   
  224.   int **vex_tri;
  225.   int **vRing;
  226.   int *Vex_map;
  227.   int i,j,k;
  228.   int tmp,tmp1,tmp2;
  229.   int **cad_pair;
  230.   float **pair_cost;
  231.   Coord3 **pair_pos;
  232.   BOOL *bMark;
  233.   int  *nMap;
  234.   int  *mMap;
  235.   if (m_nTriangle == 0)
  236.   return 0;
  237.   delete []m_sVertex;
  238.   delete []m_sTriangle;
  239.   delete []m_sVNormal;
  240.   delete []m_sTNormal;
  241.   Vertex= new Coord3[m_nVertex];
  242.   for (i=0;i<m_nVertex;i++)
  243.   {
  244.   VEC3_ASN_OP(Vertex[i],=,m_Vertex[i]);
  245.   }
  246.   Mesh = new Triangle[m_nTriangle];
  247.   for (i=0; i<m_nTriangle; i++)
  248.   {
  249.   VEC3_ASN_OP(Mesh[i],=,m_Triangle[i]);
  250.   }
  251.   
  252.   vex_tri=(int **)malloc(m_nVertex*sizeof(int *));
  253.   vRing=(int **)malloc(m_nVertex*sizeof(int *));
  254.   for (i=0;i<m_nVertex;i++) {
  255. vex_tri[i]=(int *)malloc(6*Size_int);
  256. vex_tri[i][0]=0;
  257. vRing[i]=(int *)malloc(6*Size_int);
  258. vRing[i][0]=0;
  259.   }
  260.   cad_pair=(int **)malloc(m_nVertex*sizeof(int *));
  261.   for (i=0;i<m_nVertex;i++) {
  262. cad_pair[i]=(int *)malloc(6*Size_int);
  263. cad_pair[i][0]=0;
  264.   }
  265.   pair_cost=(float **)malloc(m_nVertex*sizeof(float *));
  266.   pair_pos=(Coord3 **)malloc(m_nVertex*sizeof(Coord3 *));
  267.   Vex_map= new int[m_nVertex];
  268.   for (i=0;i<m_nVertex;i++)
  269. Vex_map[i]=i;
  270.   for (k=0;k<m_nTriangle;k++)
  271.   {
  272. for (i=0;i<3;i++) {
  273. tmp=tmp1=Mesh[k][i];
  274. tmp2=Mesh[k][(i+2)%3];
  275. for (j=1;j<vRing[tmp][0]+1;j++)
  276. if (vRing[tmp][j] == tmp2)
  277. break;
  278. if (j==vRing[tmp][0]+1)
  279. {
  280. vRing[tmp][j]=tmp2;
  281. vRing[tmp][0] += 1;
  282. if (!(vRing[tmp][0]%5))
  283. vRing[tmp] = (int *)realloc(vRing[tmp],(vRing[tmp][0]+6)*sizeof(int));
  284. }
  285. tmp2=Mesh[k][(i+1)%3];
  286. for (j=1;j<vRing[tmp][0]+1;j++)
  287. if (vRing[tmp][j] == tmp2)
  288. break;
  289. if (j==vRing[tmp][0]+1)
  290. {
  291. vRing[tmp][j]=tmp2;
  292. vRing[tmp][0] += 1;
  293. if (!(vRing[tmp][0]%5))
  294. vRing[tmp] = (int *)realloc(vRing[tmp],(vRing[tmp][0]+6)*sizeof(int));
  295. }
  296. if (vex_tri[tmp]==NULL) {
  297. vex_tri[tmp]=(int *)malloc(6*sizeof(int));
  298. vex_tri[tmp][0]=1;
  299. vex_tri[tmp][1]=k;
  300. }
  301. else {
  302. if (!(vex_tri[tmp][0]%5))
  303. vex_tri[tmp]=(int *)realloc(vex_tri[tmp],(vex_tri[tmp][0]+6)*sizeof(int));
  304. vex_tri[tmp][0]=vex_tri[tmp][0]+1;
  305. vex_tri[tmp][vex_tri[tmp][0]]=k;
  306. }
  307. if (tmp1>tmp2) {
  308. tmp=tmp1;
  309. tmp1=tmp2;
  310. tmp2=tmp;
  311. }
  312. for (j=1;j<=cad_pair[tmp1][0];j++)
  313. if (cad_pair[tmp1][j]==tmp2)
  314. break;
  315. if (j>cad_pair[tmp1][0]) {
  316. if (!(cad_pair[tmp1][0]%5))
  317. cad_pair[tmp1]=(int *)realloc(cad_pair[tmp1],(cad_pair[tmp1][0]+6)*sizeof(int));
  318. cad_pair[tmp1][0]=j;
  319. cad_pair[tmp1][j]=tmp2;
  320. }
  321. }
  322.   }
  323.   BOOL *border;
  324.   border = new BOOL[m_nVertex];
  325.   for (i=0;i<m_nVertex;i++)
  326.   {
  327.   if (vex_tri[i][0]==vRing[i][0])
  328.   border[i]=FALSE;
  329.   else
  330.   border[i]=TRUE;
  331.   free(vRing[i]);
  332.   }
  333.   free(vRing);
  334.   tri_Q=(Matrix4x4 *)malloc(m_nTriangle*Size_Matrix4x4);
  335.   cal_tri_Q(m_nTriangle,Mesh,Vertex,m_TNormal,tri_Q);
  336.   vex_Q=(Matrix4x4 *)malloc(m_nVertex*Size_Matrix4x4);
  337.   cal_vex_Q(m_nVertex,border,vex_tri,Mesh,Vertex,m_TNormal,tri_Q,vex_Q);
  338.   free(tri_Q);
  339.   bMark = new BOOL[m_nVertex];
  340.   for (i=0;i<m_nVertex;i++)
  341.   bMark[i]=FALSE;
  342.   int nvex = 0;
  343.   for (i=0;i<m_nTriangle;i++)
  344.   for (j=0;j<3;j++)
  345.   if (!bMark[Mesh[i][j]])
  346.   {
  347.   nvex++;
  348.   bMark[Mesh[i][j]] = TRUE;
  349.   }
  350.   for (i=0;i<m_nVertex;i++)
  351.   if (vex_tri[i])
  352. free(vex_tri[i]);
  353.   free(vex_tri);
  354.   tmp=(int)(m_nTriangle*ratio);
  355.   if (m_pProgress)
  356.   m_pProgress->SetRange(0,tmp);
  357.   
  358.   pair_contract(m_nVertex,border,cad_pair,pair_cost,pair_pos,
  359.         vex_Q,Vertex,Vex_map,tmp);
  360.   free(vex_Q);
  361.   delete []border;
  362.   nMap = new int[m_nVertex];
  363.   mMap = new int[m_nVertex];
  364.   for (i=0;i<m_nVertex;i++)
  365.   bMark[i]=FALSE;
  366.   for (i=0;i<m_nVertex;i++)
  367.   {
  368. tmp=i;
  369. while (Vex_map[tmp]!=tmp)
  370. tmp=Vex_map[tmp];
  371. Vex_map[i]=tmp;
  372.   }
  373.   m_nsTriangle=0;
  374.   for (i=0;i<m_nTriangle;i++)
  375.   if ((Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][1]])&&
  376.   (Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][2]])&&
  377.   (Vex_map[Mesh[i][1]]!=Vex_map[Mesh[i][2]]))
  378.   {
  379.   bMark[Vex_map[Mesh[i][0]]] = TRUE;
  380.   bMark[Vex_map[Mesh[i][1]]] = TRUE;
  381.   bMark[Vex_map[Mesh[i][2]]] = TRUE;
  382.   m_nsTriangle++;
  383.   }
  384.   m_nsVertex=0;
  385.   for (i=0;i<m_nVertex;i++)
  386.   if (bMark[i])
  387.   {
  388.   nMap[i] = m_nsVertex;
  389.   mMap[m_nsVertex] = i;
  390.   m_nsVertex++;
  391.   }
  392.   m_sVertex = new Coord3[m_nsVertex];
  393.   for (i=0;i<m_nsVertex;i++)
  394.   {
  395.   VEC3_ASN_OP(m_sVertex[i],=,Vertex[mMap[i]]);
  396.   }
  397.   m_sTriangle = new Triangle[m_nsTriangle];
  398.   m_nsTriangle = 0;
  399.   for (i=0;i<m_nTriangle;i++)
  400.   if ((Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][1]])&&
  401.   (Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][2]])&&
  402.   (Vex_map[Mesh[i][1]]!=Vex_map[Mesh[i][2]]))
  403.   {
  404.   m_sTriangle[m_nsTriangle][0] = nMap[Vex_map[Mesh[i][0]]];
  405.   m_sTriangle[m_nsTriangle][1] = nMap[Vex_map[Mesh[i][1]]];
  406.   m_sTriangle[m_nsTriangle][2] = nMap[Vex_map[Mesh[i][2]]];
  407.   m_nsTriangle++;
  408.   }
  409. m_sVNormal = new Coord3[m_nsVertex];
  410. m_sTNormal = new Coord3[m_nsTriangle];
  411. for (i=0;i<m_nsVertex;i++)
  412. {
  413. VEC3_ZERO(m_sVNormal[i]);
  414. }
  415. for (i=0;i<m_nsTriangle;i++)
  416. {
  417. Coord3 vect[3];
  418. VEC3_V_OP_V(vect[0],m_sVertex[m_sTriangle[i][1]],-,m_sVertex[m_sTriangle[i][0]]);
  419. VEC3_V_OP_V(vect[1],m_sVertex[m_sTriangle[i][2]],-,m_sVertex[m_sTriangle[i][0]]);
  420. CROSSPROD3(vect[2],vect[0],vect[1]);
  421. V3Standarize(vect[2]);
  422. VEC3_ASN_OP(m_sTNormal[i],=,vect[2]);
  423. for (j=0;j<3;j++)
  424. {
  425. VEC3_V_OP_V(m_sVNormal[m_sTriangle[i][j]],m_sVNormal[m_sTriangle[i][j]],+,vect[2]);
  426. }
  427. }
  428. for (i=0;i<m_nsVertex;i++)
  429. V3Standarize(m_sVNormal[i]);
  430.   delete []Vex_map;
  431.   delete []Mesh;
  432.   delete []Vertex;
  433.   delete []mMap;
  434.   delete []nMap;
  435.   delete []bMark;
  436.   return m_nsTriangle;
  437. }
  438. int CMesh::Simplify(int nFaceNo)
  439. {
  440.   Matrix4x4 *tri_Q;
  441.   Matrix4x4 *vex_Q;
  442.   Coord3 *Vertex;
  443.   Triangle *Mesh;
  444.   
  445.   int **vex_tri;
  446.   int **vRing;
  447.   int *Vex_map;
  448.   int i,j,k;
  449.   int tmp,tmp1,tmp2;
  450.   int **cad_pair;
  451.   float **pair_cost;
  452.   Coord3 **pair_pos;
  453.   BOOL *bMark;
  454.   int  *nMap;
  455.   int  *mMap;
  456.   if (m_nTriangle == 0)
  457.   return 0;
  458.   delete []m_sVertex;
  459.   delete []m_sTriangle;
  460.   delete []m_sVNormal;
  461.   delete []m_sTNormal;
  462.   Vertex= new Coord3[m_nVertex];
  463.   for (i=0;i<m_nVertex;i++)
  464.   {
  465.   VEC3_ASN_OP(Vertex[i],=,m_Vertex[i]);
  466.   }
  467.   Mesh = new Triangle[m_nTriangle];
  468.   for (i=0; i<m_nTriangle; i++)
  469.   {
  470.   VEC3_ASN_OP(Mesh[i],=,m_Triangle[i]);
  471.   }
  472.   
  473.   vex_tri=(int **)malloc(m_nVertex*sizeof(int *));
  474.   vRing=(int **)malloc(m_nVertex*sizeof(int *));
  475.   for (i=0;i<m_nVertex;i++) {
  476. vex_tri[i]=(int *)malloc(6*Size_int);
  477. vex_tri[i][0]=0;
  478. vRing[i]=(int *)malloc(6*Size_int);
  479. vRing[i][0]=0;
  480.   }
  481.   cad_pair=(int **)malloc(m_nVertex*sizeof(int *));
  482.   for (i=0;i<m_nVertex;i++) {
  483. cad_pair[i]=(int *)malloc(6*Size_int);
  484. cad_pair[i][0]=0;
  485.   }
  486.   pair_cost=(float **)malloc(m_nVertex*sizeof(float *));
  487.   pair_pos=(Coord3 **)malloc(m_nVertex*sizeof(Coord3 *));
  488.   Vex_map= new int[m_nVertex];
  489.   for (i=0;i<m_nVertex;i++)
  490. Vex_map[i]=i;
  491.   for (k=0;k<m_nTriangle;k++)
  492.   {
  493. for (i=0;i<3;i++) {
  494. tmp=tmp1=Mesh[k][i];
  495. tmp2=Mesh[k][(i+2)%3];
  496. for (j=1;j<vRing[tmp][0]+1;j++)
  497. if (vRing[tmp][j] == tmp2)
  498. break;
  499. if (j==vRing[tmp][0]+1)
  500. {
  501. vRing[tmp][j]=tmp2;
  502. vRing[tmp][0] += 1;
  503. if (!(vRing[tmp][0]%5))
  504. vRing[tmp] = (int *)realloc(vRing[tmp],(vRing[tmp][0]+6)*sizeof(int));
  505. }
  506. tmp2=Mesh[k][(i+1)%3];
  507. for (j=1;j<vRing[tmp][0]+1;j++)
  508. if (vRing[tmp][j] == tmp2)
  509. break;
  510. if (j==vRing[tmp][0]+1)
  511. {
  512. vRing[tmp][j]=tmp2;
  513. vRing[tmp][0] += 1;
  514. if (!(vRing[tmp][0]%5))
  515. vRing[tmp] = (int *)realloc(vRing[tmp],(vRing[tmp][0]+6)*sizeof(int));
  516. }
  517. if (vex_tri[tmp]==NULL) {
  518. vex_tri[tmp]=(int *)malloc(6*sizeof(int));
  519. vex_tri[tmp][0]=1;
  520. vex_tri[tmp][1]=k;
  521. }
  522. else {
  523. if (!(vex_tri[tmp][0]%5))
  524. vex_tri[tmp]=(int *)realloc(vex_tri[tmp],(vex_tri[tmp][0]+6)*sizeof(int));
  525. vex_tri[tmp][0]=vex_tri[tmp][0]+1;
  526. vex_tri[tmp][vex_tri[tmp][0]]=k;
  527. }
  528. if (tmp1>tmp2) {
  529. tmp=tmp1;
  530. tmp1=tmp2;
  531. tmp2=tmp;
  532. }
  533. for (j=1;j<=cad_pair[tmp1][0];j++)
  534. if (cad_pair[tmp1][j]==tmp2)
  535. break;
  536. if (j>cad_pair[tmp1][0]) {
  537. if (!(cad_pair[tmp1][0]%5))
  538. cad_pair[tmp1]=(int *)realloc(cad_pair[tmp1],(cad_pair[tmp1][0]+6)*sizeof(int));
  539. cad_pair[tmp1][0]=j;
  540. cad_pair[tmp1][j]=tmp2;
  541. }
  542. }
  543.   }
  544.   BOOL *border;
  545.   border = new BOOL[m_nVertex];
  546.   for (i=0;i<m_nVertex;i++)
  547.   {
  548.   if (vex_tri[i][0]==vRing[i][0])
  549.   border[i]=FALSE;
  550.   else
  551.   border[i]=TRUE;
  552.   free(vRing[i]);
  553.   }
  554.   free(vRing);
  555.   tri_Q=(Matrix4x4 *)malloc(m_nTriangle*Size_Matrix4x4);
  556.   cal_tri_Q(m_nTriangle,Mesh,Vertex,m_TNormal,tri_Q);
  557.   vex_Q=(Matrix4x4 *)malloc(m_nVertex*Size_Matrix4x4);
  558.   cal_vex_Q(m_nVertex,border,vex_tri,Mesh,Vertex,m_TNormal,tri_Q,vex_Q);
  559.   free(tri_Q);
  560.   bMark = new BOOL[m_nVertex];
  561.   for (i=0;i<m_nVertex;i++)
  562.   bMark[i]=FALSE;
  563.   int nvex = 0;
  564.   for (i=0;i<m_nTriangle;i++)
  565.   for (j=0;j<3;j++)
  566.   if (!bMark[Mesh[i][j]])
  567.   {
  568.   nvex++;
  569.   bMark[Mesh[i][j]] = TRUE;
  570.   }
  571.   for (i=0;i<m_nVertex;i++)
  572.   if (vex_tri[i])
  573. free(vex_tri[i]);
  574.   free(vex_tri);
  575.   tmp = m_nTriangle - nFaceNo;
  576.   if (m_pProgress)
  577.   m_pProgress->SetRange(0,tmp);
  578.   pair_contract(m_nVertex,border,cad_pair,pair_cost,pair_pos,
  579.         vex_Q,Vertex,Vex_map,tmp);
  580.   free(vex_Q);
  581.   delete []border;
  582.   nMap = new int[m_nVertex];
  583.   mMap = new int[m_nVertex];
  584.   for (i=0;i<m_nVertex;i++)
  585.   bMark[i]=FALSE;
  586.   for (i=0;i<m_nVertex;i++)
  587.   {
  588. tmp=i;
  589. while (Vex_map[tmp]!=tmp)
  590. tmp=Vex_map[tmp];
  591. Vex_map[i]=tmp;
  592.   }
  593.   m_nsTriangle=0;
  594.   for (i=0;i<m_nTriangle;i++)
  595.   if ((Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][1]])&&
  596.   (Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][2]])&&
  597.   (Vex_map[Mesh[i][1]]!=Vex_map[Mesh[i][2]]))
  598.   {
  599.   bMark[Vex_map[Mesh[i][0]]] = TRUE;
  600.   bMark[Vex_map[Mesh[i][1]]] = TRUE;
  601.   bMark[Vex_map[Mesh[i][2]]] = TRUE;
  602.   m_nsTriangle++;
  603.   }
  604.   m_nsVertex=0;
  605.   for (i=0;i<m_nVertex;i++)
  606.   if (bMark[i])
  607.   {
  608.   nMap[i] = m_nsVertex;
  609.   mMap[m_nsVertex] = i;
  610.   m_nsVertex++;
  611.   }
  612.   m_sVertex = new Coord3[m_nsVertex];
  613.   for (i=0;i<m_nsVertex;i++)
  614.   {
  615.   VEC3_ASN_OP(m_sVertex[i],=,Vertex[mMap[i]]);
  616.   }
  617.   m_sTriangle = new Triangle[m_nsTriangle];
  618.   m_nsTriangle = 0;
  619.   for (i=0;i<m_nTriangle;i++)
  620.   if ((Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][1]])&&
  621.   (Vex_map[Mesh[i][0]]!=Vex_map[Mesh[i][2]])&&
  622.   (Vex_map[Mesh[i][1]]!=Vex_map[Mesh[i][2]]))
  623.   {
  624.   m_sTriangle[m_nsTriangle][0] = nMap[Vex_map[Mesh[i][0]]];
  625.   m_sTriangle[m_nsTriangle][1] = nMap[Vex_map[Mesh[i][1]]];
  626.   m_sTriangle[m_nsTriangle][2] = nMap[Vex_map[Mesh[i][2]]];
  627.   m_nsTriangle++;
  628.   }
  629. m_sVNormal = new Coord3[m_nsVertex];
  630. m_sTNormal = new Coord3[m_nsTriangle];
  631. for (i=0;i<m_nsVertex;i++)
  632. {
  633. VEC3_ZERO(m_sVNormal[i]);
  634. }
  635. for (i=0;i<m_nsTriangle;i++)
  636. {
  637. Coord3 vect[3];
  638. VEC3_V_OP_V(vect[0],m_sVertex[m_sTriangle[i][1]],-,m_sVertex[m_sTriangle[i][0]]);
  639. VEC3_V_OP_V(vect[1],m_sVertex[m_sTriangle[i][2]],-,m_sVertex[m_sTriangle[i][0]]);
  640. CROSSPROD3(vect[2],vect[0],vect[1]);
  641. V3Standarize(vect[2]);
  642. VEC3_ASN_OP(m_sTNormal[i],=,vect[2]);
  643. for (j=0;j<3;j++)
  644. {
  645. VEC3_V_OP_V(m_sVNormal[m_sTriangle[i][j]],m_sVNormal[m_sTriangle[i][j]],+,vect[2]);
  646. }
  647. }
  648. for (i=0;i<m_nsVertex;i++)
  649. V3Standarize(m_sVNormal[i]);
  650.   delete []Vex_map;
  651.   delete []Mesh;
  652.   delete []Vertex;
  653.   delete []mMap;
  654.   delete []nMap;
  655.   delete []bMark;
  656.    return m_nsTriangle;
  657. }
  658. void CMesh::cal_tri_Q(int Num_triangle,Triangle *mesh,Coord3 *vertex,Vector3 *tri_normal,Matrix4x4 *tri_Q)
  659. {
  660.   int i;
  661.   float tmp;
  662.   for (i=0;i<Num_triangle;i++) {
  663. tmp=-DOTPROD3(tri_normal[i],vertex[mesh[i][0]]);
  664. tri_Q[i][0][0]=tri_normal[i][0]*tri_normal[i][0];
  665. tri_Q[i][1][1]=tri_normal[i][1]*tri_normal[i][1];
  666. tri_Q[i][2][2]=tri_normal[i][2]*tri_normal[i][2];
  667. tri_Q[i][3][3]=tmp*tmp;
  668. tri_Q[i][0][1]=tri_Q[i][1][0]=tri_normal[i][0]*tri_normal[i][1];
  669. tri_Q[i][0][2]=tri_Q[i][2][0]=tri_normal[i][0]*tri_normal[i][2];
  670. tri_Q[i][0][3]=tri_Q[i][3][0]=tri_normal[i][0]*tmp;
  671. tri_Q[i][1][2]=tri_Q[i][2][1]=tri_normal[i][1]*tri_normal[i][2];
  672. tri_Q[i][1][3]=tri_Q[i][3][1]=tri_normal[i][1]*tmp;
  673. tri_Q[i][2][3]=tri_Q[i][3][2]=tri_normal[i][2]*tmp;
  674.   }
  675. }
  676. void CMesh::cal_vex_Q(int Num_vertex,BOOL *border,int **vex_tri,Triangle *mesh,Coord3 *vertex,Vector3 *tri_normal,Matrix4x4 *tri_Q,Matrix4x4 *vex_Q)
  677. {
  678.   int i,j,k,m,p;
  679.   Matrix4x4 tmp_Q;
  680.   float tmp;
  681.   Vector3 vect[2];
  682.   for (i=0;i<Num_vertex;i++) {
  683. for (j=0;j<4;j++)
  684. VEC4_ZERO(vex_Q[i][j]);
  685. for (j=1;j<=vex_tri[i][0];j++) {
  686. p=vex_tri[i][j];
  687. for (k=0;k<4;k++)
  688. VEC4_V_OP_V(vex_Q[i][k],vex_Q[i][k],+,tri_Q[p][k]);
  689. for (k=0;k<3;k++)
  690. if (mesh[p][k]==i)
  691. break;
  692. int a,b;
  693. if (mesh[p][k]>mesh[p][(k+2)%3])
  694. {
  695. a=mesh[p][k];
  696. b=mesh[p][(k+2)%3];
  697. }
  698. else
  699. {
  700. b=mesh[p][k];
  701. a=mesh[p][(k+2)%3];
  702. }
  703. if (border[a]&&border[b]) {
  704. VEC3_V_OP_V(vect[0],vertex[mesh[p][(k+2)%3]],-,vertex[i]);
  705. V3Standarize(vect[0]);
  706. CROSSPROD3(vect[1],vect[0],tri_normal[p]);
  707. V3Standarize(vect[1]);
  708. tmp=-DOTPROD3(vect[1],vertex[i]);
  709. tmp_Q[0][0]=vect[1][0]*vect[1][0];
  710. tmp_Q[1][1]=vect[1][1]*vect[1][1];
  711. tmp_Q[2][2]=vect[1][2]*vect[1][2];
  712. tmp_Q[3][3]=tmp*tmp;
  713. tmp_Q[0][1]=tmp_Q[1][0]=vect[1][0]*vect[1][1];
  714. tmp_Q[0][2]=tmp_Q[2][0]=vect[1][0]*vect[1][2];
  715. tmp_Q[0][3]=tmp_Q[3][0]=vect[1][0]*tmp;
  716. tmp_Q[1][2]=tmp_Q[2][1]=vect[1][1]*vect[1][2];
  717. tmp_Q[1][3]=tmp_Q[3][1]=vect[1][1]*tmp;
  718. tmp_Q[2][3]=tmp_Q[3][2]=vect[1][2]*tmp;
  719. for (m=0;m<4;m++)
  720. VEC4_V_OP_V(vex_Q[i][m],vex_Q[i][m],+,tmp_Q[m]);
  721. }
  722. if (mesh[p][k]>mesh[p][(k+1)%3])
  723. {
  724. a=mesh[p][k];
  725. b=mesh[p][(k+1)%3];
  726. }
  727. else
  728. {
  729. b=mesh[p][k];
  730. a=mesh[p][(k+1)%3];
  731. }
  732. if (border[a]&&border[b]) {
  733. VEC3_V_OP_V(vect[0],vertex[mesh[p][(k+1)%3]],-,vertex[i]);
  734. V3Standarize(vect[0]);
  735. CROSSPROD3(vect[1],vect[0],tri_normal[p]);
  736. V3Standarize(vect[1]);
  737. tmp=-DOTPROD3(vect[1],vertex[i]);
  738. tmp_Q[0][0]=vect[1][0]*vect[1][0];
  739. tmp_Q[1][1]=vect[1][1]*vect[1][1];
  740. tmp_Q[2][2]=vect[1][2]*vect[1][2];
  741. tmp_Q[3][3]=tmp*tmp;
  742. tmp_Q[0][1]=tmp_Q[1][0]=vect[1][0]*vect[1][1];
  743. tmp_Q[0][2]=tmp_Q[2][0]=vect[1][0]*vect[1][2];
  744. tmp_Q[0][3]=tmp_Q[3][0]=vect[1][0]*tmp;
  745. tmp_Q[1][2]=tmp_Q[2][1]=vect[1][1]*vect[1][2];
  746. tmp_Q[1][3]=tmp_Q[3][1]=vect[1][1]*tmp;
  747. tmp_Q[2][3]=tmp_Q[3][2]=vect[1][2]*tmp;
  748. for (m=0;m<4;m++)
  749. VEC4_V_OP_V(vex_Q[i][m],vex_Q[i][m],+,tmp_Q[m]);
  750. }
  751. }
  752.   }
  753. }
  754. void CMesh::pair_contract(int Num_vertex,BOOL *border,int **cad_pair,float **pair_cost,Coord3 **pair_pos,Matrix4x4 *vex_Q,Coord3 *vertex,int *vex_map,int require)
  755. {
  756.   int i,j,k,m,n,min_i,min_j;
  757.   float **tmp_Q;
  758.   float M3x3[3][3];
  759.   float vec_b[4];
  760.   int remain,deletenum;
  761.   float min_cost;
  762.   tmp_Q=(float **)malloc(4*sizeof(float *));
  763.   for (i=0;i<4;i++)
  764. tmp_Q[i]=(float *)malloc(4*Size_float);
  765.   for (i=0;i<Num_vertex;i++) {
  766. pair_cost[i]=(float *)malloc(cad_pair[i][0]*Size_float);
  767. pair_pos[i]=(Coord3 *)malloc(cad_pair[i][0]*Size_Coord3);
  768. for (k=1;k<=cad_pair[i][0];k++) {
  769. j=cad_pair[i][k];
  770. for (m=0;m<3;m++)
  771. VEC4_V_OP_V(tmp_Q[m],vex_Q[i][m],+,vex_Q[j][m]);
  772. tmp_Q[3][0]=tmp_Q[3][1]=tmp_Q[3][2]=0.0;
  773. tmp_Q[3][3]=1.0;
  774. vec_b[0]=vec_b[1]=vec_b[2]=0.0;
  775. vec_b[3]=1.0;
  776. for (m=0;m<3;m++)
  777. VEC3_ASN_OP(M3x3[m],=,tmp_Q[m]);
  778. if ((fabs(deta3(M3x3))>=0.01)&&(Gauss(4,tmp_Q,vec_b))) {
  779. VEC3_ASN_OP(pair_pos[i][k-1],=,vec_b);
  780. for (m=0;m<4;m++)
  781. VEC4_V_OP_V(tmp_Q[m],vex_Q[i][m],+,vex_Q[j][m]);
  782. pair_cost[i][k-1]=tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  783.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  784.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  785.                   2*tmp_Q[0][3]*vec_b[0]+
  786.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  787.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  788.                   2*tmp_Q[1][3]*vec_b[1]+
  789.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  790.                   2*tmp_Q[2][3]*vec_b[2]+
  791.   tmp_Q[3][3];
  792. }
  793. else {
  794. for (m=0;m<4;m++)
  795. VEC4_V_OP_V(tmp_Q[m],vex_Q[i][m],+,vex_Q[j][m]);
  796. VEC3_ASN_OP(vec_b,=,vertex[i]);
  797. VEC3_ASN_OP(pair_pos[i][k-1],=,vec_b);
  798. vec_b[3]=tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  799.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  800.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  801.                   2*tmp_Q[0][3]*vec_b[0]+
  802.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  803.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  804.                   2*tmp_Q[1][3]*vec_b[1]+
  805.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  806.                   2*tmp_Q[2][3]*vec_b[2]+
  807.   tmp_Q[3][3];
  808. min_cost=vec_b[3];
  809. VEC3_ASN_OP(vec_b,=,vertex[j]);
  810. vec_b[3]=tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  811.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  812.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  813.                   2*tmp_Q[0][3]*vec_b[0]+
  814.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  815.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  816.                   2*tmp_Q[1][3]*vec_b[1]+
  817.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  818.                   2*tmp_Q[2][3]*vec_b[2]+
  819.   tmp_Q[3][3];
  820. if (min_cost>vec_b[3]) {
  821. min_cost=vec_b[3];
  822. VEC3_ASN_OP(pair_pos[i][k-1],=,vec_b);
  823. }
  824. VEC3_V_OP_V(vec_b,vertex[i],+,vertex[j]);
  825. VEC3_V_OP_S(vec_b,vec_b,/,2.0f);
  826. vec_b[3]=tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  827.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  828.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  829.                   2*tmp_Q[0][3]*vec_b[0]+
  830.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  831.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  832.                   2*tmp_Q[1][3]*vec_b[1]+
  833.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  834.                   2*tmp_Q[2][3]*vec_b[2]+
  835.   tmp_Q[3][3];
  836. if (min_cost>vec_b[3]) {
  837. min_cost=vec_b[3];
  838. VEC3_ASN_OP(pair_pos[i][k-1],=,vec_b);
  839. }
  840. pair_cost[i][k-1]=min_cost;
  841. }
  842. }
  843.   }
  844.   // 99,6,1
  845.   int numEdge = 0;
  846.   Heap *heap;
  847.   Heapable *pair;
  848.   int **VexEdge;
  849.   //VexEdge = new int51[Num_vertex];
  850.   VexEdge = new Pint[Num_vertex];
  851.   for (i=0;i<Num_vertex;i++)
  852.   {
  853.   VexEdge[i] = (int *)malloc(51*sizeof(int));
  854.   VexEdge[i][0] = 0;
  855.   numEdge += cad_pair[i][0];
  856.   }
  857.   heap = new Heap(numEdge);
  858.   pair = new Heapable[numEdge];
  859.   k = 0;
  860.   for (i=0;i<Num_vertex;i++)
  861. for (j=1; j<=cad_pair[i][0]; j++)
  862. {
  863. pair[k].vert[0] = i;
  864. m = pair[k].vert[1] = cad_pair[i][j];
  865. pair[k].cost = -pair_cost[i][j-1];
  866. VEC3_ASN_OP(pair[k].newposition,=,pair_pos[i][j-1])
  867. heap->insert(&(pair[k]), pair[k].cost);
  868. if (!(pair[k].isInHeap()))
  869. break;
  870. n = VexEdge[i][0]+1;
  871. if (n>50)
  872. {
  873. VexEdge[i] = (int *)realloc(VexEdge[i],(n+50)*sizeof(int));
  874. }
  875. VexEdge[i][n] = k;
  876. VexEdge[i][0] = n;
  877. n = VexEdge[m][0]+1;
  878. if (n>50)
  879. {
  880. VexEdge[m] = (int *)realloc(VexEdge[m],(n+50)*sizeof(int));
  881. }
  882. VexEdge[m][n] = k;
  883. VexEdge[m][0] = n;
  884. k++;
  885. }
  886.   for (i=0;i<Num_vertex;i++)
  887.   {
  888.   if (pair_cost[i])
  889.   free(pair_cost[i]);
  890.   if (pair_pos[i])
  891.   free(pair_pos[i]);
  892.   if (cad_pair[i])
  893.   free(cad_pair[i]);
  894.   }
  895.   free(pair_cost);
  896.   free(pair_pos);
  897.   free(cad_pair);
  898.   // 99,6,1
  899.   deletenum=0;
  900.   remain=Num_vertex;  
  901.   int delEdge = 0;
  902.   
  903.   while (1) {
  904. heap_node *top;
  905. Heapable *dpair;
  906. top = heap->extract();
  907. if (!top)
  908. break;
  909. dpair = top->obj;
  910. min_i = dpair->vert[0];
  911. min_j = dpair->vert[1];
  912. if (border[min_i]&&border[min_j])
  913. deletenum ++;
  914. else
  915. deletenum +=2;
  916. border[min_i] = border[min_i]||border[min_j];
  917. VEC3_ASN_OP(vertex[min_i],=,dpair->newposition);
  918. VEC3_ASN_OP(vertex[min_j],=,dpair->newposition);
  919. vex_map[min_j]=min_i;
  920. delEdge++;
  921. for (i=1;i<=VexEdge[min_i][0];i++)
  922. {
  923. m = VexEdge[min_i][i];
  924. if ((pair[m].vert[0] == min_j)||(pair[m].vert[1] == min_j))
  925. {
  926. for (j=i; j<VexEdge[min_i][0]; j++)
  927. VexEdge[min_i][j] = VexEdge[min_i][j+1];
  928. VexEdge[min_i][0] = VexEdge[min_i][0]-1;
  929. break;
  930. }
  931. }
  932. for (i=1;i<=VexEdge[min_j][0];i++)
  933. {
  934. int p,q;
  935. m = VexEdge[min_j][i];
  936. if ((pair[m].vert[0] == min_i)||(pair[m].vert[1] == min_i))
  937. continue;
  938. if (pair[m].vert[0] == min_j)
  939. {
  940. pair[m].vert[0] = min_i;
  941. for (j=1;j<=VexEdge[min_i][0]; j++)
  942. {
  943. n = VexEdge[min_i][j];
  944. if (pair[n].vert[0] == pair[m].vert[1])
  945. {
  946. k = pair[n].vert[0];
  947. heap->kill(pair[m].getHeapPos());
  948. for (p=1; p<=VexEdge[k][0]; p++)
  949. {
  950. if (VexEdge[k][p] == m)
  951. {
  952. for (q=p; q<VexEdge[k][0]; q++)
  953. VexEdge[k][q]=VexEdge[k][q+1];
  954. VexEdge[k][0] = VexEdge[k][0]-1;
  955. break;
  956. }
  957. }
  958. break;
  959. }
  960. else if (pair[n].vert[1] == pair[m].vert[1])
  961. {
  962. k = pair[n].vert[1];
  963. heap->kill(pair[m].getHeapPos());
  964. for (p=1; p<=VexEdge[k][0]; p++)
  965. {
  966. if (VexEdge[k][p] == m)
  967. {
  968. for (q=p; q<VexEdge[k][0]; q++)
  969. VexEdge[k][q]=VexEdge[k][q+1];
  970. VexEdge[k][0] = VexEdge[k][0]-1;
  971. break;
  972. }
  973. }
  974. break;
  975. }
  976. }
  977. if (j>VexEdge[min_i][0])
  978. {
  979. if (j>50)
  980. {
  981. VexEdge[min_i] = (int *)realloc(VexEdge[min_i],(j+50)*sizeof(int));
  982. }
  983. VexEdge[min_i][0] = j;
  984. VexEdge[min_i][j] = m;
  985. }
  986. }
  987. else if (pair[m].vert[1] == min_j)
  988. {
  989. pair[m].vert[1] = min_i;
  990. for (j=1;j<=VexEdge[min_i][0]; j++)
  991. {
  992. n = VexEdge[min_i][j];
  993. if (pair[n].vert[0] == pair[m].vert[0])
  994. {
  995. k = pair[n].vert[0];
  996. heap->kill(pair[m].getHeapPos());
  997. for (p=1; p<=VexEdge[k][0]; p++)
  998. {
  999. if (VexEdge[k][p] == m)
  1000. {
  1001. for (q=p; q<VexEdge[k][0]; q++)
  1002. VexEdge[k][q]=VexEdge[k][q+1];
  1003. VexEdge[k][0] = VexEdge[k][0]-1;
  1004. break;
  1005. }
  1006. }
  1007. break;
  1008. }
  1009. else if (pair[n].vert[1] == pair[m].vert[0])
  1010. {
  1011. k = pair[n].vert[1];
  1012. heap->kill(pair[m].getHeapPos());
  1013. for (p=1; p<=VexEdge[k][0]; p++)
  1014. {
  1015. if (VexEdge[k][p] == m)
  1016. {
  1017. for (q=p; q<VexEdge[k][0]; q++)
  1018. VexEdge[k][q]=VexEdge[k][q+1];
  1019. VexEdge[k][0] = VexEdge[k][0]-1;
  1020. break;
  1021. }
  1022. }
  1023. break;
  1024. }
  1025. }
  1026. if (j>VexEdge[min_i][0])
  1027. {
  1028. if (j>50)
  1029. {
  1030. VexEdge[min_i] = (int *)realloc(VexEdge[min_i],(j+50)*sizeof(int));
  1031. }
  1032. VexEdge[min_i][0] = j;
  1033. VexEdge[min_i][j] = m;
  1034. }
  1035. }
  1036. }
  1037. for (i=0;i<4;i++)
  1038. VEC4_V_OP_V(vex_Q[min_i][i],vex_Q[min_i][i],+,vex_Q[min_j][i]);
  1039. for (i=1; i<=VexEdge[min_i][0];i++)
  1040. {
  1041. n = VexEdge[min_i][i];
  1042. j = pair[n].vert[0];
  1043. if (j == min_i )
  1044. j = pair[n].vert[1];
  1045. for (m=0;m<3;m++)
  1046. VEC4_V_OP_V(tmp_Q[m],vex_Q[min_i][m],+,vex_Q[j][m]);
  1047. tmp_Q[3][0]=tmp_Q[3][1]=tmp_Q[3][2]=0.0;
  1048. tmp_Q[3][3]=1.0;
  1049. vec_b[0]=vec_b[1]=vec_b[2]=0.0;
  1050. vec_b[3]=1.0;
  1051. for (m=0;m<3;m++)
  1052. VEC3_ASN_OP(M3x3[m],=,tmp_Q[m]);
  1053. if ((fabs(deta3(M3x3))>=0.01)&&(Gauss(4,tmp_Q,vec_b))) {
  1054. VEC3_ASN_OP(pair[n].newposition,=,vec_b);
  1055. for (m=0;m<4;m++)
  1056. VEC4_V_OP_V(tmp_Q[m],vex_Q[min_i][m],+,vex_Q[j][m]);
  1057. pair[n].cost  =   tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  1058.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  1059.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  1060.                   2*tmp_Q[0][3]*vec_b[0]+
  1061.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  1062.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  1063.                   2*tmp_Q[1][3]*vec_b[1]+
  1064.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  1065.                   2*tmp_Q[2][3]*vec_b[2]+
  1066.   tmp_Q[3][3];
  1067. }
  1068. else {
  1069. for (m=0;m<4;m++)
  1070. VEC4_V_OP_V(tmp_Q[m],vex_Q[min_i][m],+,vex_Q[j][m]);
  1071. VEC3_ASN_OP(vec_b,=,vertex[min_i]);
  1072. VEC3_ASN_OP(pair[n].newposition,=,vec_b);
  1073. vec_b[3]=tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  1074.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  1075.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  1076.                   2*tmp_Q[0][3]*vec_b[0]+
  1077.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  1078.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  1079.                   2*tmp_Q[1][3]*vec_b[1]+
  1080.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  1081.                   2*tmp_Q[2][3]*vec_b[2]+
  1082.   tmp_Q[3][3];
  1083. min_cost=vec_b[3];
  1084. VEC3_ASN_OP(vec_b,=,vertex[j]);
  1085. vec_b[3]=tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  1086.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  1087.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  1088.                   2*tmp_Q[0][3]*vec_b[0]+
  1089.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  1090.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  1091.                   2*tmp_Q[1][3]*vec_b[1]+
  1092.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  1093.                   2*tmp_Q[2][3]*vec_b[2]+
  1094.   tmp_Q[3][3];
  1095. if (min_cost>vec_b[3]) {
  1096. min_cost=vec_b[3];
  1097. VEC3_ASN_OP(pair[n].newposition,=,vec_b);
  1098. }
  1099. VEC3_V_OP_V(vec_b,vertex[min_i],+,vertex[j]);
  1100. VEC3_V_OP_S(vec_b,vec_b,/,2.0);
  1101. vec_b[3]=tmp_Q[0][0]*vec_b[0]*vec_b[0]+
  1102.                   2*tmp_Q[0][1]*vec_b[0]*vec_b[1]+
  1103.                   2*tmp_Q[0][2]*vec_b[0]*vec_b[2]+
  1104.                   2*tmp_Q[0][3]*vec_b[0]+
  1105.                   tmp_Q[1][1]*vec_b[1]*vec_b[1]+
  1106.                   2*tmp_Q[1][2]*vec_b[1]*vec_b[2]+
  1107.                   2*tmp_Q[1][3]*vec_b[1]+
  1108.                   tmp_Q[2][2]*vec_b[2]*vec_b[2]+
  1109.                   2*tmp_Q[2][3]*vec_b[2]+
  1110.   tmp_Q[3][3];
  1111. if (min_cost>vec_b[3]) {
  1112. min_cost=vec_b[3];
  1113. VEC3_ASN_OP(pair[n].newposition,=,vec_b);
  1114. }
  1115. pair[n].cost=min_cost;
  1116. }
  1117. pair[n].cost = -pair[n].cost;
  1118. heap->update(&(pair[n]),pair[n].cost);
  1119. }
  1120. if (m_pProgress)
  1121. m_pProgress->SetPos(deletenum);
  1122. if (deletenum >= require)
  1123. break;
  1124.   } /* while (1) */
  1125.   delete heap;
  1126.   delete []pair;
  1127.   for (i=0;i<Num_vertex;i++)
  1128.   {
  1129.   free(VexEdge[i]);
  1130.   }
  1131.   delete []VexEdge;
  1132.   for (i=0;i<4;i++)
  1133. free(tmp_Q[i]);
  1134.   free(tmp_Q);
  1135. }
  1136. void CMesh::V3Standarize(Vector3 v)
  1137. {
  1138. float len;
  1139. len=sqrt(DOTPROD3(v,v));
  1140. if (len!=0.0)
  1141. {
  1142. v[X]=v[X]/len;
  1143. v[Y]=v[Y]/len;
  1144. v[Z]=v[Z]/len;
  1145. }
  1146. }
  1147. float CMesh::deta3(float matrix[3][3])
  1148. {
  1149.   float deta;
  1150.   deta=matrix[0][0]*(matrix[1][1]*matrix[2][2]-matrix[1][2]*matrix[2][1])-
  1151.        matrix[0][1]*(matrix[1][0]*matrix[2][2]-matrix[1][2]*matrix[2][0])+
  1152.        matrix[0][2]*(matrix[1][0]*matrix[2][1]-matrix[1][1]*matrix[2][0]);
  1153.   return deta;
  1154. }
  1155. int CMesh::Gauss(int n,float **A,float *b)
  1156. {
  1157.   int *js,i,j,k,is;
  1158.   float d,t;
  1159.   js=(int *)malloc(n*sizeof(int));
  1160.   for (k=0;k<n;k++) {
  1161. d=0.0;
  1162. for (i=k;i<n;i++)
  1163. for (j=k;j<n;j++)
  1164. if (A[i][j]!=0.0) {
  1165. t=fabs(A[i][j]);
  1166. if (t>d) {
  1167. d=t;
  1168. js[k]=j;
  1169. is=i;
  1170. }
  1171. }
  1172. if (d+1.0==1.0) {
  1173. free(js);
  1174. return 0;
  1175. }
  1176. if (is!=k) {
  1177. for (j=k;j<n;j++) {
  1178. t=A[k][j];
  1179. A[k][j]=A[is][j];
  1180. A[is][j]=t;
  1181. }
  1182. t=b[k];
  1183. b[k]=b[is];
  1184. b[is]=t;
  1185. }
  1186. if (js[k]!=k)
  1187. for (i=0;i<n;i++) {
  1188. t=A[i][k];
  1189. A[i][k]=A[i][js[k]];
  1190. A[i][js[k]]=t;
  1191. }
  1192. t=A[k][k];
  1193. for (j=k+1;j<n;j++)
  1194. if (A[k][j]!=0.0)
  1195. A[k][j]/=t;
  1196. b[k]=b[k]/t;
  1197. for (j=k+1;j<n;j++)
  1198. if (A[k][j]!=0.0)
  1199. for (i=0;i<n;i++)
  1200. if ((i!=k)&&(A[i][k]!=0.0))
  1201. A[i][j]=A[i][j]-A[i][k]*A[k][j];
  1202. for (i=0;i<n;i++)
  1203. if ((i!=k)&&(A[i][k]!=0.0))
  1204. b[i]=b[i]-A[i][k]*b[k];
  1205.   }
  1206.   for (k=n-1;k>=0;k--)
  1207. if (k!=js[k]) {
  1208. t=b[k];
  1209. b[k]=b[js[k]];
  1210. b[js[k]]=t;
  1211. }
  1212.   free(js);
  1213.   return 1;
  1214. }