00001
00002
00003 #ifndef _SPAF_FEATURE_HPP_
00004 #define _SPAF_FEATURE_HPP_
00005
00006 #include "jafarConfig.h"
00007 #include <values.h>
00008
00009 #include <iostream>
00010 #include <geom/Declarations.hpp>
00011 #include <geom/Atom.hpp>
00012
00013 namespace jafar {
00014
00015 namespace spaf {
00016 class ComparisonResult;
00017 class Location;
00018 class LocationsBag;
00019 class DisplayContext;
00020 class MapsTransformation;
00025 class Feature {
00026 public:
00027 struct Range {
00028 Range() : a(FLT_MIN), aCov(0), b(FLT_MAX), bCov(0)
00029 {
00030 }
00031 Range(double _a, double _aCov, double _b, double _bCov) : a(_a), aCov(_aCov), b(_b), bCov(_bCov)
00032 {
00033 }
00034 double a, aCov, b, bCov;
00035 };
00036 public:
00037 Feature();
00038 Feature(const Feature&);
00039 virtual ~Feature();
00043 virtual int id() const = 0;
00044 const LocationsBag& locations() const;
00045 virtual std::list<int> maps() const = 0;
00046 virtual const std::map<int, geom::Atom3D*>& atoms() const = 0;
00047 virtual geom::Atom3D* atom(int _map) =0;
00048 virtual const geom::Atom3D* atom(int _map) const =0;
00049 virtual void setAtom(const geom::Atom3D* _atom, int _map) = 0;
00050 virtual void fillDisplayContext( DisplayContext*, MapsTransformation* mapsTransfo ) const = 0;
00051 virtual void computeCharacteristicVector( const Feature* feature, geom::Atom3D::HomogenousVecD& vec, geom::Atom3D::HomogenousSymMatrixD& vecCov ) const = 0;
00055 virtual Feature::Range computeOccupancyRange( const Feature* _feature ) const = 0;
00059 virtual void computeCosAngle( const Feature* feature, double& angle, double& angleCov ) const = 0;
00063 virtual void computeDistance( const Feature* feature, double& distance, double& distanceCov ) const = 0;
00067 virtual void mergeWith( Feature* feature) = 0;
00068 virtual geom::BoundingBox3D globalBoundingBox(MapsTransformation* mapsTransfo) const = 0;
00069 private:
00070 struct Private;
00071 Private* const d;
00072 };
00073 std::ostream& operator<<(std::ostream& s, const Feature&);
00074 }
00075 }
00076
00077 #endif