40 bestTriangulation=NULL;
47 delete[] bestTriangulation;
48 bestTriangulation=NULL;
56 if(vertices.size()==3)
59 triangles[0].idx[0]=0;
60 triangles[0].idx[1]=1;
61 triangles[0].idx[2]=2;
64 else if(vertices.size()==4)
72 tIndex[0][0].
idx[0]=0;
73 tIndex[0][0].
idx[1]=1;
74 tIndex[0][0].
idx[2]=2;
75 tIndex[0][1].
idx[0]=2;
76 tIndex[0][1].
idx[1]=3;
77 tIndex[0][1].
idx[2]=0;
79 tIndex[1][0].
idx[0]=0;
80 tIndex[1][0].
idx[1]=1;
81 tIndex[1][0].
idx[2]=3;
82 tIndex[1][1].
idx[0]=3;
83 tIndex[1][1].
idx[1]=1;
84 tIndex[1][1].
idx[2]=2;
90 p1=vertices[tIndex[i][j].
idx[1]]-vertices[tIndex[i][j].
idx[0]];
91 p2=vertices[tIndex[i][j].
idx[2]]-vertices[tIndex[i][j].
idx[0]];
97 triangles[0]=tIndex[1][0];
98 triangles[1]=tIndex[1][1];
102 triangles[0]=tIndex[0][0];
103 triangles[1]=tIndex[0][1];
107 if(bestTriangulation)
108 delete[] bestTriangulation;
111 bestTriangulation=NULL;
113 size_t eCount=vertices.size();
114 bestTriangulation=
new Real[eCount*eCount];
115 midPoint=
new int[eCount*eCount];
116 for(
size_t i=0;i<eCount*eCount;i++)
117 bestTriangulation[i]=-1;
118 memset(midPoint,-1,
sizeof(
int)*eCount*eCount);
119 GetArea(0,1,vertices);
121 GetTriangulation(0,1,vertices,triangles);
123 template <
class Real>
126 if(bestTriangulation)
127 delete[] bestTriangulation;
130 bestTriangulation=NULL;
132 int eCount=vertices.size();
133 bestTriangulation=
new double[eCount*eCount];
134 midPoint=
new int[eCount*eCount];
135 for(
int i=0;i<eCount*eCount;i++)
136 bestTriangulation[i]=-1;
137 memset(midPoint,-1,
sizeof(
int)*eCount*eCount);
138 return GetArea(0,1,vertices);
144 size_t eCount=vertices.size();
150 ii=midPoint[i*eCount+j];
153 tIndex.
idx[0] = int( i );
154 tIndex.
idx[1] = int( j );
155 tIndex.
idx[2] = int( ii );
156 triangles.push_back(tIndex);
157 GetTriangulation(i,ii,vertices,triangles);
158 GetTriangulation(ii,j,vertices,triangles);
163 Real MinimalAreaTriangulation<Real>::GetArea(
const size_t& i,
const size_t& j,
const std::vector<Point3D<Real> >& vertices)
166 size_t eCount=vertices.size();
167 size_t idx=i*eCount+j;
173 bestTriangulation[idx]=0;
176 if(midPoint[idx]!=-1)
177 return bestTriangulation[idx];
179 for(
size_t r=j+1;r<ii;r++)
182 size_t idx1=i*eCount+rr,idx2=rr*eCount+j;
183 Point3D<Real> p,p1,p2;
184 p1=vertices[i]-vertices[rr];
185 p2=vertices[j]-vertices[rr];
188 if(bestTriangulation[idx1]>=0)
190 temp+=bestTriangulation[idx1];
193 if(bestTriangulation[idx2]>0)
194 temp+=bestTriangulation[idx2];
196 temp+=GetArea(rr,j,vertices);
200 if(bestTriangulation[idx2]>=0)
201 temp+=bestTriangulation[idx2];
203 temp+=GetArea(rr,j,vertices);
206 temp+=GetArea(i,rr,vertices);
215 bestTriangulation[idx]=a;