You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.7 KiB
146 lines
4.7 KiB
/*===========================================================================*\
|
|
* *
|
|
* IsoEx *
|
|
* Copyright (C) 2002 by Computer Graphics Group, RWTH Aachen *
|
|
* www.rwth-graphics.de *
|
|
* *
|
|
*---------------------------------------------------------------------------*
|
|
* *
|
|
* License *
|
|
* *
|
|
* This library is free software; you can redistribute it and/or modify it *
|
|
* under the terms of the GNU Library General Public License as published *
|
|
* by the Free Software Foundation, version 2. *
|
|
* *
|
|
* This library is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* Library General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Library General Public *
|
|
* License along with this library; if not, write to the Free Software *
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
|
|
* *
|
|
\*===========================================================================*/
|
|
|
|
//=============================================================================
|
|
//
|
|
// CLASS ImplicitSphere
|
|
//
|
|
//=============================================================================
|
|
|
|
|
|
#ifndef ISOEX_IMPLICITSPHERE_HH
|
|
#define ISOEX_IMPLICITSPHERE_HH
|
|
|
|
|
|
//== INCLUDES =================================================================
|
|
|
|
#include "Implicit.hh"
|
|
#include <IsoEx/Config/IsoExDefines.hh>
|
|
|
|
//== NAMESPACES ===============================================================
|
|
|
|
namespace IsoEx {
|
|
|
|
//== CLASS DEFINITION =========================================================
|
|
|
|
|
|
/** \class ImplicitSphere ImplicitSphere.hh <IsoEx/Implicits/ImplicitSphere.hh>
|
|
This class implements a very simple implicit object: a sphere given its
|
|
center and its radius.
|
|
\see IsoEx::Implicit
|
|
\ingroup implicits
|
|
*/
|
|
template< class Vec3 >
|
|
class ISOEXDLLEXPORT ImplicitSphere : public Implicit<Vec3>
|
|
{
|
|
public:
|
|
|
|
typedef typename Vec3::value_type real;
|
|
|
|
/// \name Constructor & destructor
|
|
//@{
|
|
|
|
/// Constructor: given sphere center and radius
|
|
ImplicitSphere(const Vec3& _center, real _radius)
|
|
: center_(_center),
|
|
radius_(_radius),
|
|
sqr_radius_(_radius*_radius)
|
|
{}
|
|
|
|
/// Empty destructor
|
|
~ImplicitSphere() {}
|
|
|
|
//@}
|
|
|
|
|
|
|
|
/// \name Abstract interface of implicit objects, see also IsoEx::Implicit.
|
|
//@{
|
|
|
|
//_isovalue is not implemented in this class //YANG LIU
|
|
|
|
bool is_inside(const Vec3& _point, const Real _isovalue = 0) const
|
|
{
|
|
return (center_ - _point).sqrnorm() <= sqr_radius_;
|
|
}
|
|
|
|
real scalar_distance(const Vec3& _point) const
|
|
{
|
|
return (center_ - _point).norm() - radius_;
|
|
}
|
|
|
|
bool directed_distance(const Vec3& _p0,
|
|
const Vec3& _p1,
|
|
Vec3& _point,
|
|
Vec3& _normal,
|
|
real& _distance,
|
|
const real _isovalue = 0) const
|
|
{
|
|
Vec3 orig(_p0), dir(_p1-_p0);
|
|
|
|
double a = dir.sqrnorm();
|
|
double b = 2.0*(dir | (orig - center_));
|
|
double c = (orig - center_).sqrnorm() - radius_*radius_;
|
|
double d = b*b - 4.0*a*c;
|
|
|
|
if (d >= 0)
|
|
{
|
|
d = sqrt(d);
|
|
|
|
double t1 = (-b-d) / (2.0*a);
|
|
double t2 = (-b+d) / (2.0*a);
|
|
double t = 1.00001;
|
|
if (t1 >= 0.0 && t1 < t) t = t1;
|
|
if (t2 >= 0.0 && t2 < t) t = t2;
|
|
|
|
if (t != 1.00001)
|
|
{
|
|
_point = orig + dir*t;
|
|
_normal = (_point - center_) / radius_;
|
|
_distance = ((dir | _normal) < 0.0) ? dir.norm()*t : -dir.norm()*t;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//@}
|
|
|
|
|
|
private:
|
|
|
|
Vec3 center_;
|
|
real radius_;
|
|
real sqr_radius_;
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
} // namespace IsoEx
|
|
//=============================================================================
|
|
#endif // ISOEX_IMPLICITSPHERE_HH defined
|
|
//=============================================================================
|
|
|
|
|