00001 #ifndef __GACCUMULATEUR_HPP__
00002 #define __GACCUMULATEUR_HPP__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "Commun.hpp"
00034 namespace Fractale
00035 {
00036
00037
00045 struct GAccumulateur
00046 {
00047 Zone m_zone;
00055 unsigned int toI(const point &z )
00056 {
00057 return static_cast<unsigned int>
00058 (
00059
00060 (m_zone.imgH - 1)
00061 *
00062 (z.imag() - m_zone.y)
00063 /
00064 m_zone.h
00065 );
00066 }
00073 unsigned int toJ(const point &z)
00074 {
00075 return static_cast<unsigned int>
00076 (
00077
00078 (m_zone.imgL - 1)
00079 *
00080 (z.real() - m_zone.x)
00081 /
00082 m_zone.l
00083 );
00084 }
00085
00093 virtual void accumuler(Image<unsigned int> &res, const point &pInit, const std::vector<point> &seq) = 0;
00094
00095 };
00096
00097
00101 struct AccumulerSurLaSequence : public GAccumulateur
00102 {
00103
00112 void accumuler(Image<unsigned int> &resultat, const point &,const std::vector<point> & sequence)
00113 {
00114 std::vector<point>::const_iterator it = sequence.begin();
00115 std::vector<point>::const_iterator end = sequence.end();
00116 while (it != end)
00117 {
00118
00119 unsigned int i = toI(*it);
00120 unsigned int j = toJ(*it);
00121
00122 if(resultat.isValid(i,j))
00123 {
00124
00125 ++ resultat.pixel(i,j);
00126 }
00127
00128 ++it;
00129 }
00130 }
00131 };
00132
00133
00137 struct AccumulerSurOrigine : public GAccumulateur
00138 {
00139 void accumuler(Image<unsigned int> & resultat,const point & pInit,const std::vector<point> & sequence)
00140 {
00141 if(sequence.size() > 0 )
00142 {
00143
00144 unsigned int i = toI(pInit);
00145 unsigned int j = toJ(pInit);
00146
00147 if(resultat.isValid(i,j))
00148 {
00149
00150 resultat.pixel(i,j) += sequence.size() ;
00151 }
00152 }
00153 }
00154 };
00155 }
00156
00157 #endif