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

84 lines
1.5 KiB
C++

#ifndef __VCGTEST_SPHEREUNION
#define __VCGTEST_SPHEREUNION
class SphereUnion
{
public:
SphereUnion()
{};
SphereUnion(const ImplicitSphere &sphere1, const ImplicitSphere &sphere2)
{
_sphere1 = sphere1;
_sphere2 = sphere2;
};
SphereUnion(const SphereUnion &sphere_union)
{
_sphere1 = sphere_union._sphere1;
_sphere2 = sphere_union._sphere2;
}
SphereUnion& operator=(const SphereUnion &sphere_union)
{
if (this != &sphere_union)
{
_sphere1 = sphere_union._sphere1;
_sphere2 = sphere_union._sphere2;
}
return *this;
}
bool operator!=(const SphereUnion &sphere_union)
{
bool comp1 = _sphere1 != sphere_union._sphere1;
bool comp2 = _sphere2 != sphere_union._sphere2;
return (comp1 && comp2);
}
float V(int x, int y, int z)
{
return vcg::math::Min<float>(_sphere1.V(x, y, z), _sphere2.V(x, y, z));
};
bool DirectedDistance(const vcg::Point3i &p1, const vcg::Point3i &p2, vcg::Point3f &v, vcg::Point3f &n, float &d)
{
vcg::Point3f v1, n1;
vcg::Point3f v2, n2;
float d1, d2;
bool ok1 = _sphere1.DirectedDistance(p1, p2, v1, n1, d1);
bool ok2 = _sphere2.DirectedDistance(p1, p2, v2, n2, d2);
if (ok1 && ok2)
{
if (d1 < d2)
ok2 = false;
else
ok1 = false;
}
if (ok1)
{
v = v1;
n = n1;
d = d1;
return true;
}
else if (ok2)
{
v = v2;
n = n2;
d = d2;
return true;
}
else
return false;
};
private:
ImplicitSphere _sphere1;
ImplicitSphere _sphere2;
};
#endif // __VCGTEST_SPHEREUNION