Файл vertex.h
Как упоминалось, OpenGL является достаточно низким API. Поэтому для достижения многих вещей необходимо знать линейную алгебру. Класс Vertex содержит простейшие операции над вершинами и векторами.
#ifndef _Vertex_
#define _Vertex_
#define toRadian 0.017453289 // pi/180.0
#define toDegree 57.295779513 // 180.0/pi
struct Vertex // точка (вектор) в пространстве {
float x,y,z; // координаты вершины
// инициализация, конструкторы
void set(float хх=0, float уу=0,float zz=0)
{x=xx;y=yy;z=zz; } void set(const Vertex&a) {set(a.x,a.y,a.z);} void set(float*v) {set(v[0],v[1],v[2]);}
Vertex() {set (0,0,0) ; }
Vertex(float xx, float yy,float zz) {set(xx,yy,zz);} Vertex(float*v){set(v);}
Vertex(Vertexi a){set(a);}
~Vertex(){;} // для теста // преобразования, нахождение точки // отбросить дробные части у координат void round() {х=(int)х;у=(int)у;z=(int)z;}
// сложение (сдвиг)
void add(Vertex&a) {x+=a.x;y+=a.у;z+=a.z;}
// вычитание (сдвиг)
void sub(Vertex&a) {x-=a.x;y-=a.у;z-=a.z;}
// умножение на число
void mul(float а) {х*=а;у*=а;z*=a;}
// деление на число
void div(float а) {х/=а;у/=а;z/=a;}
// унарный минус
void uminus() {х=-х; y=-y;z=-z;}
// масштабирование
void scale(float xx,float yy,float zz)
(x*=xx;y*=yy;z* = zz; }
// вычислить середину между указанными точками void mid(Vertex&a, Vertex&b)
{x=(b.x+a.x)/2;y=(b.y+a.y)/2;z=(b.z+a.z)/2;} void mirror(Vertex a)
{a.sub(* this); a.mul(2); add(a);}
// вращение вокруг Z в // правосторонней системе координат void rotz(float angle)
{
angle*=toRadian;
float xx=x*cos(angle)-y*sin(angle); float yy=x*sin(angle)+y*cos(angle) ; x=xx;y=yy;
}
// перемещение точки на вектор (0,0,1) повернутого // на углы ха вокруг оси X и уа вокруг оси Y в // левосторонней системе координат void move(float 1,float xa,float уа)
{
float k;
Vertex tmp; xa*=toRadian; ya*=toRadian; k=cos(xa);
tmp.set(-sin(ya)*k,sin(xa),cos(ya)*k); tmp.mul(1); add(tmp);
}
// длина вектора
float lent) {return sqrt(x*x+y*y+z*z);}
// косинус угла между вектором и осью X float cosX() {return x/len();}
// косинус угла между вектором и осью Y float cosY() {return у/len();}
// косинус угла между вектором и осью Z float cosZ() {return z/len();>
// привидение к единичной длине (нормализация; void normalize()
{float l=sqrt(x*x+y*y+z*z);x/=l;y/=l;z/=l;}
// колинеарны ли два вектора int iscolinear(Vertex&a)
{return (x/a.x==y/a.y)&&(y/a.y==z/a.z);)
// склалярное произведение float mul_scalar(Vertex&a)
{return x*a.x+y*a.y+z*a.z;)
// векторное произведение (нормаль) void mul_vector(Vertex&a)
{float xx=y*a.z-z*a.y,yy=z*a.x-x*a.z, zz=x*a.y-y*a.x;x=xx;y=yy;z=zz;)
// косинус между векторами float cos_vertex(Vertex&a)
{return mul_scalar(a)/(len()*a.len());}
// находятся ли точки no одну сторону плоскости int is_onside(Vertex&a, float*plane)
{
float isl=plane[0]*x+plane[1]*y+ plane[2]*z+plane[3]; float is2=plane[0]*a.x+plane[l]*a.y+ plane[2]* a.z+plane[3]; return (isl*is2>0)?1:0;
}
// умножение на матрицу, элементы по строкам void mul_matrl(float*m)