Face3d.cpp
上传用户:hcfgz168
上传日期:2011-09-11
资源大小:116k
文件大小:20k
源码类别:

OpenGL

开发平台:

WINDOWS

  1. //********************************************
  2. // Face3d.cpp
  3. //********************************************
  4. // class CFace3d
  5. //********************************************
  6. // pierre.alliez@cnet.francetelecom.fr
  7. // Created : 10/12/97
  8. // Modified : 09/02/98
  9. //********************************************
  10. #include "stdafx.h"
  11. #include "Base3d.h"
  12. #include "Face3d.h"
  13. //////////////////////////////////////////////
  14. // CONSTRUCTORS
  15. //////////////////////////////////////////////
  16. //********************************************
  17. // Constructor
  18. //********************************************
  19. CFace3d::CFace3d()
  20. {
  21. for(int i=0;i<3;i++)
  22.   m_pFace[i] = NULL;
  23. for(i=0;i<6;i++)
  24.   m_pVertex[i] = NULL;
  25. m_Flag = 0;
  26. }
  27. //********************************************
  28. // Constructor
  29. //********************************************
  30. CFace3d::CFace3d(CVertex3d *pVertex1,
  31.  CVertex3d *pVertex2,
  32.  CVertex3d *pVertex3)
  33. {
  34. // Face
  35. for(int i=0;i<3;i++)
  36.   m_pFace[i] = NULL;
  37. // Vertices
  38. Set(pVertex1,pVertex2,pVertex3);
  39. for(i=3;i<6;i++)
  40.   m_pVertex[i] = NULL;
  41. // Normal
  42. m_Normal.Set(0.0f,0.0f,0.0f);
  43. m_Flag = 0;
  44. }
  45. //********************************************
  46. // Constructor
  47. //********************************************
  48. CFace3d::CFace3d(CFace3d *pFace)
  49. {
  50. Set(pFace);
  51. m_Flag = 0;
  52. }
  53. //////////////////////////////////////////////
  54. // DATAS
  55. //////////////////////////////////////////////
  56. //********************************************
  57. // Set
  58. //********************************************
  59. inline void CFace3d::Clear()
  60. {
  61. for(int i=0;i<3;i++)
  62.   m_pFace[i] = NULL;
  63. for(i=0;i<6;i++)
  64.   m_pVertex[i] = NULL;
  65. m_Flag = 0;
  66. }
  67. //********************************************
  68. // Equal
  69. //********************************************
  70. int CFace3d::Equal(CFace3d *pFace)
  71. {
  72. return (HasVertex(pFace->v1()) && 
  73.       HasVertex(pFace->v2()) &&
  74. HasVertex(pFace->v3()));
  75. }
  76. //********************************************
  77. // IsValid
  78. //********************************************
  79. int CFace3d::IsValid()
  80. {
  81. int success = 1;
  82. success &= (m_pFace[0] != this);
  83. success &= (m_pFace[1] != this);
  84. success &= (m_pFace[2] != this);
  85. // Different neighbors, if there are
  86. success &= ((m_pFace[0] != m_pFace[1]) || (m_pFace[0] == NULL));
  87. success &= ((m_pFace[0] != m_pFace[2]) || (m_pFace[0] == NULL));
  88. success &= ((m_pFace[1] != m_pFace[2]) || (m_pFace[1] == NULL));
  89. #ifdef _DEBUG
  90. if(!success)
  91. {
  92. TRACE("Face [%x] has the same neighborsn",this);
  93. }
  94. #endif
  95. // Different vertices
  96. success &= (m_pVertex[0] != m_pVertex[1]);
  97. success &= (m_pVertex[1] != m_pVertex[2]);
  98. success &= (m_pVertex[0] != m_pVertex[2]);
  99. /*
  100. #ifdef _DEBUG
  101. if(NbFaceNeighbor() != 3)
  102. {
  103. TRACE("Face [%x] has %d neighborsn",NbFaceNeighbor());
  104. }
  105. #endif
  106. */
  107. #ifdef _DEBUG
  108. if(!success)
  109. {
  110. TRACE("Face [%x] has the same vertices n",this);
  111. }
  112. #endif
  113. // Reciproc. neighboring
  114. for(int i=0;i<3;i++)
  115. {
  116. CFace3d *pFace = f(i);
  117. if(pFace != NULL)
  118. {
  119. if(!pFace->HasNeighbor(this))
  120. {
  121. TRACE("Face [%x] has invalid reciproc. neighboring n",this);
  122. success = 0;
  123. }
  124. }
  125. }
  126. return success;
  127. }
  128. //********************************************
  129. // Set
  130. //********************************************
  131. inline void CFace3d::Set(CVertex3d *pVertex1,
  132.  CVertex3d *pVertex2,
  133.  CVertex3d *pVertex3)
  134. {
  135. m_pVertex[0] = pVertex1;
  136. m_pVertex[1] = pVertex2;
  137. m_pVertex[2] = pVertex3;
  138. }
  139. //********************************************
  140. // Set
  141. //********************************************
  142. inline void CFace3d::Set(CFace3d *pFace1,
  143.  CFace3d *pFace2,
  144.  CFace3d *pFace3)
  145. {
  146. m_pFace[0] = pFace1;
  147. m_pFace[1] = pFace2;
  148. m_pFace[2] = pFace3;
  149. }
  150. //********************************************
  151. // Set
  152. //********************************************
  153. inline void CFace3d::Set(CVertex3d *pVertex1,
  154.  CVertex3d *pVertex2,
  155.  CVertex3d *pVertex3,
  156.  CFace3d *pFace1,
  157.  CFace3d *pFace2,
  158.  CFace3d *pFace3)
  159. {
  160. m_pVertex[0] = pVertex1;
  161. m_pVertex[1] = pVertex2;
  162. m_pVertex[2] = pVertex3;
  163. m_pFace[0] = pFace1;
  164. m_pFace[1] = pFace2;
  165. m_pFace[2] = pFace3;
  166. }
  167. //********************************************
  168. // Set
  169. //********************************************
  170. inline void CFace3d::Set(CFace3d *pFace)
  171. {
  172. Set(pFace->v1(),pFace->v2(),pFace->v3());
  173. Set(pFace->f1(),pFace->f2(),pFace->f3());
  174. }
  175. //********************************************
  176. // SetFlagOnVerticesIfDiff
  177. //********************************************
  178. void CFace3d::SetFlagOnVerticesIfDiff(int FlagDiff,
  179. int flag)
  180. {
  181. for(int i=0;i<3;i++)
  182. {
  183. CVertex3d *pVertex = v(i);
  184. if(pVertex->GetFlag() != FlagDiff)
  185. pVertex->SetFlag(flag);
  186. }
  187. }
  188. //********************************************
  189. // IndexFrom
  190. //********************************************
  191. int CFace3d::IndexFrom(CVertex3d *pVertex)
  192. {
  193. ASSERT(HasVertex(pVertex));
  194. for(int i=0;i<3;i++)
  195. if(m_pVertex[i]==pVertex)
  196. return i;
  197. return 0;
  198. }
  199. //********************************************
  200. // GetCenter
  201. // Allocate on the heap
  202. //********************************************
  203. CVertex3d* CFace3d::GetCenter(void)
  204. {
  205. CVertex3d* pVertex = new CVertex3d;
  206. pVertex->x((m_pVertex[0]->x()+m_pVertex[1]->x()+m_pVertex[2]->x())/3.0f);
  207. pVertex->y((m_pVertex[0]->y()+m_pVertex[1]->y()+m_pVertex[2]->y())/3.0f);
  208. pVertex->z((m_pVertex[0]->z()+m_pVertex[1]->z()+m_pVertex[2]->z())/3.0f);
  209. return pVertex;
  210. }
  211. //********************************************
  212. // FindNearestVertex
  213. //********************************************
  214. CVertex3d *CFace3d::FindNearestVertex(CVertex3d *pVertex)
  215. {
  216. CVertex3d *pV = v(0);
  217. double MinDistance = DistanceSquare(pVertex,v(0));
  218. for(int i=1;i<3;i++)
  219. {
  220. double tmp = DistanceSquare(pVertex,v(i));
  221. if(tmp < MinDistance)
  222. {
  223. MinDistance = tmp;
  224. pV = v(i);
  225. }
  226. }
  227. return pV;
  228. }
  229. //********************************************
  230. // ColorSharpEdge
  231. //********************************************
  232. void CFace3d::ColorSharpEdge(double threshold,
  233.  CColor &color)
  234. {
  235. for(int i=0;i<3;i++)
  236. if(SinAngle(this,f(i)) >= threshold)
  237. {
  238. v(i)->SetColor(color);
  239. v((i+1)%3)->SetColor(color);
  240. }
  241. }
  242. //********************************************
  243. // ColorSharpEdge
  244. //********************************************
  245. int CFace3d::GetSharpEdge(double threshold,
  246. int *SharpEdge)
  247. {
  248. int success = 0;
  249. for(int i=0;i<3;i++)
  250. if(f(i) != NULL)
  251. if(SinAngle(this,f(i)) >= threshold)
  252. {
  253. SharpEdge[i]=1;
  254. success = 1;
  255. }
  256. return success;
  257. }
  258. //********************************************
  259. // HasSharpEdge
  260. //********************************************
  261. int CFace3d::HasSharpEdge(double threshold)
  262. {
  263. for(int i=0;i<3;i++)
  264. {
  265. double sinus = SinAngle(this,f(i));
  266. //TRACE("SinAngle : %gn",sinus);
  267. if(sinus >= threshold)
  268. return 1;
  269. }
  270. return 0;
  271. }
  272. //////////////////////////////////////////////
  273. // DATA ACCESS
  274. //////////////////////////////////////////////
  275. //********************************************
  276. // GetType
  277. //********************************************
  278. int CFace3d::GetType()
  279. {
  280. return TYPE_FACE3D;
  281. }
  282. //********************************************
  283. // NbVertex
  284. //********************************************
  285. int CFace3d::NbVertex()
  286. {
  287. int NbVertex = 0;
  288. for(int i=0;i<6;i++)
  289.   NbVertex += (m_pVertex[i] != NULL);
  290. return NbVertex;
  291. }
  292. //********************************************
  293. // NbFaceNeighbor
  294. //********************************************
  295. int CFace3d::NbFaceNeighbor()
  296. {
  297. int NbFace = 0;
  298. NbFace += (m_pFace[0] != NULL);
  299. NbFace += (m_pFace[1] != NULL);
  300. NbFace += (m_pFace[2] != NULL);
  301. return NbFace;
  302. }
  303. //////////////////////////////////////////////
  304. // PROCESSING
  305. //////////////////////////////////////////////
  306. //********************************************
  307. // CalculateNormal
  308. //********************************************
  309. void CFace3d::CalculateNormal()
  310. {
  311. CVector3d u(m_pVertex[0],m_pVertex[1]);
  312. CVector3d v(m_pVertex[0],m_pVertex[2]);
  313. u.Inner(v);
  314. m_Normal.Set(u);
  315. m_Normal.NormalizeL2();
  316. }
  317. //////////////////////////////////////////////
  318. // MISC
  319. //////////////////////////////////////////////
  320. //********************************************
  321. // HasVertex
  322. //********************************************
  323. int CFace3d::HasVertex(CVertex3d *pVertex)
  324. {
  325. return (m_pVertex[0] == pVertex ||
  326.       m_pVertex[1] == pVertex ||
  327.       m_pVertex[2] == pVertex);
  328. }
  329. //********************************************
  330. // HasVertexWithFlag
  331. //********************************************
  332. int CFace3d::HasVertexWithFlag(int flag)
  333. {
  334. return (m_pVertex[0]->GetFlag() == flag ||
  335.       m_pVertex[1]->GetFlag() == flag ||
  336.       m_pVertex[2]->GetFlag() == flag);
  337. }
  338. //********************************************
  339. // HasVertex
  340. //********************************************
  341. int CFace3d::HasVertex(CVertex3d *pVertex,
  342.  int *index)
  343. {
  344. for(int i=0;i<3;i++)
  345. if(m_pVertex[i] == pVertex)
  346. {
  347. *index = i;
  348. return 1;
  349. }
  350. return 0;
  351. }
  352. //********************************************
  353. // HasVertex
  354. //********************************************
  355. int CFace3d::HasNeighbor(CFace3d *pFace)
  356. {
  357. return (m_pFace[0] == pFace ||
  358.       m_pFace[1] == pFace ||
  359.       m_pFace[2] == pFace);
  360. }
  361. //********************************************
  362. // HasVertex
  363. //********************************************
  364. int CFace3d::HasNeighbor(CFace3d *pFace,
  365.  int *index)
  366. {
  367. for(int i=0;i<3;i++)
  368. if(m_pFace[i] == pFace)
  369. {
  370. *index = i;
  371. return 1;
  372. }
  373. return 0;
  374. }
  375. //********************************************
  376. // GetNeighborExclusive
  377. // Get neighboring face wich has pVertexHas
  378. // and has not pVertexHasNot
  379. //********************************************
  380. CFace3d *CFace3d::GetNeighborExclusive(CVertex3d *pVertexHas,
  381.  CVertex3d *pVertexHasNot)
  382. {
  383. for(int i=0;i<3;i++)
  384. {
  385. CFace3d *pFace = f(i);
  386. if(pFace != NULL)
  387. if(pFace->HasVertex(pVertexHas) && 
  388. !pFace->HasVertex(pVertexHasNot))
  389. return pFace;
  390. }
  391. return NULL;
  392. }
  393. //********************************************
  394. // GetVertexExclusive
  395. //********************************************
  396. CVertex3d *CFace3d::GetVertexExclusive(CVertex3d *pV0,
  397.  CVertex3d *pV1)
  398. {
  399. for(int i=0;i<3;i++)
  400. if(v(i) != pV0 && v(i) != pV1)
  401. return v(i);
  402. return NULL;
  403. }
  404. //********************************************
  405. // GetVertexExclusive
  406. // Return vertex common to this and pFace,
  407. // but pV
  408. //********************************************
  409. CVertex3d *CFace3d::GetVertexExclusive(CVertex3d *pV,
  410.  CFace3d *pFace)
  411. {
  412. for(int i=0;i<3;i++)
  413. if(v(i) != pV && pFace->HasVertex(v(i)))
  414. return v(i);
  415. return NULL;
  416. }
  417. //********************************************
  418. // GetFaceNeighborExclusive
  419. //********************************************
  420. CFace3d *CFace3d::GetFaceNeighborExclusive(CFace3d *pF0,
  421.  CFace3d *pF1)
  422. {
  423. for(int i=0;i<3;i++)
  424. if(f(i) != pF0 && f(i) != pF1)
  425. return f(i);
  426. return NULL;
  427. }
  428. //********************************************
  429. // GetVertexFaceNeighborExclusive
  430. // Get vertex on neighboring face, which is not 
  431. // on "this".
  432. // index : neighboring face
  433. //********************************************
  434. CVertex3d *CFace3d::GetVertexFaceNeighborExclusive(unsigned int index)
  435. {
  436. CFace3d *pFace = m_pFace[index%3];
  437. for(int i=0;i<3;i++)
  438. if(!this->HasVertex(pFace->v(i)))
  439. return pFace->v(i);
  440. return NULL;
  441. }
  442. //********************************************
  443. // JointNeighbor
  444. //********************************************
  445. int CFace3d::JointNeighbor(CFace3d **pFace0,
  446.  CFace3d **pFace1)
  447. {
  448. ASSERT(NbFaceNeighbor()==2);
  449. if(NbFaceNeighbor()!=2)
  450. return 0;
  451. // Find 2 neighbors
  452. CFace3d *pFaceNeighbor[2];
  453. int k=0;
  454. for(int i=0;i<3;i++)
  455. {
  456. if(m_pFace[i] != NULL)
  457. pFaceNeighbor[k++] = m_pFace[i];
  458. }
  459. ASSERT(k==2);
  460. if(k!=2)
  461. return 0;
  462. ASSERT(pFaceNeighbor[0]->HasNeighbor(this));
  463. ASSERT(pFaceNeighbor[1]->HasNeighbor(this));
  464. ASSERT(pFaceNeighbor[0] != this);
  465. ASSERT(pFaceNeighbor[1] != this);
  466. *pFace0 = pFaceNeighbor[0];
  467. *pFace1 = pFaceNeighbor[1];
  468. pFaceNeighbor[0]->UpdateNeighbor(this,pFaceNeighbor[1]);
  469. pFaceNeighbor[1]->UpdateNeighbor(this,pFaceNeighbor[0]);
  470. return 1;
  471. }
  472. //********************************************
  473. // UpdateVertex
  474. //********************************************
  475. int CFace3d::UpdateVertex(CVertex3d *pOld,
  476. CVertex3d *pNew)
  477. {
  478. int index;
  479. if(HasVertex(pOld,&index))
  480. {
  481. v(index,pNew);
  482. CalculateNormal(); // Update normal
  483. return 1;
  484. }
  485. return 0;
  486. }
  487. //********************************************
  488. // UpdateNeighbor
  489. //********************************************
  490. int CFace3d::UpdateNeighbor(CFace3d *pOld,
  491.   CFace3d *pNew)
  492. {
  493. int index;
  494. if(HasNeighbor(pOld,&index))
  495. {
  496. f(index,pNew);
  497. return 1;
  498. }
  499. return 0;
  500. }
  501. //********************************************
  502. // Share2Vertex (exactly)
  503. //********************************************
  504. int CFace3d::Share2Vertex(CFace3d *pFace)
  505. {
  506. if(pFace == NULL)
  507. return 0;
  508. int NbSharedVertex = 0;
  509. for(int i=0;i<3;i++)
  510. for(int j=0;j<3;j++)
  511. NbSharedVertex += (pFace->v(i) == m_pVertex[j]);
  512. return (NbSharedVertex == 2);
  513. }
  514. //********************************************
  515. // Share2Vertex (exactly)
  516. // Get sharing edge index info
  517. //********************************************
  518. int CFace3d::Share2Vertex(CFace3d *pFace,
  519.  int *IndexEdgeThis,
  520.  int *IndexEdgeOther)
  521. {
  522. if(!Share2Vertex(pFace))
  523. return 0;
  524. int IndexThis[3] = {0,0,0};
  525. int IndexOther[3] = {0,0,0};
  526. for(int i=0;i<3;i++)
  527. for(int j=0;j<3;j++)
  528. if(pFace->v(i) == m_pVertex[j]) 
  529. IndexThis[j] = 1;
  530. IndexOther[i] = 1; 
  531. }
  532. // Set IndexEdges
  533. *IndexEdgeThis = (IndexThis[0] && IndexThis[1]) ? 0 : (IndexThis[1] && IndexThis[2]) ? 1 : 2;
  534. *IndexEdgeOther = (IndexOther[0] && IndexOther[1]) ? 0 : (IndexOther[1] && IndexOther[2]) ? 1 : 2;
  535. // ** DEBUG **
  536. if(*IndexEdgeThis == 2)
  537. {
  538. ASSERT(IndexThis[0] && IndexThis[2]);
  539. }
  540. if(*IndexEdgeOther == 2)
  541. {
  542. ASSERT(IndexOther[0] && IndexOther[2]);
  543. }
  544. return 1;
  545. }
  546. //********************************************
  547. // Share2Vertex (exactly)
  548. // Get sharing edge index info
  549. //********************************************
  550. int CFace3d::Share2Vertex(CFace3d *pFace,
  551.  CVertex3d **pSharedV1,
  552.  CVertex3d **pSharedV2)
  553. {
  554. int EdgeThis;
  555. int EdgeOther;
  556. if(!Share2Vertex(pFace))
  557. {
  558. *pSharedV1 = NULL;
  559. *pSharedV2 = NULL;
  560. return 0;
  561. }
  562. Share2Vertex(pFace,&EdgeThis,&EdgeOther);
  563. *pSharedV1 = v(EdgeThis);
  564. *pSharedV2 = v((EdgeThis+1)%3);
  565. return 1;
  566. }
  567. //********************************************
  568. // Share1Vertex (exactly)
  569. //********************************************
  570. int CFace3d::Share1Vertex(CFace3d *pFace)
  571. {
  572. int NbSharedVertex = 0;
  573. for(int i=0;i<3;i++)
  574. for(int j=0;j<3;j++)
  575. NbSharedVertex += (pFace->v(i) == m_pVertex[j]);
  576. return (NbSharedVertex == 1);
  577. }
  578. //********************************************
  579. // UpdateVertexRecursive
  580. //********************************************
  581. int CFace3d::UpdateVertexRecursive(CVertex3d *pVertexOld,
  582.  CVertex3d *pVertexNew)
  583. {
  584. if(pVertexOld == pVertexNew)
  585. return 0;
  586. //TRACE("Update vertex %x in face %xn",pVertexOld,this);
  587. this->UpdateVertex(pVertexOld,pVertexNew);
  588. for(int i=0;i<3;i++)
  589. {
  590. CFace3d *pFace = f(i);
  591. if(pFace != NULL)
  592. if(pFace->HasVertex(pVertexOld))
  593. pFace->UpdateVertexRecursive(pVertexOld,pVertexNew);
  594. }
  595. return 1;
  596. }
  597. //********************************************
  598. // BuildArrayNeighbor
  599. //********************************************
  600. int CFace3d::BuildArrayNeighbor(CArray3d<CFace3d> *pArrayFace,
  601. int depth)
  602. {
  603. // Remove all
  604. pArrayFace->SetSize(0);
  605. pArrayFace->Add(this);
  606. for(int i=0;i<3;i++)
  607. {
  608. CVertex3d *pVertex = v(i);
  609. int NbFaceNeighbor = pVertex->NbFaceNeighbor();
  610. for(int j=0;j<NbFaceNeighbor;j++)
  611. {
  612. CFace3d *pFace = pVertex->GetFaceNeighbor(j);
  613. if(pFace != this) // it's done
  614. if(!pArrayFace->Has(pFace))
  615. pArrayFace->Add(pFace);
  616. }
  617. }
  618. return 1;
  619. }
  620. //////////////////////////////////////////////
  621. // DEBUG
  622. //////////////////////////////////////////////
  623. //********************************************
  624. // Trace
  625. //********************************************
  626. void CFace3d::Trace()
  627. {
  628. TRACE("n");
  629. TRACE("Face %xn",this);
  630. TRACE("Vertex   : %dn",NbVertex());
  631. TRACE("Face (n) : %dn",NbFaceNeighbor());
  632. TRACE("Normal   : %sn",(m_Normal.GetNormL2Square()==0) ? "no" : "yes");
  633. TRACE("Vertices : (%g,%g,%g) (%g,%g,%g) (%g,%g,%g) n",
  634. m_pVertex[0]->x(),m_pVertex[0]->y(),m_pVertex[0]->z(),
  635. m_pVertex[1]->x(),m_pVertex[1]->y(),m_pVertex[1]->z(),
  636. m_pVertex[2]->x(),m_pVertex[2]->y(),m_pVertex[2]->z());
  637. TRACE("Normal   : (%g,%g,%g)n",m_Normal.x(),m_Normal.y(),m_Normal.z());
  638. // ** DEBUG **
  639. /*
  640. for(int i=0;i<3;i++)
  641. m_pVertex[i]->Trace();
  642. */
  643. }
  644. //////////////////////////////////////////////
  645. // OPENGL
  646. //////////////////////////////////////////////
  647. //********************************************
  648. // glDraw
  649. // Highlights face and its neighbors
  650. //********************************************
  651. void CFace3d::glDraw(unsigned char *ColorFace,
  652.  CMesh3d *pMesh /* = NULL */,
  653.  unsigned char *ColorNeightbor /* = NULL */)
  654. {
  655. // Transform
  656. if(pMesh != NULL)
  657. {
  658. CTransform *pTransform = pMesh->GetTransform();
  659. ::glPushMatrix();
  660. // Position / translation / scaling
  661. glTranslatef(pTransform->GetTranslation()->x(),
  662.  pTransform->GetTranslation()->y(),
  663.  pTransform->GetTranslation()->z());
  664. glScalef(pTransform->GetScale()->x(),
  665.  pTransform->GetScale()->y(),
  666.  pTransform->GetScale()->z());
  667. glRotatef(pTransform->GetValueRotation(),
  668. pTransform->GetRotation()->x(),
  669. pTransform->GetRotation()->y(),
  670. pTransform->GetRotation()->z());
  671. }
  672. // Neighbor
  673. if(ColorNeightbor != NULL)
  674. {
  675. glColor3ub(ColorNeightbor[0],ColorNeightbor[1],ColorNeightbor[2]);
  676. for(int k=0;k<3;k++)
  677. {
  678. CFace3d *pFace = f(k);
  679. if(pFace != NULL)
  680. {
  681. ::glBegin(GL_POLYGON);
  682. ::glVertex3f(pFace->v1()->x(),pFace->v1()->y(),pFace->v1()->z());
  683. ::glVertex3f(pFace->v2()->x(),pFace->v2()->y(),pFace->v2()->z());
  684. ::glVertex3f(pFace->v3()->x(),pFace->v3()->y(),pFace->v3()->z());
  685. ::glEnd();
  686. }
  687. }
  688. }
  689. // Main face
  690. glColor3ub(ColorFace[0],ColorFace[1],ColorFace[2]);
  691. ::glBegin(GL_POLYGON);
  692. for(int i=0;i<3;i++)
  693. ::glVertex3f(m_pVertex[i]->x(),m_pVertex[i]->y(),m_pVertex[i]->z());
  694. ::glEnd();
  695. if(pMesh != NULL)
  696. {
  697. ::glPopMatrix();
  698. }
  699. }
  700. //********************************************
  701. // Area
  702. //********************************************
  703. double CFace3d::Area()
  704. {
  705. return ::Area(m_pVertex[0],m_pVertex[1],m_pVertex[2]);
  706. }
  707. //********************************************
  708. // Perimeter
  709. //********************************************
  710. double CFace3d::Perimeter()
  711. {
  712. return (::Distance(m_pVertex[0],m_pVertex[1]) + 
  713.       ::Distance(m_pVertex[1],m_pVertex[2]) +
  714. ::Distance(m_pVertex[2],m_pVertex[0]));
  715. }
  716. //********************************************
  717. // Compacity
  718. //********************************************
  719. double CFace3d::Compacity()
  720. {
  721. double perimeter = Perimeter();
  722. if(perimeter == 0.0f)
  723. {
  724. TRACE("CFace3d::Compacity : null trianglen");
  725. return 0.0;
  726. }
  727. return (4.0*PI*Area()/(perimeter*perimeter));
  728. }
  729. // ** EOF **