Wm4DelTetrahedron.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "Wm4FoundationPCH.h"
00018 #include "Wm4DelTetrahedron.h"
00019
00020 namespace Wm4
00021 {
00022
00023 template <class Real>
00024 DelTetrahedron<Real>::DelTetrahedron (int iV0, int iV1, int iV2, int iV3)
00025 {
00026 V[0] = iV0;
00027 V[1] = iV1;
00028 V[2] = iV2;
00029 V[3] = iV3;
00030 A[0] = 0;
00031 A[1] = 0;
00032 A[2] = 0;
00033 A[3] = 0;
00034 Time = -1;
00035 IsComponent = false;
00036 OnStack = false;
00037 }
00038
00039 template <class Real>
00040 bool DelTetrahedron<Real>::IsInsertionComponent (int i, DelTetrahedron* pkAdj,
00041 const Query3<Real>* pkQuery, const int* aiSupervertex)
00042 {
00043
00044
00045
00046
00047
00048 const int aaiIndex[4][3] = { {1,2,3}, {0,3,2}, {0,1,3}, {0,2,1} };
00049
00050 if (i != Time)
00051 {
00052 Time = i;
00053
00054
00055
00056 int iRelation = pkQuery->ToCircumsphere(i,V[0],V[1],V[2],V[3]);
00057 IsComponent = (iRelation <= 0 ? true : false);
00058 if (IsComponent)
00059 {
00060 return true;
00061 }
00062
00063
00064
00065
00066
00067 for (int j = 0; j < 4; j++)
00068 {
00069 for (int k = 0; k < 4; k++)
00070 {
00071 if (V[j] == aiSupervertex[k])
00072 {
00073
00074
00075
00076 int iNumInvisible = 0;
00077 for (k = 0; k < 4; k++)
00078 {
00079 if (A[k] != pkAdj)
00080 {
00081 int iV0 = V[aaiIndex[k][0]];
00082 int iV1 = V[aaiIndex[k][1]];
00083 int iV2 = V[aaiIndex[k][2]];
00084 iRelation = pkQuery->ToPlane(i,iV0,iV1,iV2);
00085 if (iRelation > 0)
00086 {
00087 iNumInvisible++;
00088 }
00089 }
00090 }
00091 IsComponent = (iNumInvisible == 0 ? true : false);
00092 return IsComponent;
00093 }
00094 }
00095 }
00096 }
00097
00098 return IsComponent;
00099 }
00100
00101 template <class Real>
00102 int DelTetrahedron<Real>::DetachFrom (int iAdj, DelTetrahedron* pkAdj)
00103 {
00104 assert(0 <= iAdj && iAdj < 4 && A[iAdj] == pkAdj);
00105 A[iAdj] = 0;
00106 for (int i = 0; i < 4; i++)
00107 {
00108 if (pkAdj->A[i] == this)
00109 {
00110 pkAdj->A[i] = 0;
00111 return i;
00112 }
00113 }
00114 return -1;
00115 }
00116
00117
00118
00119
00120
00121 template WM4_FOUNDATION_ITEM
00122 class DelTetrahedron<float>;
00123
00124 template WM4_FOUNDATION_ITEM
00125 class DelTetrahedron<double>;
00126
00127 }