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.
84 lines
1.5 KiB
84 lines
1.5 KiB
#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
|