Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}