{
filter(rl,r2,m,mlen,_div,_add); filter(gl,g2,m,mlen,_div, _add); filter(bl,b2,m,mlen,_div,_add);
}
float* operator[] (int nc) {return channel[nc];} } ;
template<class T>
void Fimage::loadrgb(T*src,int r,int g,int b)
{
int len=xlen*ylen;
Array2d asrc(len*3,0,0,3,1);
Array2d afi(len,0,0,1,1);
copy(len,1,src,channel[r],asrc,afi);
asrc.ox=l;
copy(len,1,src,channel[g],asrc,afi); asrc.ox=2;
copy(len,1,src,channel[b],asrc, afi);
}
void Fimage::filter(int nc,int dstnc,float*m,
int mien,float _div,float _add)
{
// индекс обрабатываемого пикселя в блоке int ind=mlen/2;
float newcolor; // новое значение пикселя // обрабатываем корректность _div if(_div==0) _div=accumulate(m,m+mlen*mlen,0); if(_div==0) _div=l;
Array2d ach(xlen); // для перемещения в канале Array2d atmp(mlen); // для tmp и m for(int j=0;j<ylen-mlen;j++) for(int i=0;i<xlen-mlen;i++)
{
ach.setorg(i,j);
newcolor=accum(multiplies<float>() ,plus<float>() , 0.Of,mien,mien,channel[nc] , m,ach,atmp)/_div+_add; channel[dstnc][ach.getind(ind,ind)]=newcolor;
}
}
void Fimage::tomono(int r,int g, int b)
{
for(int i=0;i<len;i++)
{
channel[r][i]=(channel[r][i]+
channel[g][i]+channel[b][i])/3; channel[g][i]=channel[r][i]; channel[b][i]=channel[r][i];
}
}
void Fimage::tored(int nc)
{
glPushAttrib(GL_COLOR_BUFFER_BIT); glColorMask(1,0, 0, 0) ;
glDrawPixels(xlen,ylen,GL_RED,GL_FLOAT,channel[nc]); glPopAttrib();
}
void Fimage::togreen(int nc)
{
glPushAttrib(GL_COLOR_BUFFER_BIT) ; glColorMask(0, 1, 0, 0) ;
glDrawPixels(xlen,ylen,GL_GREEN,GL_FLOAT, channel[nc] ) ;
glPopAttrib();
)
void Fimage::toblue(int nc)
{
glPushAttrib(GL_COLOR_BUFFER_BIT); glColorMask(0,0,1,0); glDrawPixels(xlen,ylen,GL_BLUE,
GL_FL0AT,channel[nc]); glPopAttrib();
)
void Fimage::toalpha(int nc)
{
glPushAttrib(GL_COLOR_BUFFER_BIT); glColorMask(0,0,0,1); glDrawPixels(xlen,ylen,GL_ALPHA,
GL_FL0AT,channel[nc]); glPopAttrib();
)
void Fimage::clear()
{
for(uint i=0;i<channel.size() ; i + +) delete[]channel[i]; channel.clear();
)
void Fimage::init(int _xlen,int _ylen,int nc)
{
clear();
xlen=_xlen; ylen=_ylen; len=xlen*ylen; channel.resize(nc); for(uint i=0;i<channel.size() ;i + +) channel[i]=new float[len];
)
#endi f
Файл fractset.h
Пример построения фракталов множества Мандельброта, множества Жюлиа и IFS фракталов.
ttifndef _fractals_ ttdefine _fractals_
// F(n)=F(n-1)л k + С struct Fractalset I
int w,h;// размер двухмерного массива p // массив изображения фрактала unsigned char*data;
// максимальное и минимальное значения complexf min,max;
complexf с; // дополнительная переменная int г; // радиус в квадрате
int maxit; // число итераций (также индекс цвета)
Fractalset(){init();}
-Fractalset(){if(data)delete[]data; }
void init(int ww=320,int hh=200,
complexf mmin=complexf(-2,-2), complexf mmax=complexf(2, 2) , int rr=4)
I
w=ww;h=hh;r=rr ;
if(data)delete[]data;
data=new unsigned char[w*h];
min=mmin;
max=mmax;
maxit=255;
c=complexf(-0.5,0);
}
// построение множества Мандельброта
void setM(int(*F) (complexf,complexf,int, int));
// построение множества Жюлиа
void setJ(int(*F) (complexf,complexf, int, int)) ;