{

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)) ;


⇐ вернуться назад | | далее ⇒