dgFloat64 dgConvexHull4dTetraherum::Evalue (const dgHullVector* const pointArray, const dgBigVector& point) const { const dgBigVector &p0 = pointArray[m_faces[0].m_index[0]]; const dgBigVector &p1 = pointArray[m_faces[0].m_index[1]]; const dgBigVector &p2 = pointArray[m_faces[0].m_index[2]]; const dgBigVector &p3 = pointArray[m_faces[0].m_index[3]]; dgFloat64 matrix[4][4]; for (dgInt32 i = 0; i < 4; i ++) { matrix[0][i] = p1[i] - p0[i]; matrix[1][i] = p2[i] - p0[i]; matrix[2][i] = p3[i] - p0[i]; matrix[3][i] = point[i] - p0[i]; } dgFloat64 error; dgFloat64 det = Determinant4x4 (matrix, &error); dgFloat64 precision = dgFloat64 (1.0f) / dgFloat64 (1<<24); dgFloat64 errbound = error * precision; if (fabs(det) > errbound) { return det; } dgGoogol exactMatrix[4][4]; for (dgInt32 i = 0; i < 4; i ++) { exactMatrix[0][i] = dgGoogol(p1[i]) - dgGoogol(p0[i]); exactMatrix[1][i] = dgGoogol(p2[i]) - dgGoogol(p0[i]); exactMatrix[2][i] = dgGoogol(p3[i]) - dgGoogol(p0[i]); exactMatrix[3][i] = dgGoogol(point[i]) - dgGoogol(p0[i]); } return Determinant4x4(exactMatrix); }
double dgConvexHull3DFace::Evalue (const dgBigVector* const pointArray, const dgBigVector& point) const { const dgBigVector& p0 = pointArray[m_index[0]]; const dgBigVector& p1 = pointArray[m_index[1]]; const dgBigVector& p2 = pointArray[m_index[2]]; double matrix[3][3]; for (int32_t i = 0; i < 3; i ++) { matrix[0][i] = p2[i] - p0[i]; matrix[1][i] = p1[i] - p0[i]; matrix[2][i] = point[i] - p0[i]; } double error; double det = Determinant3x3 (matrix, &error); double precision = double (1.0f) / double (1<<24); double errbound = error * precision; if (fabs(det) > errbound) { return det; } dgGoogol exactMatrix[3][3]; for (int32_t i = 0; i < 3; i ++) { exactMatrix[0][i] = dgGoogol(p2[i]) - dgGoogol(p0[i]); exactMatrix[1][i] = dgGoogol(p1[i]) - dgGoogol(p0[i]); exactMatrix[2][i] = dgGoogol(point[i]) - dgGoogol(p0[i]); } dgGoogol exactDet (Determinant3x3(exactMatrix)); det = exactDet.GetAproximateValue(); return det; }
dgBigVector dgConvexHull4dTetraherum::CircumSphereCenter (const dgHullVector* const pointArray) const { dgGoogol matrix[4][4]; dgBigVector points[4]; points[0] = pointArray[m_faces[0].m_index[0]]; points[1] = pointArray[m_faces[0].m_index[1]]; points[2] = pointArray[m_faces[0].m_index[2]]; points[3] = pointArray[m_faces[0].m_index[3]]; for (dgInt32 i = 0; i < 4; i ++) { for (dgInt32 j = 0; j < 3; j ++) { matrix[i][j] = dgGoogol (points[i][j]); } matrix[i][3] = dgGoogol (1.0f); } dgGoogol det (Determinant4x4(matrix)); dgFloat64 invDen = dgFloat64 (1.0f) / (dgFloat64(det) * dgFloat64 (2.0f)); dgBigVector centerOut; dgFloat64 sign = dgFloat64 (1.0f); for (dgInt32 k = 0; k < 3; k ++) { for (dgInt32 i = 0; i < 4; i ++) { matrix[i][0] = dgGoogol (points[i][3]); for (dgInt32 j = 0; j < 2; j ++) { dgInt32 j1 = (j < k) ? j : j + 1; matrix[i][j + 1] = dgGoogol (points[i][j1]); } matrix[i][3] = dgGoogol (1.0f); } dgGoogol det (Determinant4x4(matrix)); dgFloat64 val = dgFloat64 (det) * sign; sign *= dgFloat64 (-1.0f); centerOut[k] = val * invDen; } centerOut[3] = dgFloat32 (0.0f); return centerOut; }
//dgFloat64 dgDelaunayTetrahedralization::GetTetraVolume (const dgBigVector& p0, const dgBigVector& p1, const dgBigVector& p2, const dgBigVector& p3) const dgFloat64 dgDelaunayTetrahedralization::GetTetraVolume( const dgConvexHull4dTetraherum* const tetra) const { // dgBigVector p1p0 (p1.Sub4(p0)); // dgBigVector p2p0 (p2.Sub4(p0)); // dgBigVector p3p0 (p3.Sub4(p0)); // dgBigVector normal (p1p0.CrossProduct4 (p2p0, p3p0)); // dgFloat64 det = normal.m_w; const dgHullVector* const points = &m_points[0]; const dgBigVector &p0 = points[tetra->m_faces[0].m_index[0]]; const dgBigVector &p1 = points[tetra->m_faces[0].m_index[1]]; const dgBigVector &p2 = points[tetra->m_faces[0].m_index[2]]; const dgBigVector &p3 = points[tetra->m_faces[0].m_otherVertex]; dgFloat64 matrix[3][3]; for (dgInt32 i = 0; i < 3; i++) { matrix[0][i] = p2[i] - p0[i]; matrix[1][i] = p1[i] - p0[i]; matrix[2][i] = p3[i] - p0[i]; } dgFloat64 error; dgFloat64 det = Determinant3x3(matrix, &error); dgFloat64 precision = dgFloat64(1.0f) / dgFloat64(1 << 24); dgFloat64 errbound = error * precision; if (fabs(det) > errbound) { return det; } dgGoogol exactMatrix[3][3]; for (dgInt32 i = 0; i < 3; i++) { exactMatrix[0][i] = dgGoogol(p2[i]) - dgGoogol(p0[i]); exactMatrix[1][i] = dgGoogol(p1[i]) - dgGoogol(p0[i]); exactMatrix[2][i] = dgGoogol(p3[i]) - dgGoogol(p0[i]); } dgGoogol exactDet(Determinant3x3(exactMatrix)); det = exactDet.GetAproximateValue(); return det; }