T get_radius() const { return radius; }
- virtual BoundingBox<T, D> get_axis_aligned_bounding_box() const;
+ virtual BoundingBox<T, D> get_axis_aligned_bounding_box(unsigned = 0) const;
virtual bool contains(const LinAl::Vector<T, D> &) const;
virtual unsigned get_max_ray_intersections() const { return 2; }
virtual unsigned get_intersections(const Ray<T, D> &, SurfacePoint<T, D> *, unsigned) const;
+ virtual Coverage get_coverage(const BoundingBox<T, D> &) const;
};
template<typename T, unsigned D>
}
template<typename T, unsigned D>
-inline BoundingBox<T, D> HyperSphere<T, D>::get_axis_aligned_bounding_box() const
+inline BoundingBox<T, D> HyperSphere<T, D>::get_axis_aligned_bounding_box(unsigned) const
{
LinAl::Vector<T, D> extent;
for(unsigned i=0; i<D; ++i)
T mid = -inner_product(ray.get_direction(), ray.get_start());
LinAl::Vector<T, D> nearest = ray.get_start()+ray.get_direction()*mid;
T offset_sq = radius*radius-inner_product(nearest, nearest);
- if(offset_sq<0)
+ if(offset_sq<T(0))
return 0;
T offset = sqrt(offset_sq);
points[n].position = ray.get_start()+ray.get_direction()*x;
points[n].normal = normalize(points[n].position);
points[n].distance = x;
+ points[n].entry = (i<0);
}
++n;
return n;
}
+template<typename T, unsigned D>
+inline Coverage HyperSphere<T, D>::get_coverage(const BoundingBox<T, D> &bbox) const
+{
+ const LinAl::Vector<T, D> &min_pt = bbox.get_minimum_point();
+ const LinAl::Vector<T, D> &max_pt = bbox.get_maximum_point();
+
+ LinAl::Vector<T, D> far_point;
+ for(unsigned i=0; i<D; ++i)
+ far_point[i] = std::max(std::abs(min_pt[i]), std::abs(max_pt[i]));
+
+ if(contains(far_point))
+ return FULL_COVERAGE;
+
+ unsigned spanned_dimensions = 0;
+ for(unsigned i=0; i<D; ++i)
+ if(min_pt[i]<T(0) && max_pt[i]>T(0))
+ spanned_dimensions |= 1<<i;
+
+ for(unsigned i=0; i<(1<<D); ++i)
+ {
+ if(i&spanned_dimensions)
+ continue;
+
+ LinAl::Vector<T, D> point;
+ for(unsigned j=0; j<D; ++j)
+ if(!((spanned_dimensions>>j)&1))
+ point[j] = ((i>>j)&1 ? max_pt[j] : min_pt[j]);
+
+ if(contains(point))
+ return PARTIAL_COVERAGE;
+ }
+
+ return NO_COVERAGE;
+}
+
} // namespace Geometry
} // namespace Msp