<div dir="ltr">"""<br>Euler volume, modified by Gerald de Jong<br><a href="http://www.grunch.net/synergetics/quadvols.html">http://www.grunch.net/synergetics/quadvols.html</a><br>Kirby Urner (c) MIT License<br>
"""<br>from math import sqrt, hypot<br><br>class Tetrahedron:<br>    """<br>    Takes six edges of tetrahedron with faces<br>    (a,b,d)(b,c,e)(c,a,f)(d,e,f) -- returns volume<br>    if ivm and xyz<br>
    """<br><br>    def __init__(self, a,b,c,d,e,f):<br>        self.a, self.a2 = a, a**2<br>        self.b, self.b2 = b, b**2<br>        self.c, self.c2 = c, c**2<br>        self.d, self.d2 = d, d**2<br>        self.e, self.e2 = e, e**2<br>
        self.f, self.f2 = f, f**2<br><br>    def ivm_volume(self):<br>        ivmvol = ((self._addopen()- self._addclosed() - self._addopposite())/2) ** 0.5<br>        return round(ivmvol,5)<br><br>    def xyz_volume(self):<br>
        ivmvol = sqrt(8/9) * self.ivm_volume()<br>        return round(ivmvol,5)<br><br>    def _addopen(self):<br>        a2,b2,c2,d2,e2,f2 = self.a2, self.b2, self.c2, self.d2, self.e2, self.f2<br>        sumval = f2*a2*b2<br>
        sumval +=  d2 * a2 * c2<br>        sumval +=  a2 * b2 * e2<br>        sumval +=  c2 * b2 * d2<br>        sumval +=  e2 * c2 * a2<br>        sumval +=  f2 * c2 * b2<br>        sumval +=  e2 * d2 * a2<br>        sumval +=  b2 * d2 * f2<br>
        sumval +=  b2 * e2 * f2<br>        sumval +=  d2 * e2 * c2<br>        sumval +=  a2 * f2 * e2<br>        sumval +=  d2 * f2 * c2<br>        return sumval<br><br>    def _addclosed(self):<br>        a2,b2,c2,d2,e2,f2 = self.a2, self.b2, self.c2, self.d2, self.e2, self.f2<br>
        sumval =   a2 * b2 * d2<br>        sumval +=  d2 * e2 * f2<br>        sumval +=  b2 * c2 * e2<br>        sumval +=  a2 * c2 * f2<br>        return sumval<br><br>    def _addopposite(self):<br>        a2,b2,c2,d2,e2,f2 = self.a2, self.b2, self.c2, self.d2, self.e2, self.f2<br>
        sumval =  a2 * e2 * (a2 + e2)<br>        sumval += b2 * f2 * (b2 + f2)<br>        sumval += c2 * d2 * (c2 + d2)<br>        return sumval<br><br><br>PHI = sqrt(5)/2 + 0.5<br><br>R =0.5<br>D =1.0<br><br>import unittest<br>
class Test_Tetrahedron(unittest.TestCase):<br><br>    def test_unit_volume(self):<br>        tet = Tetrahedron(D, D, D, D, D, D)<br>        self.assertAlmostEqual(tet.ivm_volume(), 1.0, "Volume not 1")<br><br>    def test_unit_volume(self):<br>
        tet = Tetrahedron(R, R, R, R, R, R)<br>        self.assertAlmostEqual(tet.xyz_volume(), 0.11785, "Volume not 1")<br><br>    def test_phi_edge_tetra(self):<br>        tet = Tetrahedron(D, D, D, D, D, PHI)<br>
        self.assertAlmostEqual(tet.ivm_volume(), 0.70711)<br><br>    def test_right_tetra(self):<br>        e = hypot(sqrt(3)/2, sqrt(3)/2)  # right tetrahedron<br>        tet = Tetrahedron(D, D, D, D, D, e)<br>        self.assertAlmostEqual(tet.xyz_volume(), 1.0, "Volume not 1")<br>
<br>if __name__ == "__main__":<br>    unittest.main()<br><br><br></div>