00001
00002
00003
00004 #ifndef VIRTUAL_DISP_H
00005 #define VIRTUAL_DISP_H 1
00006
00007 #include <cmath>
00008
00009 #include "log.h"
00010 #include "controls.h"
00011 #include "meshmorph.h"
00012
00013 typedef std::map<Vertex*,float,ltv> map_d;
00014 typedef std::map<Vertex*,float,ltv>::iterator td_it;
00015 typedef std::multimap<float,Vertex*,ltd> map_v;
00016 typedef std::multimap<float,Vertex*,ltd>::iterator tv_it;
00017 typedef std::multimap<float,Vertex*,ltd>::reverse_iterator tv_rit;
00018 typedef std::multimap<float,Vertex*,ltd>::const_reverse_iterator tv_crit;
00019 typedef std::multimap<float,Vertex*,ltd>::const_iterator tv_cit;
00020
00021 typedef std::vector<std::string>::const_iterator s_cit;
00022
00023 class Virtual_Disp
00024 {
00025 private:
00026 static Virtual_Disp * only_one;
00027 map_v vd2_to_v;
00028 map_d v_to_vd2;
00029 tv_rit seed;
00030
00031 vec_s seed_vd;
00032
00033 vec_s seed_ad;
00034
00035 Virtual_Disp (void);
00036 Virtual_Disp (Virtual_Disp const &);
00037 Virtual_Disp & operator = (Virtual_Disp const &);
00038 ~Virtual_Disp (void);
00039 public:
00040 static Virtual_Disp & instance (void);
00041 void buildVirtDispMapComplement (void);
00042 bool findVirtDispToVertAssoc (Vertex * const,float const &,tv_it &);
00043 void buildVirtDispMap (const int &);
00044 void setVirtualDisp (Vertex * const,float const &);
00045 void updateVirtualDisp (Vertex * const,bool const,float const &);
00046 void removeVirtDispToVertAssoc (Vertex * const,float const &);
00047 bool getVertAndRank (Vertex * const,tv_it &,int &);
00048 void resetForNewGroup (const int &);
00049 void removeVertFromAllMaps (Vertex *);
00050 void validateVirtDispMapComplement (void);
00051 void validateVirtDispMap2 (void);
00052 void validateVirtDispMap (void) const;
00053
00057 void addAdToSeedAd (const int & count,double ad)
00058 {
00059 seed_ad.push_back(Log::instance().format("%d %g",count,ad));
00060 }
00061
00065 void addVdToSeedVd (const int & count)
00066 {
00067
00068 double myvd = sqrt((*seed).first);
00069 seed_vd.push_back(Log::instance().format("%d %g",count,myvd));
00070
00071 }
00072
00078
00079 s_cit beginSeedActDisp (void)
00080 {
00081 return seed_ad.begin();
00082 }
00083
00089
00090 s_cit endSeedActDisp (void)
00091 {
00092 return seed_ad.end();
00093 }
00094
00100
00101 s_cit beginSeedVirtDisp (void)
00102 {
00103 return seed_vd.begin();
00104 }
00105
00111
00112 s_cit endSeedVirtDisp (void)
00113 {
00114 return seed_vd.end();
00115 }
00116
00121 tv_crit getSeed (void)
00122 {
00123 return seed;
00124 }
00125
00130 int getNumVertsInVirtDispMap (void)
00131 {
00132 return vd2_to_v.size();
00133 }
00134
00139 void advanceSeedToNextLargestVert (void)
00140 {
00141 seed++;
00142 }
00143
00148 void resetSeedToLargestVert (void)
00149 {
00150 seed = vd2_to_v.rbegin();
00151 }
00152
00158 tv_cit beginVirtDispMap (void)
00159 {
00160 return vd2_to_v.begin();
00161 }
00162
00169 tv_crit rendVirtDispMap (void)
00170 {
00171 return vd2_to_v.rend();
00172 }
00173
00180 tv_cit endVirtDispMap (void)
00181 {
00182 return vd2_to_v.end();
00183 }
00184
00185 };
00186
00187 #endif