"...docs/benchmarks/git@gitlab.opengeosys.org:rinkk/ogs.git" did not exist on "66837ffebfe03cd80ffcaa06fc88d20bdc8b1267"
Newer
Older
/**
*
* \copyright
* Copyright (c) 2012-2016, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
*/
#include "GeometricBasics.h"
#include "Point3d.h"
#include "Vector3.h"
namespace MathLib
{
double orientation3d(MathLib::Point3d const& p,
MathLib::Point3d const& a,
MathLib::Point3d const& b,
MathLib::Point3d const& c)
{
MathLib::Vector3 const ap (a, p);
MathLib::Vector3 const bp (b, p);
MathLib::Vector3 const cp (c, p);
return MathLib::scalarTriple(bp,cp,ap);
}
double calcTetrahedronVolume(MathLib::Point3d const& a,
MathLib::Point3d const& b,
MathLib::Point3d const& c,
MathLib::Point3d const& d)
{
const MathLib::Vector3 ab(a, b);
const MathLib::Vector3 ac(a, c);
const MathLib::Vector3 ad(a, d);
return std::abs(MathLib::scalarTriple(ac, ad, ab)) / 6.0;
}
bool isPointInTetrahedron(MathLib::Point3d const& p, MathLib::Point3d const& a,
MathLib::Point3d const& b, MathLib::Point3d const& c,
MathLib::Point3d const& d, double eps)
{
double const d0 (MathLib::orientation3d(d,a,b,c));
// if tetrahedron is not coplanar
if (std::abs(d0) > std::numeric_limits<double>::epsilon())
{
bool const d0_sign (d0>0);
// if p is on the same side of bcd as a
double const d1 (MathLib::orientation3d(d, p, b, c));
if (!(d0_sign == (d1>=0) || std::abs(d1) < eps))
return false;
// if p is on the same side of acd as b
double const d2 (MathLib::orientation3d(d, a, p, c));
if (!(d0_sign == (d2>=0) || std::abs(d2) < eps))
return false;
// if p is on the same side of abd as c
double const d3 (MathLib::orientation3d(d, a, b, p));
if (!(d0_sign == (d3>=0) || std::abs(d3) < eps))
return false;
// if p is on the same side of abc as d
double const d4 (MathLib::orientation3d(p, a, b, c));
if (!(d0_sign == (d4>=0) || std::abs(d4) < eps))
return false;
return true;
}
return false;
}
} // end namespace MathLib