X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgeometry%2Fhalfspace.h;h=b439851bd5adaf3a7067c7f91f5bf8308bb01166;hb=7919982691f0b8c69d8bef1bf6471b1e7a312163;hp=f671629e56194b0a93a00220c5ef17ef0c6ad0f7;hpb=fb9e6b5ff48e10ea2217cf539e0461956abf02cf;p=libs%2Fmath.git diff --git a/source/geometry/halfspace.h b/source/geometry/halfspace.h index f671629..b439851 100644 --- a/source/geometry/halfspace.h +++ b/source/geometry/halfspace.h @@ -7,8 +7,8 @@ namespace Msp { namespace Geometry { /** -An infinite shape consisting of the space on one side of a plane. Mostly -useful when composited with other shapes. +An unbounded shape consisting of the space on one side of a plane. Mostly +useful when intersected with other shapes. */ template class HalfSpace: public Shape @@ -63,7 +63,12 @@ inline bool HalfSpace::contains(const LinAl::Vector &point) const template inline unsigned HalfSpace::get_intersections(const Ray &ray, SurfacePoint *points, unsigned size) const { - T x = -inner_product(ray.get_start(), normal)/inner_product(ray.get_direction(), normal); + T d = inner_product(ray.get_start(), normal); + T c = inner_product(ray.get_direction(), normal); + if(c==T(0)) + return 0; + + T x = -d/c; if(ray.check_limits(x)) { if(points && size>0) @@ -71,6 +76,7 @@ inline unsigned HalfSpace::get_intersections(const Ray &ray, Surface points[0].position = ray.get_start()+ray.get_direction()*x; points[0].normal = normal; points[0].distance = x; + points[0].entry = (c