nuclear@0: #ifndef VOLUME_H_ nuclear@0: #define VOLUME_H_ nuclear@0: nuclear@1: #include nuclear@0: #include "image.h" nuclear@0: nuclear@0: class Volume { nuclear@0: public: nuclear@0: virtual ~Volume(); nuclear@0: nuclear@1: // returns 0 if the volume is continuously defined nuclear@0: virtual int num_samples(int dim) const; nuclear@0: nuclear@1: // central differences offset will be delta / num_samples for discrete volumes nuclear@1: // and delta for continuous volumes nuclear@0: virtual void normalf(float *norm, float x, float y, float z, float delta = 1.0); nuclear@0: virtual void normali(float *norm, int x, int y, int z); nuclear@0: nuclear@0: virtual float valuef(float x, float y, float z) const = 0; nuclear@0: virtual float valuei(int x, int y, int z) const = 0; nuclear@0: }; nuclear@0: nuclear@0: class VoxelVolume : public Volume { nuclear@0: protected: nuclear@1: int size[3]; nuclear@0: std::vector slices; nuclear@0: nuclear@0: public: nuclear@0: VoxelVolume(); nuclear@0: nuclear@0: bool load(const char *fname); nuclear@0: nuclear@0: int num_samples(int dim) const; nuclear@0: nuclear@0: float valuef(float x, float y, float z) const; nuclear@0: float valuei(int x, int y, int z) const; nuclear@0: }; nuclear@0: nuclear@0: #endif // VOLUME_H_