#ifndef _SamplingStategy_H__ #define _SamplingStategy_H__ namespace GtpVisibilityPreprocessor { class Preprocessor; struct SimpleRay; /** This class generates a specific sampling strategy. */ class SamplingStrategy { public: /** Sample rays of particular type */ enum { OBJECT_BASED_DISTRIBUTION, DIRECTION_BASED_DISTRIBUTION, DIRECTION_BOX_BASED_DISTRIBUTION, SPATIAL_BOX_BASED_DISTRIBUTION, RSS_BASED_DISTRIBUTION, RSS_SILHOUETTE_BASED_DISTRIBUTION, VSS_BASED_DISTRIBUTION, OBJECT_DIRECTION_BASED_DISTRIBUTION, OBJECTS_INTERIOR_DISTRIBUTION }; /** Default constructor */ SamplingStrategy(const Preprocessor &preprocessor); virtual ~SamplingStrategy(); /** Each strategy has to implement this function. @returns true if generated valid sample. */ virtual bool GenerateSample(SimpleRay &ray) const = 0; protected: const Preprocessor &mPreprocessor; }; class ObjectBasedDistribution: public SamplingStrategy { public: ObjectBasedDistribution(const Preprocessor &preprocessor): SamplingStrategy(preprocessor) {} virtual bool GenerateSample(SimpleRay &ray) const; }; class ObjectDirectionBasedDistribution: public SamplingStrategy { public: ObjectDirectionBasedDistribution(const Preprocessor &preprocessor): SamplingStrategy(preprocessor) {} virtual bool GenerateSample(SimpleRay &ray) const; }; class DirectionBasedDistribution: public SamplingStrategy { public: DirectionBasedDistribution(const Preprocessor &preprocessor): SamplingStrategy(preprocessor) {} virtual bool GenerateSample(SimpleRay &ray) const; }; class DirectionBoxBasedDistribution: public SamplingStrategy { public: DirectionBoxBasedDistribution(const Preprocessor &preprocessor): SamplingStrategy(preprocessor) {} virtual bool GenerateSample(SimpleRay &ray) const; }; class SpatialBoxBasedDistribution: public SamplingStrategy { public: SpatialBoxBasedDistribution(const Preprocessor &preprocessor): SamplingStrategy(preprocessor) {} virtual bool GenerateSample(SimpleRay &ray) const; }; /** This strategy generates samples inside of the objects, e.g., for sampling the inside of a colon. */ /*class ObjectsInteriorDistribution: public SamplingStrategy { public: ObjectsInteriorDistribution(const Preprocessor &preprocessor): SamplingStrategy(preprocessor) {} virtual bool GenerateSample(SimpleRay &ray) const; }; */ }; #endif