0
\$\begingroup\$

Following this question, I want to create a sphere from a tetrahedron using this Wolfram support. But so far the resulted sphere is bigger than it should be and center seems to have an offset.

Sphere Sphere::FromTetrahedron(const glm::vec3& p1, const glm::vec3& p2,
                                 const glm::vec3& p3, const glm::vec3& p4)
  {
    assert(AreEqual(p1, p2) == false);
    assert(AreEqual(p1, p3) == false);
    assert(AreEqual(p1, p4) == false);
    assert(AreEqual(p2, p3) == false);
    assert(AreEqual(p2, p4) == false);
    assert(AreEqual(p3, p4) == false);

    glm::mat4 matrix(1.0f);
    matrix = glm::row(matrix, 0, glm::vec4(p1.x, p2.x, p3.x, p4.x));
    matrix = glm::row(matrix, 1, glm::vec4(p1.y, p2.y, p3.y, p4.y));
    matrix = glm::row(matrix, 2, glm::vec4(p1.z, p2.z, p3.z, p4.z));
    matrix = glm::row(matrix, 3, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));

    // Function that assert if determinant is 0
    const float a = Determinant(matrix);

    glm::mat4 D = matrix;
    glm::vec3 center(0.0f);

    const glm::vec4 squares = {
      GetSquaredLength(p1),
      GetSquaredLength(p2),
      GetSquaredLength(p3),
      GetSquaredLength(p4),
    };

    D        = glm::row(D, 0, squares);
    center.x = glm::determinant(D);

    D        = glm::row(D, 1, glm::row(matrix, 0));
    center.y = - glm::determinant(D);

    D        = glm::row(D, 2, glm::row(matrix, 1));
    center.z = glm::determinant(D);

    center /= (2.0f * a);

    return Sphere(center, glm::distance(p1, center));
}
\$\endgroup\$
  • 1
    \$\begingroup\$ Can you try forming the triple-scalar product Dot(p4 - p1, Cross(p3 - p1, p2 - p1)) to check if your inputs might be coplanar (triple-scalar product = 0)? That would indicate a problem elsewhere in your algorithm. If that doesn't catch anything, can you try running this with four distinct non-coplanar vectors like (0, 0, 0), (3, 0, 0), (0, 5, 0), (0, 0, 7) and printing the matrix you get at each step? \$\endgroup\$ – DMGregory Aug 16 '18 at 15:07
  • \$\begingroup\$ Actually this implementation is correct. I think I was too tired last day and din't noticed a mistake somewhere else. However the triple scalar product helped me for my other question. \$\endgroup\$ – FloFu Aug 18 '18 at 13:25
  • \$\begingroup\$ Glad you got it solved, then! In that case, would it be appropriate to delete this question? Or is there still something we can help with here? \$\endgroup\$ – DMGregory Aug 18 '18 at 13:26

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged or ask your own question.