text: OV.GetTriangleArea = function (v0, v1, v2)
  {
      const a = OV.CoordDistance3D (v0, v1);
      const b = OV.CoordDistance3D (v1, v2);
      const c = OV.CoordDistance3D (v0, v2);
      const s = (a + b + c) / 2.0;
      const areaSquare = s * (s - a) * (s - b) * (s - c);
      if (areaSquare < 0.0) {
          return 0.0;
      }
      return Math.sqrt (areaSquare);
  };
  
  OV.GetTetrahedronSignedVolume = function (v0, v1, v2)
  {
      return OV.DotVector3D (v0, OV.CrossVector3D (v1, v2)) / 6.0;
  };
  
  OV.CalculateVolume = function (object3D)
  {
      if (!OV.IsSolid (object3D)) {
          return null;
      }
      let volume = 0.0;
      object3D.EnumerateTriangleVertices ((v0, v1, v2) => {
          volume += OV.GetTetrahedronSignedVolume (v0, v1, v2);
      });
      return volume;
  };
  
  OV.CalculateSurfaceArea = function (object3D)
  {
      let surface = 0.0;
      object3D.EnumerateTriangleVertices ((v0, v1, v2) => {
          surface += OV.GetTriangleArea (v0, v1, v2);
      });
      return surface;
  };
  