RSS    

   Реферат: Трехмерная графика. Теория

 - - унарный минус и поэлементное вычитание векторов;

+ - поэлементное сложение векторов;

* - умножение вектора на число;

* - поэлементное умножение векторов;

/ - деление вектора на число;

/ - поэлементное деление векторов;

& - скалярное произведение векторов;

^ - векторное произведение;

! - длина вектора;

[] - компонента вектора.

При этом стандартные приоритеты операций сохраняются.

Кроме этих операций определяются также некоторые простейшие функции для работы с векторами:

Normalize – нормирование вектора;

RndVector – получение почти равномерно распределенного случайного единичного вектора;

Clip – отсечение вектора.

С использованием этого класса можно в естественной и удобной форме записывать сложные векторные выражения.

Аналогичным образом вводится класс Matrix, служащий для представления матриц преобразований в трехмерном пространстве. Для этого класса также производится переопределение основных знаков операций.

//Файл matrix.h

#ifndef __MATRIX__

#define __MATRIX__

#include "vector.h"

class Matrix

{

public:

 double x [4][4];

 Matrix () {};

 Matrix ( double );

 Matrix& operator += ( const Matrix& );

 Matrix& operator -= ( const Matrix& );

 Matrix& operator *= ( const Matrix& );

 Matrix& operator *= ( double );

 Matrix& operator /= ( double );

 void Invert ();

 void Transpose ();

 friend Matrix operator + ( const Matrix&, const Matrix& );

 friend Matrix operator - ( const Matrix&, const Matrix& );

 friend Matrix operator * ( const Matrix&, double );

 friend Matrix operator * ( const Matrix&, const Matrix& );

 friend Vector operator * ( const Matrix&, const Vector& );

};

Matrix Translate ( const Vector& );

Matrix Scale ( const Vector& );

Matrix RotateX ( double );

Matrix RotateY ( double );

Matrix RotateZ ( double );

Matrix Rotate ( const Vector&, double );

Matrix MirrorX ();

Matrix MirrorY ();

Matrix MirrorZ ();

#endif

//---------------------------------------------------------------------------

// Файл matrix.cpp

#include <math.h>#include "matrix.h"Matrix :: Matrix ( double v ){ int j; for ( int i = 0; i < 4; i++ ) for ( j = 0; j < 4; j++ ) x [i][j] = ( i == j ) ? v : 0.0; x [3][3] = 1;}void Matrix :: Invert ()

{

 Matrix Out ( 1 );

 for ( int i = 0; i < 4; i++ ) {

 double d = x [i][i];

 if ( d != 1.0 ) {

 for ( int j = 0; j < 4; j++ ) {

Out.x [i][j] /= d;

x [i][j] /= d;

 }

 }

 for ( int j = 0; j < 4; j++ ) {

 if ( j != i ) {

if ( x[j][i] != 0.0 ) {

 double mulby = x[j][i];

 for ( int k = 0; k < 4; k++ ) {

 x [j][k] -= mulby * x [i][k];

 Out.x [j][k] -= mulby * Out.x [i][k];

 }

}

 }

 }

 }

 *this = Out;

}

void Matrix :: Transpose ()

{

 double t;

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ )

 if ( i != j ) {

t = x [i][j];

x [i][j] = x [j][i];

x [j][i] = t;

 }

}

Matrix& Matrix :: operator += ( const Matrix& A )

{

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ )

 x [i][j] += A.x [i][j];

 return *this;

}

Matrix& Matrix :: operator -= ( const Matrix& A )

{

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ )

 x [i][j] -= A.x [i][j];

 return *this;

}

Matrix& Matrix :: operator *= ( double v )

{

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ )

 x [i][j] *= v;

 return *this;

}

Matrix& Matrix :: operator *= ( const Matrix& A )

{

 Matrix res = *this;

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ ) {

 double sum = 0;

 for ( int k = 0; k < 4; k++ )

sum += res.x [i][k] * A.x [k][j];

 x [i][j] = sum;

 }

 return *this;

}

Matrix operator + ( const Matrix& A, const Matrix& B )

{

 Matrix res;

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ )

 res.x [i][j] = A.x [i][j] + B.x [i][j];

 return res;

}

Matrix operator - ( const Matrix& A, const Matrix& B )

{

 Matrix res;

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ )

 res.x [i][j] = A.x [i][j] - B.x [i][j];

 return res;

}

Matrix operator * ( const Matrix& A, const Matrix& B )

{

 Matrix res;

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ ) {

 double sum = 0;

 for ( int k = 0; k < 4; k++ )

sum += A.x [i][k] * B.x [k][j];

 res.x [i][j] = sum;

 }

 return res;

}

Matrix operator * ( const Matrix& A, double v )

{

 Matrix res;

 int j;

 for ( int i = 0; i < 4; i++ )

 for ( j = 0; j < 4; j++ )

 res.x [i][j] = A.x [i][j] * v;

 return res;

}

Vector operator * ( const Matrix& M, const Vector& v )

{

 Vector res;

 res.x = v.x * M.x [0][0] + v.y * M.x [1][0] + v.z * M.x [2][0] + M.x [3][0];

 res.y = v.x * M.x [0][1] + v.y * M.x [1][1] + v.z * M.x [2][1] + M.x [3][1];

 res.z = v.x * M.x [0][2] + v.y * M.x [1][2] + v.z * M.x [2][2] + M.x [3][2];

 double denom = v.x * M.x [0][3] + v.y * M.x [1][3] +

 v.z * M.x [2][3] + M.x[3][3];

 if ( denom != 1.0 )

 res /= denom;

 return res;

}

Matrix Translate ( const Vector& Loc )

{

 Matrix res ( 1 );

 res.x [3][0] = Loc.x;

 res.x [3][1] = Loc.y;

 res.x [3][2] = Loc.z;

 return res;

};

Matrix Scale ( const Vector& v )

{

 Matrix res ( 1 );

 res.x [0][0] = v.x;

 res.x [1][1] = v.y;

 res.x [2][2] = v.z;

 return res;

};

Matrix RotateX ( double Angle )

{

 Matrix res ( 1 );

 double Cosine = cos ( Angle );

 double Sine = sin ( Angle );

 res.x [1][1] = Cosine;

 res.x [2][1] = - Sine;

 res.x [1][2] = Sine;

 res.x [2][2] = Cosine;

 return res;

};

Matrix RotateY ( double Angle )

{

 Matrix res ( 1 );

 double Cosine = cos ( Angle );

 double Sine = sin ( Angle );

 res.x [0][0] = Cosine;

 res.x [2][0] = - Sine;

 res.x [0][2] = Sine;

 res.x [2][2] = Cosine;

 return res;

};

Matrix RotateZ ( double Angle )

{

 Matrix res ( 1 );

 double Cosine = cos ( Angle );

 double Sine = sin ( Angle );

 res.x [0][0] = Cosine;

 res.x [1][0] = - Sine;

 res.x [0][1] = Sine;

 res.x [1][1] = Cosine;

 return res;

};

Matrix Rotate ( const Vector& axis, double angle )

{

 Matrix res ( 1 );

 double Cosine = cos ( angle );

 double Sine = sin ( angle );

 res.x [0][0] = axis.x * axis.x + ( 1 - axis.x * axis.x ) * Cosine;

 res.x [0][1] = axis.x * axis.y * ( 1 - Cosine ) + axis.z * Sine;

 res.x [0][2] = axis.x * axis.z * ( 1 - Cosine ) - axis.y * Sine;

 res.x [0][3] = 0;

 res.x [1][0] = axis.x * axis.y * ( 1 - Cosine ) - axis.z * Sine;

 res.x [1][1] = axis.y * axis.y + ( 1 - axis.y * axis.y ) * Cosine;

 res.x [1][2] = axis.y * axis.z * ( 1 - Cosine ) + axis.x * Sine;

 res.x [1][3] = 0;

 res.x [2][0] = axis.x * axis.z * ( 1 - Cosine ) + axis.y * Sine;

 res.x [2][1] = axis.y * axis.z * ( 1 - Cosine ) - axis.x * Sine;

 res.x [2][2] = axis.z * axis.z + ( 1 - axis.z * axis.z ) * Cosine;

 res.x [2][3] = 0;

 res.x [3][0] = 0;

 res.x [3][1] = 0;

 res.x [3][2] = 0;

 res.x [3][3] = 1;

 return res;

};

Matrix MirrorX ()

{

 Matrix res ( 1 );

 res.x [0][0] = -1;

 return res;

};

Matrix MirrorY ()

{

 Matrix res ( 1 );

 res.x [1][1] = -1;

 return res;

};

Matrix MirrorZ ()

{

 Matrix res ( 1 );

 res.x [2][2] = -1;

 return res;

}

В следующей библиотеке была реализована работа с трехмерными объектами: гранью, графическим объектом и пространством. Реализованы следующие возможности:

поворот объектов вокруг координатных осей;

зеркальное отображение объектов по отношению к координатным осям;

центральное и параллельное проектирование;

масштабирование объектов;

удаление невидимых поверхностей;

перемещение объектов в пространстве.

//Файл 3dworks.h

#ifndef __3DWORKS__#define __3DWORKS__#include <graphics.h>

#include <stdlib.h>

#include "vector.h"

#include "matrix.h"

#define OneSd 0

#define TwoSds 1

#define MaxPoints 10

#define MaxFacets 10

#define MaxObjects 10

class Polygon

{

public:

 int PointNumber;

 Vector * Point;

 Vector Normal;

 Vector Center;

 int Color;

Страницы: 1, 2, 3


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.