};

void Array2d::init(int xl,int _ox,int _oy,

int _sx,int _sy)

{

xlen=xl; ox=_ox; oy=_oy; sx=_sx; sy=_sy; ind=0;

}

// копировать один блок элементов в другой

template<class Src,class Dst>

void copy(int xl,int yl,Src src,Dst dst,

Array2d& sind,Array2d& dind)

{

for(int j=0;j<yl;j++)

{

sind.setind(0,j); dind.setind(0,j); for(int i=0;i<xl;i++)

dst[dind++]=src[sind++];

}

}

// присвоить элементам значение v template<class Dst,class T>

void fill(T v,int xl,int yl,Dst dst,Array2d&dind) {

for(int j=0;j<yl;j++)

{

dind.setind(0,j); for(int i=0;i<xl;i++) dst[dind++]=v;

}

}

// выполнить функцию f над каждым элементом template<class Dst,class Т,class Tl> void for_each(T f,Tl arg,int xl,

int yl,Dst dst,Array2d&dind)

{

for(int j =0;j<yl;j + +)

{

dind.setind(0,j); for(int i=0;i<xl;i++)

dst[dind]=f(dst[dind++],arg);

}

}

/*

Накопление результатов некоторой функции. Например, при вычислении суммы произведений fa функция сложения, a f функция произведения. */

template<class Src,class Т,class Tf,class Tfa> T accum(Tf f, Tfa fa,T init,int xl,int yl,

Src srcl,Src src2,Array2d& indl, Array2d& ind2)

{

for(int j=0;j<yl;j++)

{

indl.setind(0, j ) ; ind2.setind(0,j); for(int i=0;i<xl;i++) init=fa(init,f(srcl[indl++],src2[ind2++]));

}

return init;

}

#endif

Файл mtrans.h

Хотя для работы с матрицами преобразований рекомендуется использовать функции OpenGL, в некоторых случаях проще воспользоваться собственными функциями. В основном это связано с тем, что команда сохранения значений элементов текущей матрицы в памяти не сохраняется в списке отображения.

#ifndef _M_TRANFORMATION_

#define _M_TRAN FORMATION_

struct Mtransform // матрица преобразований {

float m[16];

Mtransform() {identity() ; } void identity()

{

fill_n(m,16,0); m[0]=m[5]=m[10]=m[15]=1;

}

// перемножение матриц 4x4

void mul(float*Ml,float*M2,float*R)

{

float temp[16]; // для хранения результата if(Ml==0) Ml=m; if(M2==0) M2=m;

for(int i=0;i<4;i++) // строки for(int j=0;j<4;j++) // столбцы

// сумма произведений i строки Ml и j столбца М2 temp[i * 4 +j]=Ml[i*4]*M2[j]+M1[i*4 + l]*M2[4 + j]

+M1[i*4+2]*M2[8+j]+M1[i*4+3]*M2[12+j]; if(R==0) R=m;

copy(temp,temp+16,R); // сохраняем результат

}

floats operator[](int i){return m[i];} void operator=(float*v) {copy(v,v+16,m);} operator float* () {return m; }

};

#endif

Файл glmain.h

Класс GLmain содержит все необходимое для связи OpenGL с окном. OpenGL инициализируется на работу с буфером трафарета, буфером выбора и буфером обратной связи в RGBA режиме. Класс также содержит функцию для преобразования Windows шрифтов в списки отображения.

#ifndef _GLmain_

#define _GLmain_ struct GLmain {

HGLRC hrc;

HDC hdc;

HWND hwnd;

int select_size; // размер буфера выбора

int feedback_size; // размер буфера обратной связи

uint* select; // буфер выбора

float* feedback; // буфер обратной связи

float l,r,t,b,n,f; // 6 плоскостей отсечения


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