DGtal  1.5.beta
Policy.h
1 
17 #pragma once
18 
28 #if defined(POLICY_RECURSES)
29 #error Recursive header files inclusion detected in Policy.h
30 #else // defined(POLICY_RECURSES)
32 #define POLICY_RECURSES
33 
34 #if !defined POLICY_h
36 #define POLICY_h
37 
39 // Inclusions
40 
41 
42 
43 // Base Policy class
44 #include <DGtal/images/RigidTransformation2D.h>
45 #include "ErrorVectorField.h"
46 
47 namespace DGtal {
54  template<typename TSpace, typename TDomain, typename BijectiveRotation>
55  struct Policy {
56  typedef std::vector<std::vector<typename TSpace::RealPoint>> VectorField;
57 
58  virtual ~Policy() = default;
59  virtual double evaluate(const TDomain& set2d, const BijectiveRotation& reflections,double my_angle, typename TSpace::Point my_center) const = 0;
60  };
61 
62 
63  // Linf Policy class
64  template<typename TSpace, typename TDomain, typename TBijectiveRotation>
65  struct LinfPolicy : public Policy<TSpace,TDomain,TBijectiveRotation> {
66  typedef std::vector<std::vector<typename TSpace::RealPoint>> VectorField;
68 
69  double evaluate(const TDomain& set2d, const TBijectiveRotation& reflections,double my_angle, typename TSpace::Point my_center) const override {
70  ErrorRealVectors errorsVectors(reflections,my_angle,my_center);
71 
72  VectorField errors = errorsVectors.getOutputVectorFieldFromContour(set2d);
73  double outError = 0.;
74  for(std::vector<typename TSpace::RealPoint> vecError: errors) {
75  typename TSpace::RealPoint vecErrorRealRot = vecError[0];
76  outError= std::max(outError,std::sqrt((vecErrorRealRot[0]*vecErrorRealRot[0]+vecErrorRealRot[1]*vecErrorRealRot[1])));
77  }
78  return outError;
79  }
80  };
81 
82  // Linf Policy class
83  template<typename TSpace, typename TDomain, typename TBijectiveRotation>
84  struct L2 : public Policy<TSpace,TDomain,TBijectiveRotation> {
85  typedef std::vector<std::vector<typename TSpace::RealPoint>> VectorField;
87 
88  double evaluate(const TDomain& set2d, const TBijectiveRotation& reflections,double my_angle, typename TSpace::Point my_center) const override {
89  ErrorRealVectors errorsVectors(reflections,my_angle,my_center);
90  VectorField errors = errorsVectors.getOutputVectorFieldFromContour(set2d);
91  double outError = 0.;
92  for(std::vector<typename TSpace::RealPoint> vecError: errors) {
93  typename TSpace::RealPoint vecErrorRealRot = vecError[0];
94  outError+= (vecErrorRealRot[0]*vecErrorRealRot[0]+vecErrorRealRot[1]*vecErrorRealRot[1]);
95  }
96  return std::sqrt(outError);
97  }
98  };
99 
100 
101 
102 
103  // Lcontinuity Policy struct
104  template<typename TSpace, typename TDomain, typename TBijectiveRotation>
105  struct LcontinuityPolicy : public Policy<TSpace,TDomain,TBijectiveRotation> {
106  typedef std::vector<std::vector<typename TSpace::RealPoint>> VectorField;
108 
109  double evaluate(const TDomain& set2d, const TBijectiveRotation& reflections,double my_angle, typename TSpace::Point my_center) const override {
110  ErrorRealVectors errorsVectors(reflections,my_angle,my_center);
111  VectorField errors = errorsVectors.getOutputVectorFieldFromContour(set2d,true);
112  double outError = 0.;
113 
114  for(std::vector<typename TSpace::RealPoint> vecError: errors) {
115  for(int i = 1 ; i<vecError.size();++i ) {
116  //std::cout << "vec error i ="<<vecError[i]<<std::endl;
117  outError+=(1./8.)*(vecError[i][0]*vecError[i][0]+vecError[i][1]*vecError[i][1]);
118  }
119  }
120  return std::sqrt(outError/(set2d.size()));
121 
122  }
123  };
124 
125  // MixedPolicy struct combining Lcontinuity and Linf
126  template<typename TSpace, typename TDomain, typename TBijectiveRotation>
127  struct MixedPolicy : public Policy<TSpace,TDomain,TBijectiveRotation> {
128  private:
129  double my_lambda; // Weight for Linf
130  double my_mu; // Weight for Lcontinuity
131  public:
132  MixedPolicy(const double lambda, const double mu) : my_lambda(lambda), my_mu(mu) {}
133 
134  double evaluate(const TDomain& set2d, const TBijectiveRotation& reflections, double my_angle, typename TSpace::Point my_center) const override {
137  return my_lambda* linf.evaluate(set2d,reflections,my_angle,my_center) + my_mu* lcontinuity.evaluate(set2d,reflections,my_angle,my_center);
138  }
139  };
140 }
141 
142 
143 #endif //POLICY
144 #undef POLICY_RECURSES
145 #endif // else defined(POLICY_RECURSES)
146 
DGtal is the top-level namespace which contains all DGtal functions and types.
VectorField getOutputVectorFieldFromContour(const TDomain &set2dContour, bool continuityVecField=false)
double evaluate(const TDomain &set2d, const TBijectiveRotation &reflections, double my_angle, typename TSpace::Point my_center) const override
Definition: Policy.h:88
std::vector< std::vector< typename TSpace::RealPoint > > VectorField
Definition: Policy.h:85
ErrorVectorField< TSpace, TDomain, TBijectiveRotation, typename TSpace::RealPoint > ErrorRealVectors
Definition: Policy.h:86
double evaluate(const TDomain &set2d, const TBijectiveRotation &reflections, double my_angle, typename TSpace::Point my_center) const override
Definition: Policy.h:109
std::vector< std::vector< typename TSpace::RealPoint > > VectorField
Definition: Policy.h:106
ErrorVectorField< TSpace, TDomain, TBijectiveRotation, typename TSpace::RealPoint > ErrorRealVectors
Definition: Policy.h:107
std::vector< std::vector< typename TSpace::RealPoint > > VectorField
Definition: Policy.h:66
ErrorVectorField< TSpace, TDomain, TBijectiveRotation, typename TSpace::RealPoint > ErrorRealVectors
Definition: Policy.h:67
double evaluate(const TDomain &set2d, const TBijectiveRotation &reflections, double my_angle, typename TSpace::Point my_center) const override
Definition: Policy.h:69
double evaluate(const TDomain &set2d, const TBijectiveRotation &reflections, double my_angle, typename TSpace::Point my_center) const override
Definition: Policy.h:134
MixedPolicy(const double lambda, const double mu)
Definition: Policy.h:132
double my_lambda
Definition: Policy.h:129
Policy : ,.
Definition: Policy.h:55
virtual ~Policy()=default
virtual double evaluate(const TDomain &set2d, const BijectiveRotation &reflections, double my_angle, typename TSpace::Point my_center) const =0
std::vector< std::vector< typename TSpace::RealPoint > > VectorField
Definition: Policy.h:56
int max(int a, int b)
MyPointD Point
Definition: testClone2.cpp:383
PointVector< 3, double > RealPoint