};
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 плоскостей отсечения