00001 #ifndef __DistanceFMM__
00002 #define __DistanceFMM__
00003
00004
00005
00035 #include "AnImage.hpp"
00036 #include "RImage.hpp"
00037 #include "FImage.hpp"
00038
00039 #include "AnImageOp.hpp"
00040
00041 #include "Psi2DValue.hpp"
00042 #include "DomainOfAction.hpp"
00043 #include "CandidateHeapList.hpp"
00044 #include "NeigbourSet.hpp"
00045
00046
00047 class DistanceFMM : public AnImageOp
00048 {
00049 protected:
00050
00051 int maskFlag;
00052
00053 int iteration;
00054
00055 double selectedDistance;
00056
00057 double root2;
00058
00059 double slowness;
00060 NeigbourSet* neigbourSet;
00061
00062 CandidateHeapList* candidateList;
00063
00064 protected:
00065
00066 int iterMax;
00067 int width;
00068 int height;
00069
00071 DomainOfAction* dmap;
00072
00074 int xSelected, ySelected;
00075
00076 protected:
00077
00079
00088 virtual double getPotential(int i, int j)
00089 {return (dmap->getLabel(i,j) != Unknown ? (slowness) : 1e12); }
00090
00091
00092 virtual Psi2DValue* select();
00093 virtual void getSelectionNeighbour(int x, int y);
00094
00095
00096
00097
00098 virtual void resolve(int x, int y);
00099
00100 public:
00101
00102 DistanceFMM(int amaskFlag=1);
00103 virtual ~DistanceFMM(){ delete dmap; delete candidateList; delete neigbourSet; }
00104
00105 virtual void setMaskActivity(int amaskFlag){ maskFlag= amaskFlag; }
00106
00107 virtual double getDistance(int x, int y){return dmap->getValue(x, y);}
00108 virtual StatePsi getLabel(int x, int y){return dmap->getLabel(x, y);}
00109
00111 virtual void setData(int w, int h, int x0, int y0);
00112 virtual void setData(int w, int h, int n, int* xMask, int* yMask);
00113 virtual void setData(AnImage* im);
00114
00115
00116 virtual int getMaxIterations(){ return iterMax; }
00117 virtual int numberOfIteration(){ return iteration; }
00118 virtual void setIteration(int i){ iteration=i; }
00119
00121 virtual bool iterate();
00122
00124
00133 virtual bool iterate(int* x, int* y)
00134 {
00135 bool rc= iterate();
00136
00137 *x= xSelected;
00138 *y= ySelected;
00139
00140 return rc;
00141 }
00142
00144
00154 virtual bool iterate(int* x, int* y, double* rate)
00155 {
00156 bool rc= iterate(x,y);
00157
00158 *rate= dmap->getValue(xSelected,ySelected);
00159
00160 return rc;
00161 }
00162
00164 virtual RImage* compute(RImage* dest=0);
00165
00167 virtual void sortedArea(AnImage* mask,
00168 int* npoints, int** xposition, int** yposition, bool inside=true);
00170 virtual void sortedArea(AnImage* mask, int* npoints,
00171 int** xposition, int** yposition, double** rating, bool inside=true);
00172
00174 virtual AnImage* filter(AnImage* mask, AnImage* dest=0);
00175 virtual AnImage* selectedFilter(AnImage* mask, AnImage* src, AnImage* dest=0);
00176
00178 virtual FImage* ffilter(AnImage* mask, FImage* dest=0, bool dmapFlag=false);
00179 virtual RImage* rfilter(AnImage* mask, RImage* dest=0, bool dmapFlag=false);
00180
00182 virtual AnImage* singlePath(AnImage* src, int x0, int y0, int x1, int y1, AnImage* dest=0);
00183
00184 virtual void report(){}
00185 };
00186
00187 #endif