#ifndef gra_FeaturePoint_H__ #define gra_FeaturePoint_H__ #include "../oo/ObjBase.h" #include "../math/Vector.h" #include #include #include #include namespace meow { /*! * @brief 特徵點 * * @author cat_leopard */ template class FeaturePoint: public ObjBase { private: Vector pos_; Vector des_; public: /*! * @brief constructor */ FeaturePoint() { } /*! * @brief constructor */ FeaturePoint(size_t pDim, size_t dDim): pos_(pDim, Scalar(0)), des_(dDim, Description(0)) { } /*! * @brief constructor */ FeaturePoint(FeaturePoint const& fp): pos_(fp.pos_), des_(fp.des_) { } /*! * @brief destructor */ ~FeaturePoint() { } /*! * @brief 複製 */ FeaturePoint& copyFrom(FeaturePoint const& fp) { pos_.copyFrom(fp.pos_); des_.copyFrom(fp.des_); return *this; } /*! * @brief 參照 */ FeaturePoint& referenceFrom(FeaturePoint const& fp) { pos_.referenceFrom(fp.pos_); des_.referenceFrom(fp.des_); return *this; } /*! * @brief 回傳position */ Vector const& position() const { return pos_; } /*! * @brief 回傳position (non-const reference) */ Vector& positionGet() { return pos_; } /*! * @brief 回傳description */ Vector const& description() const { return des_; } /*! * @brief 回傳description (non-const reference) */ Vector& descriptionGet() { return des_; } /*! * @brief 修改position */ Vector const& position(Vector const& p) const { pos_.copyFrom(p); return position(); } /*! * @brief 修改description */ Vector const& description(Vector const& d) { des_.copyFrom(d); return description(); } /*! * @brief 回傳position的第i個scalar */ Scalar position(size_t index) const { return pos_(index); } /*! * @brief 回傳description的第i個Description */ Description description(size_t i) const { return des_(i); } /*! * @brief 修改position的第i個scalar */ Scalar position(size_t i, Scalar const& s) { pos_.entry(i, s); return position(i); } /*! * @brief 修改description的第i個Description */ Description description(size_t i, Description const& d) { des_.entry(i, d); return description(i); } /*! * @brief same as copyFrom(fp) */ FeaturePoint& operator=(FeaturePoint const& fp) { return copyFrom(fp); } /*! * @brief same as position(i) */ Scalar const& operator()(size_t i) const { return position(i); } /*! * @brief same as description(i) */ Description operator[](size_t i) const { return description(i); } bool write(FILE* f, bool bin, unsigned int fg) const { if (bin) { double tmp; for (size_t i = 0, I = position().dimension(); i < I; ++i) { if (fwrite(&(tmp = position(i)), sizeof(tmp), 1, f) < 1) return false; } for (size_t i = 0, I = description().dimension(); i < I; ++i) { if (fwrite(&(tmp = description(i)), sizeof(tmp), 1, f) < 1) return false; } } else { for (size_t i = 0, I = position().dimension(); i < I; ++i) { if (fprintf(f, "%f ", (double)position(i)) < 1) return false; } fprintf(f, "\n"); for (size_t i = 0, I = description().dimension(); i < I; ++i) { if (fprintf(f, "%f ", (double)description(i)) < 1) return false; } fprintf(f, "\n"); } return true; } bool read (FILE* f, bool bin, unsigned int fg) { if (bin) { double tmp; for (size_t i = 0, I = position().dimension(); i < I; ++i) { if (fread(&tmp, sizeof(tmp), 1, f) < 1) return false; position(i, tmp); } for (size_t i = 0, I = description().dimension(); i < I; ++i) { if (fread(&tmp, sizeof(tmp), 1, f) < 1) return false; description(i, tmp); } } else { double tmp; for (size_t i = 0, I = position().dimension(); i < I; ++i) { if (fscanf(f, "%lf", &tmp) < 1) return false; position(i, tmp); } for (size_t i = 0, I = description().dimension(); i < I; ++i) { if (fscanf(f, "%lf", &tmp) < 1) return false; description(i, tmp); } } return true; } ObjBase* create() const { return new FeaturePoint(); } ObjBase* copyFrom(ObjBase const& b) { return &(copyFrom(*(FeaturePoint*)b)); } char const* ctype() const { return typeid(*this).name(); } std::string type() const { return std::string(ctype()); } }; } // meow #endif // gra_FeaturePoint_H__