80void Delaunay :: triangulate(
const std :: vector< FloatArray > &iVertices, std :: vector< Triangle > &oTriangles)
const
84 if ( iVertices.size() == 4 ) {
90 const double relTol2 = 1.0e-6;
92 std :: vector< double >dist_square = {
93 distance(iVertices [ 0 ], iVertices [ 1 ]),
94 distance(iVertices [ 0 ], iVertices [ 2 ]),
95 distance(iVertices [ 0 ], iVertices [ 3 ])
98 std :: sort( dist_square.begin(), dist_square.end() );
101 if ( fabs(dist_square [ 2 ] - dist_square [ 1 ] - dist_square [ 0 ]) < relTol2 * dist_square [ 2 ] ) {
104 double maxDist_square =
distance_square(iVertices [ 0 ], iVertices [ 1 ]);
108 if ( d2 > maxDist_square ) {
114 if ( d2b > maxDist_square ) {
115 maxDist_square = d2b;
120 int remainingInd1 = -1, remainingInd2 = -1;
122 switch ( maxDistInd ) {
143 Triangle tri1(iVertices [ 0 ], iVertices [ remainingInd1 ], iVertices [ maxDistInd ]);
148 oTriangles.push_back(tri1);
151 Triangle tri2(iVertices [ 0 ], iVertices [ remainingInd2 ], iVertices [ maxDistInd ]);
156 oTriangles.push_back(tri2);
163 int n = iVertices.size();
166 std :: vector< FloatArray >vertices(iVertices);
169 const double shift = 1.0e-12;
170 for (
int i = 1; i <= n; i++ ) {
171 vertices [ i - 1 ].at(1) += vertices [ i - 1 ].at(1) * shift * double ( rand() ) / RAND_MAX;
172 vertices [ i - 1 ].at(2) += vertices [ i - 1 ].at(2) * shift * double ( rand() ) / RAND_MAX;
175 for (
int i = 1; i <= n; i++ ) {
176 for (
int j = i + 1; j <= n; j++ ) {
177 for (
int k = j + 1; k <= n; k++ ) {
178 bool isTriangle =
true;
179 if (
colinear(vertices [ i - 1 ], vertices [ j - 1 ], vertices [ k - 1 ]) ) {
182 for (
int a = 1; a <= n; a++ ) {
183 if ( a != i && a != j && a != k ) {
185 if (
isInsideCC(vertices [ a - 1 ], vertices [ i - 1 ], vertices [ j - 1 ],
186 vertices [ k - 1 ]) ) {
196 Triangle tri(iVertices [ i - 1 ], iVertices [ j - 1 ], iVertices [ k - 1 ]);
201 oTriangles.push_back(tri);