Файл 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)


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