diff --git a/include/Algo/Filtering/tools.h b/include/Algo/Filtering/tools.h index f6721ebc47f247b23803b58927c41490ec47a990..ab4da621fea7977c0a0d0b060ca9256de5133f69 100644 --- a/include/Algo/Filtering/tools.h +++ b/include/Algo/Filtering/tools.h @@ -134,7 +134,7 @@ void computeNoise(typename PFP::MAP& map, long amount, const VertexAttribute -class Ber02OddSynthesisFilter : public Algo::MR::Filter +class Ber02OddAnalysisFilter : public Algo::MR::Filter { protected: typename PFP::MAP& m_map ; VertexAttribute& m_position ; typename PFP::VEC3::DATA_TYPE m_a; - public: - Ber02OddSynthesisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) + Ber02OddAnalysisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) {} void operator() () { - TraversorF travF(m_map) ; - for (Dart d = travF.begin(); d != travF.end(); d = travF.next()) - { - typename PFP::VEC3 vf(0.0); - typename PFP::VEC3 ef(0.0); - - unsigned int count = 0; - Traversor2FE travFE(m_map, d); - for (Dart dit = travFE.begin(); dit != travFE.end(); dit = travFE.next()) - { - vf += m_position[dit]; - m_map.incCurrentLevel(); - ef += m_position[m_map.phi1(dit)]; - m_map.decCurrentLevel(); - ++count; - } - ef /= count; - ef *= 4.0 * m_a; - vf /= count; - vf *= 4.0 * m_a * m_a; - - m_map.incCurrentLevel() ; - Dart midF = m_map.phi1(m_map.phi1(d)); - m_position[midF] += vf + ef ; - m_map.decCurrentLevel() ; - - } + } + void operator() (bool filtering) + { TraversorE travE(m_map) ; for (Dart d = travE.begin(); d != travE.end(); d = travE.next()) { @@ -105,13 +80,10 @@ public: m_map.incCurrentLevel() ; Dart midV = m_map.phi1(d) ; - m_position[midV] += ve; + m_position[midV] -= ve; m_map.decCurrentLevel() ; } - } - void operator() (bool filtering) - { TraversorF travF(m_map) ; for (Dart d = travF.begin(); d != travF.end(); d = travF.next()) { @@ -136,46 +108,15 @@ public: m_map.incCurrentLevel() ; Dart midF = m_map.phi1(m_map.phi1(d)); - if(filtering) - { - std::cout << "sans +=" << std::endl; - m_position[midF] = vf + ef ; - } - else - { - std::cout << "avec +=" << std::endl; - m_position[midF] += vf + ef ; - } - m_map.decCurrentLevel() ; - - } - - TraversorE travE(m_map) ; - for (Dart d = travE.begin(); d != travE.end(); d = travE.next()) - { - typename PFP::VEC3 ve = (m_position[d] + m_position[m_map.phi1(d)]) * typename PFP::REAL(0.5); - ve *= 2.0 * m_a; - - m_map.incCurrentLevel() ; - Dart midV = m_map.phi1(d) ; - if(filtering) - { - std::cout << "sans +=" << std::endl; - m_position[midV] = ve; - } - else - { - std::cout << "avec +=" << std::endl; - m_position[midV] += ve; - } + m_position[midF] -= vf + ef ; m_map.decCurrentLevel() ; } } -} ; +}; // s-lift(a) template -class Ber02EvenSynthesisFilter : public Algo::MR::Filter +class Ber02EvenAnalysisFilter : public Algo::MR::Filter { protected: typename PFP::MAP& m_map ; @@ -183,50 +124,16 @@ protected: typename PFP::VEC3::DATA_TYPE m_a; public: - Ber02EvenSynthesisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) + Ber02EvenAnalysisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) {} void operator() () { - TraversorV travV(m_map); - for(Dart d = travV.begin() ; d != travV.end() ; d = travV.next()) - { - typename PFP::VEC3 ev(0.0); - typename PFP::VEC3 fv(0.0); - if(m_map.isBoundaryVertex(d)) - { - Dart db = m_map.findBoundaryEdgeOfVertex(d); - m_map.incCurrentLevel() ; - ev += (m_position[m_map.phi1(db)] + m_position[m_map.phi_1(db)]) * typename PFP::REAL(0.5); - m_map.decCurrentLevel() ; - ev *= 2 * m_a; - - m_position[db] += ev; - } - else - { - unsigned int count = 0; - Traversor2VF travVF(m_map,d); - for(Dart dit = travVF.begin(); dit != travVF.end() ; dit = travVF.next()) - { - m_map.incCurrentLevel() ; - - Dart midEdgeV = m_map.phi1(dit); - ev += m_position[midEdgeV]; - fv += m_position[m_map.phi1(midEdgeV)]; - - m_map.decCurrentLevel() ; - ++count; - } - fv /= count; - fv *= 4 * m_a * m_a; - ev /= count; - ev *= 4 * m_a; - m_position[d] += fv + ev; - } - } + } + void operator() (bool filtering) + { TraversorE travE(m_map); for(Dart d = travE.begin() ; d != travE.end() ; d = travE.next()) { @@ -234,7 +141,7 @@ public: { unsigned int count = 0; - typename PFP::VEC3 fe(0.0); + typename PFP::VEC3 fe(0); Traversor2EF travEF(m_map, d); for(Dart dit = travEF.begin() ; dit != travEF.end() ; dit = travEF.next()) { @@ -250,14 +157,11 @@ public: m_map.incCurrentLevel() ; Dart midF = m_map.phi1(d); - m_position[midF] += fe; + m_position[midF] -= fe; m_map.decCurrentLevel() ; } } - } - void operator() (bool filtering) - { TraversorV travV(m_map); for(Dart d = travV.begin() ; d != travV.end() ; d = travV.next()) { @@ -267,24 +171,16 @@ public: { Dart db = m_map.findBoundaryEdgeOfVertex(d); m_map.incCurrentLevel() ; - ev += (m_position[m_map.phi1(db)] + m_position[m_map.phi_1(db)]) * typename PFP::REAL(0.5); + ev = (m_position[m_map.phi1(db)] + m_position[m_map.phi_1(db)]); m_map.decCurrentLevel() ; - ev *= 2 * m_a; + ev *= m_a; - if(filtering) - { - std::cout << "sans +=" << std::endl; - m_position[db] = ev; - } - else - { - std::cout << "avec +=" << std::endl; - m_position[db] += ev; - } + m_position[d] -= ev; } else { unsigned int count = 0; + Traversor2VF travVF(m_map,d); for(Dart dit = travVF.begin(); dit != travVF.end() ; dit = travVF.next()) { @@ -302,61 +198,16 @@ public: ev /= count; ev *= 4 * m_a; - if(filtering) - { - std::cout << "sans +=" << std::endl; - m_position[d] = fv + ev; - } - else - { - std::cout << "avec +=" << std::endl; - m_position[d] += fv + ev; - } - } - } - - TraversorE travE(m_map); - for(Dart d = travE.begin() ; d != travE.end() ; d = travE.next()) - { - if(!m_map.isBoundaryEdge(d)) - { - unsigned int count = 0; - typename PFP::VEC3 fe(0.0); - Traversor2EF travEF(m_map, d); - for(Dart dit = travEF.begin() ; dit != travEF.end() ; dit = travEF.next()) - { - m_map.incCurrentLevel() ; - Dart midV = m_map.phi1(m_map.phi1(dit)); - fe += m_position[midV]; - m_map.decCurrentLevel() ; - ++count; - } - - fe /= count; - fe *= 2 * m_a; - - m_map.incCurrentLevel() ; - Dart midF = m_map.phi1(d); - if(filtering) - { - std::cout << "sans +=" << std::endl; - m_position[midF] = fe; - } - else - { - std::cout << "avec +=" << std::endl; - m_position[midF] += fe; - } - m_map.decCurrentLevel() ; + m_position[d] -= fv + ev; } } } -} ; +}; // s-scale(a) template -class Ber02ScaleSynthesisFilter : public Algo::MR::Filter +class Ber02ScaleAnalysisFilter : public Algo::MR::Filter { protected: typename PFP::MAP& m_map ; @@ -364,29 +215,12 @@ protected: typename PFP::VEC3::DATA_TYPE m_a; public: - Ber02ScaleSynthesisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) + Ber02ScaleAnalysisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) {} void operator() () { - TraversorV travV(m_map) ; - for (Dart d = travV.begin(); d != travV.end(); d = travV.next()) - { - if(m_map.isBoundaryVertex(d)) - m_position[d] *= m_a; - else - m_position[d] *= m_a * m_a; - } - TraversorE travE(m_map) ; - for (Dart d = travE.begin(); d != travE.end(); d = travE.next()) - { - m_map.incCurrentLevel() ; - Dart midE = m_map.phi1(d); - if(!m_map.isBoundaryVertex(midE)) - m_position[midE] *= m_a ; - m_map.decCurrentLevel() ; - } } void operator() (bool filtering) @@ -395,9 +229,9 @@ public: for (Dart d = travV.begin(); d != travV.end(); d = travV.next()) { if(m_map.isBoundaryVertex(d)) - m_position[d] *= m_a; + m_position[d] /= m_a; else - m_position[d] *= m_a * m_a; + m_position[d] /= m_a * m_a; } TraversorE travE(m_map) ; @@ -406,48 +240,39 @@ public: m_map.incCurrentLevel() ; Dart midE = m_map.phi1(d); if(!m_map.isBoundaryVertex(midE)) - m_position[midE] *= m_a ; + m_position[midE] /= m_a ; m_map.decCurrentLevel() ; } } -} ; +}; + + -// -// Analysis -// +/********************************************************************************* + * SYNTHESIS FILTERS + *********************************************************************************/ //w-lift(a) template -class Ber02OddAnalysisFilter : public Algo::MR::Filter +class Ber02OddSynthesisFilter : public Algo::MR::Filter { protected: typename PFP::MAP& m_map ; VertexAttribute& m_position ; typename PFP::VEC3::DATA_TYPE m_a; + public: - Ber02OddAnalysisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) + Ber02OddSynthesisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) {} - void operator() (bool filtering) + void operator() () { } - void operator() () + void operator() (bool filtering) { - TraversorE travE(m_map) ; - for (Dart d = travE.begin(); d != travE.end(); d = travE.next()) - { - typename PFP::VEC3 ve = (m_position[d] + m_position[m_map.phi1(d)]) * typename PFP::REAL(0.5); - ve *= 2.0 * m_a; - - m_map.incCurrentLevel() ; - Dart midV = m_map.phi1(d) ; - m_position[midV] -= ve; - m_map.decCurrentLevel() ; - } - TraversorF travF(m_map) ; for (Dart d = travF.begin(); d != travF.end(); d = travF.next()) { @@ -472,15 +297,42 @@ public: m_map.incCurrentLevel() ; Dart midF = m_map.phi1(m_map.phi1(d)); - m_position[midF] -= vf + ef ; + if(filtering) + { + m_position[midF] = vf + ef ; + } + else + { + m_position[midF] += vf + ef ; + } + m_map.decCurrentLevel() ; + + } + + TraversorE travE(m_map) ; + for (Dart d = travE.begin(); d != travE.end(); d = travE.next()) + { + typename PFP::VEC3 ve = (m_position[d] + m_position[m_map.phi1(d)]) * typename PFP::REAL(0.5); + ve *= 2.0 * m_a; + + m_map.incCurrentLevel() ; + Dart midV = m_map.phi1(d) ; + if(filtering) + { + m_position[midV] = ve; + } + else + { + m_position[midV] += ve; + } m_map.decCurrentLevel() ; } } -}; +} ; // s-lift(a) template -class Ber02EvenAnalysisFilter : public Algo::MR::Filter +class Ber02EvenSynthesisFilter : public Algo::MR::Filter { protected: typename PFP::MAP& m_map ; @@ -488,44 +340,16 @@ protected: typename PFP::VEC3::DATA_TYPE m_a; public: - Ber02EvenAnalysisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) + Ber02EvenSynthesisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) {} - void operator() (bool filtering) + void operator() () { } - void operator() () + void operator() (bool filtering) { - TraversorE travE(m_map); - for(Dart d = travE.begin() ; d != travE.end() ; d = travE.next()) - { - if(!m_map.isBoundaryEdge(d)) - { - unsigned int count = 0; - - typename PFP::VEC3 fe(0); - Traversor2EF travEF(m_map, d); - for(Dart dit = travEF.begin() ; dit != travEF.end() ; dit = travEF.next()) - { - m_map.incCurrentLevel() ; - Dart midV = m_map.phi1(m_map.phi1(dit)); - fe += m_position[midV]; - m_map.decCurrentLevel() ; - ++count; - } - - fe /= count; - fe *= 2 * m_a; - - m_map.incCurrentLevel() ; - Dart midF = m_map.phi1(d); - m_position[midF] -= fe; - m_map.decCurrentLevel() ; - } - } - TraversorV travV(m_map); for(Dart d = travV.begin() ; d != travV.end() ; d = travV.next()) { @@ -535,16 +359,22 @@ public: { Dart db = m_map.findBoundaryEdgeOfVertex(d); m_map.incCurrentLevel() ; - ev = (m_position[m_map.phi1(db)] + m_position[m_map.phi_1(db)]); + ev += (m_position[m_map.phi1(db)] + m_position[m_map.phi_1(db)]) * typename PFP::REAL(0.5); m_map.decCurrentLevel() ; - ev *= m_a; + ev *= 2 * m_a; - m_position[d] -= ev; + if(filtering) + { + m_position[db] = ev; + } + else + { + m_position[db] += ev; + } } else { unsigned int count = 0; - Traversor2VF travVF(m_map,d); for(Dart dit = travVF.begin(); dit != travVF.end() ; dit = travVF.next()) { @@ -562,16 +392,57 @@ public: ev /= count; ev *= 4 * m_a; + if(filtering) + { + m_position[d] = fv + ev; + } + else + { + m_position[d] += fv + ev; + } + } + } - m_position[d] -= fv + ev; + TraversorE travE(m_map); + for(Dart d = travE.begin() ; d != travE.end() ; d = travE.next()) + { + if(!m_map.isBoundaryEdge(d)) + { + unsigned int count = 0; + + typename PFP::VEC3 fe(0.0); + Traversor2EF travEF(m_map, d); + for(Dart dit = travEF.begin() ; dit != travEF.end() ; dit = travEF.next()) + { + m_map.incCurrentLevel() ; + Dart midV = m_map.phi1(m_map.phi1(dit)); + fe += m_position[midV]; + m_map.decCurrentLevel() ; + ++count; + } + + fe /= count; + fe *= 2 * m_a; + + m_map.incCurrentLevel() ; + Dart midF = m_map.phi1(d); + if(filtering) + { + m_position[midF] = fe; + } + else + { + m_position[midF] += fe; + } + m_map.decCurrentLevel() ; } } } -}; +} ; // s-scale(a) template -class Ber02ScaleAnalysisFilter : public Algo::MR::Filter +class Ber02ScaleSynthesisFilter : public Algo::MR::Filter { protected: typename PFP::MAP& m_map ; @@ -579,23 +450,23 @@ protected: typename PFP::VEC3::DATA_TYPE m_a; public: - Ber02ScaleAnalysisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) + Ber02ScaleSynthesisFilter(typename PFP::MAP& m, VertexAttribute& p, typename PFP::VEC3::DATA_TYPE a) : m_map(m), m_position(p), m_a(a) {} - void operator() (bool filtering) + void operator() () { } - void operator() () + void operator() (bool filtering) { TraversorV travV(m_map) ; for (Dart d = travV.begin(); d != travV.end(); d = travV.next()) { if(m_map.isBoundaryVertex(d)) - m_position[d] /= m_a; + m_position[d] *= m_a; else - m_position[d] /= m_a * m_a; + m_position[d] *= m_a * m_a; } TraversorE travE(m_map) ; @@ -604,11 +475,12 @@ public: m_map.incCurrentLevel() ; Dart midE = m_map.phi1(d); if(!m_map.isBoundaryVertex(midE)) - m_position[midE] /= m_a ; + m_position[midE] *= m_a ; m_map.decCurrentLevel() ; } } -}; +} ; + } // namespace Filters diff --git a/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.h b/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.h index 572804d834c9e24380883fcafeafa477ffadb309..3c299474dd6108090bf550927e7a287b5b436e5e 100644 --- a/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.h +++ b/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.h @@ -49,12 +49,12 @@ namespace Primal namespace Regular { -enum FilterType +enum FilteringType { F_HighPass = 0, F_LowPass, F_BandPass, - F_None, + F_None } ; template @@ -70,7 +70,7 @@ protected: std::vector synthesisFilters ; std::vector analysisFilters ; - FilterType filter; + FilteringType filter; unsigned int thresholdLow; unsigned int thresholdHigh; diff --git a/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.hpp b/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.hpp index 1f6370c40f9002a9f6259f3dbf5501eb6876553f..63a3a0abb18ef7419c7c881921b265b1546bed69 100644 --- a/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.hpp +++ b/include/Algo/Multiresolution/Map2MR/map2MR_PrimalRegular.hpp @@ -46,7 +46,7 @@ Map2MR::Map2MR(typename PFP::MAP& map) : shareVertexEmbeddings(true), filter(F_None) { - + std::cout << "filter = " << filter << std::endl; } template @@ -252,8 +252,15 @@ void Map2MR::analysis() m_map.decCurrentLevel() ; +// for(unsigned int i = 0; i < analysisFilters.size(); ++i) +// (*analysisFilters[i])() ; + for(unsigned int i = 0; i < analysisFilters.size(); ++i) - (*analysisFilters[i])() ; + { + std::cout << "filter false" << std::endl; + (*analysisFilters[i])(false) ; + } + } template @@ -261,24 +268,26 @@ void Map2MR::synthesis() { assert(m_map.getCurrentLevel() < m_map.getMaxLevel() || !"synthesis : called on max level") ; +// for(unsigned int i = 0; i < synthesisFilters.size(); ++i) +// (*synthesisFilters[i])() ; + for(unsigned int i = 0; i < synthesisFilters.size(); ++i) - (*synthesisFilters[i])() ; + { + std::cout << "filter = " << filter << std::endl; -// for(unsigned int i = 0; i < synthesisFilters.size(); ++i) -// { -// if((filter == F_LowPass && m_map.getCurrentLevel() <= thresholdHigh) || -// (filter == F_HighPass && m_map.getCurrentLevel() >= thresholdLow) || -// (filter == F_BandPass && (thresholdLow >= m_map.getCurrentLevel() && m_map.getCurrentLevel() <= thresholdHigh))) -// { -// std::cout << "without details" << std::endl; -// (*synthesisFilters[i])(true) ; -// } -// else -// { -// std::cout << "with details" << std::endl; -// (*synthesisFilters[i])(false) ; -// } -// } + if((filter == F_LowPass && m_map.getCurrentLevel() <= thresholdHigh))// || + //(filter == F_HighPass && m_map.getCurrentLevel() >= thresholdLow) || + //(filter == F_BandPass && (thresholdLow >= m_map.getCurrentLevel() && m_map.getCurrentLevel() <= thresholdHigh))) + { + std::cout << "filter true , currentLevel = " << m_map.getCurrentLevel() << ", level = " << thresholdHigh << std::endl; + (*synthesisFilters[i])(true) ; + } + else + { + std::cout << "filter false" << std::endl; + (*synthesisFilters[i])(false) ; + } + } m_map.incCurrentLevel() ; } diff --git a/include/Algo/Multiresolution/filter.h b/include/Algo/Multiresolution/filter.h index be59ecb4338a61ea4c13d678823dd0a86b3e8f8c..3c04bbb7ddb0b9abac41343e2c05a285f1eaf654 100644 --- a/include/Algo/Multiresolution/filter.h +++ b/include/Algo/Multiresolution/filter.h @@ -47,6 +47,7 @@ public: } ; + } // namespace MR } // namespace Algo