vcglib/apps/unsupported/extractors/extractor/SphereDifference.h

69 lines
1.2 KiB
C++

#ifndef __VCGTEST_SPHEREDIFFERENCE
#define __VCGTEST_SPHEREDIFFERENCE
class SphereDifference
{
public:
SphereDifference()
{}
SphereDifference( const SphereDifference &sphere_difference)
{
_union = sphere_difference._union;
_sphere = sphere_difference._sphere;
}
SphereDifference( const SphereUnion &sphere_union, const ImplicitSphere &sphere)
{
_union = sphere_union;
_sphere = sphere;
}
float V(int x, int y, int z)
{
return vcg::math::Max<float>(_union.V(x, y, z), -_sphere.V(x, y, z));
}
inline bool DirectedDistance(const vcg::Point3i p1, const vcg::Point3i p2, vcg::Point3f &p, vcg::Point3f &n, float &d)
{
vcg::Point3f v1, n1;
vcg::Point3f v2, n2;
float d1, d2;
bool ok1 = _union.DirectedDistance(p1, p2, v1, n1, d1);
bool ok2 = _sphere.DirectedDistance(p1, p2, v2, n2, d2);
d2 = -d2;
if (ok1 && ok2)
{
if (d1 > d2)
ok2 = false;
else
ok1 = false;
}
if (ok1)
{
p = v1;
n = n1;
d = d1;
return true;
}
else if (ok2)
{
p = v2;
n = n2;
d = d2;
return true;
}
return false;
}
private:
SphereUnion _union;
ImplicitSphere _sphere;
};
#endif // __VCGTEST_SPHEREDIFFERENCE