Скачать 0.59 Mb.
|
product.W=1; return product; } matrix.h #ifndef MATRIX_H #define MATRIX_H #include "ScalarTypes.h" #include "vector.h" struct Matrix { union{ scalar array1D[16]; scalar array2D[4][4]; struct { scalar _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _A, _B, _C, _D, _E, _F; }; struct { scalar _00, _01, _02, _03, _10, _11, _12, _13, _20, _21, _22, _23, _30, _31, _32, _33; }; struct { scalar a, b, c, p, d, e, f, q, g, h, i, r, x, y, z, w; }; }; Matrix(); inline Matrix(const scalar array1D[16]);//? inline inline Matrix(const scalar array2D[4][4]); inline Matrix(const scalar array0[4], const scalar array1[4], const scalar array2[4], const scalar array3[4]); inline Matrix(const Vector &vec0, const Vector &vec1, const Vector &vec2, const Vector &vec3); Matrix( scalar _0, scalar _1, scalar _2, scalar _3, scalar _4, scalar _5, scalar _6, scalar _7, scalar _8, scalar _9, scalar _A, scalar _B, scalar _C, scalar _D, scalar _E, scalar _F); inline Matrix &set_value(const scalar array1D[16]); inline Matrix &set_value(const scalar array2D[4][4]); inline Matrix &set_value(const scalar array0[4], const scalar array1[4], const scalar array2[4], const scalar array3[4]); inline Matrix &set_value(const Vector &vec0, const Vector &vec1, const Vector &vec2, const Vector &vec3); inline Matrix &set_value( scalar _0, scalar _1, scalar _2, scalar _3, scalar _4, scalar _5, scalar _6, scalar _7, scalar _8, scalar _9, scalar _A, scalar _B, scalar _C, scalar _D, scalar _E, scalar _F); Matrix inverse() const; Matrix transpose() const; Matrix operator - () const; Vector &operator [] (IDX i); const Vector &operator [] (IDX i) const; scalar &operator () (IDX i); const scalar &operator () (IDX i) const; scalar &operator () (IDX i, IDX j); const scalar &operator () (IDX i, IDX j) const; Matrix &operator += (scalar _); Matrix &operator -= (scalar _); Matrix &operator *= (scalar _); Matrix &operator /= (scalar _); Matrix &operator += (const Matrix &mat); Matrix &operator -= (const Matrix &mat); Matrix &operator *= (const Matrix &mat); friend Matrix operator + (const Matrix &mat, scalar _); friend Matrix operator - (const Matrix &mat, scalar _); friend Matrix operator * (const Matrix &mat, scalar _); friend Matrix operator / (const Matrix &mat, scalar _); friend Matrix operator + (const Matrix &mat1, const Matrix &mat2); friend Matrix operator - (const Matrix &mat1, const Matrix &mat2); friend Matrix operator * (const Matrix &mat1, const Matrix &mat2); friend Matrix identity(); friend Matrix scale(scalar _); friend Matrix scale(const Vector &vec); friend Matrix translate(const Vector &vec); friend Matrix rotate(Vector axis, scalar angle); }; #endif matrix.cpp #include "stdafx.h" #include "ScalarTypes.h" #include "vector.h" #include "matrix.h" inline scalar ABS(scalar x) { return x>=0?x:-x; } Matrix::Matrix() {} inline Matrix::Matrix(const scalar array1D[16]) { set_value(array1D); } inline Matrix::Matrix(const scalar array2D[4][4]) { set_value(array2D); } inline Matrix::Matrix(const scalar array0[4], const scalar array1[4], const scalar array2[4], const scalar array3[4]) { set_value(array0, array1, array2, array3); } inline Matrix::Matrix(const Vector &vec0, const Vector &vec1, const Vector &vec2, const Vector &vec3) { set_value(vec0, vec1, vec2, vec3); } Matrix::Matrix(scalar _0, scalar _1, scalar _2, scalar _3, scalar _4, scalar _5, scalar _6, scalar _7, scalar _8, scalar _9, scalar _A, scalar _B, scalar _C, scalar _D, scalar _E, scalar _F) { set_value( _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _A, _B, _C, _D, _E, _F); } inline Matrix &Matrix::set_value(const scalar array1D[16]) { for (IDX i=0; i < 16; i++) Matrix::array1D[i]=array1D[i]; return *this; } inline Matrix &Matrix::set_value(const scalar array2D[4][4]) { for (IDX i=0; i < 16; i++) Matrix::array2D[0][i]=array2D[0][i]; return *this; } inline Matrix &Matrix::set_value(const scalar array0[4], const scalar array1[4], const scalar array2[4], const scalar array3[4]) { for (IDX i=0; i < 4; i++) array2D[0][i]=array0[i]; for (i=0; i < 4; i++) array2D[1][i]=array1[i]; for (i=0; i < 4; i++) array2D[2][i]=array2[i]; for (i=0; i < 4; i++) array2D[3][i]=array3[i]; return *this; } inline Matrix &Matrix::set_value(const Vector &vec0, const Vector &vec1, const Vector &vec2, const Vector &vec3) { for (IDX i=0; i < 4; i++) array2D[0][i]=vec0[i]; for (i=0; i < 4; i++) array2D[1][i]=vec1[i]; for (i=0; i < 4; i++) array2D[2][i]=vec2[i]; for (i=0; i < 4; i++) array2D[3][i]=vec3[i]; return *this; } inline Matrix &Matrix::set_value(scalar _0, scalar _1, scalar _2, scalar _3, scalar _4, scalar _5, scalar _6, scalar _7, scalar _8, scalar _9, scalar _A, scalar _B, scalar _C, scalar _D, scalar _E, scalar _F) { Matrix::_0=_0, Matrix::_1=_1, Matrix::_2=_2, Matrix::_3=_3; Matrix::_4=_4, Matrix::_5=_5, Matrix::_6=_6, Matrix::_7=_7; Matrix::_8=_8, Matrix::_9=_9, Matrix::_A=_A, Matrix::_B=_B; Matrix::_C=_C, Matrix::_D=_D, Matrix::_E=_E, Matrix::_F=_F; return *this; } Matrix Matrix::inverse() const { scalar mat[4][8]={ array2D[0][0], array2D[0][1], array2D[0][2], array2D[0][3], 1.0, 0.0, 0.0, 0.0, array2D[1][0], array2D[1][1], array2D[1][2], array2D[1][3], 0.0, 1.0, 0.0, 0.0, array2D[2][0], array2D[2][1], array2D[2][2], array2D[2][3], 0.0, 0.0, 1.0, 0.0, array2D[3][0], array2D[3][1], array2D[3][2], array2D[3][3], 0.0, 0.0, 0.0, 1.0 }; scalar *rows[4]={ mat[0], mat[1], mat[2], mat[3] }; for (IDX i=0; i < 4; i++) { IDX row_num=i; scalar major=ABS(rows[i][i]); for (IDX r=i+1; r < 4; r++) { scalar cur_ABS=ABS(rows[r][i]); if (cur_ABS > major) { major=cur_ABS; row_num=r; } } if (row_num != i) { (int &)rows[i]^=(int)rows[row_num];//? (int &)rows[row_num]^=(int)rows[i]; (int &)rows[i]^=(int)rows[row_num]; } for (r=i+1; r < 4; r++) { scalar factor=rows[r][i]/rows[i][i]; for (IDX c=i; c < 8; c++) rows[r][c]-=factor*rows[i][c]; } } for (i=3; i > 0; i--) for (IDX r=0; r < i; r++) { scalar factor=rows[r][i]/rows[i][i]; for (IDX c=4; c < 8; c++) rows[r][c]-=factor*rows[i][c]; } return Matrix( rows[0][4]/rows[0][0], rows[0][5]/rows[0][0], rows[0][6]/rows[0][0], rows[0][7]/rows[0][0], rows[1][4]/rows[1][1], rows[1][5]/rows[1][1], rows[1][6]/rows[1][1], rows[1][7]/rows[1][1], rows[2][4]/rows[2][2], rows[2][5]/rows[2][2], rows[2][6]/rows[2][2], rows[2][7]/rows[2][2], rows[3][4]/rows[3][3], rows[3][5]/rows[3][3], rows[3][6]/rows[3][3], rows[3][7]/rows[3][3]); } Matrix Matrix::transpose() const { return Matrix( array2D[0][0], array2D[1][0], array2D[2][0], array2D[3][0], array2D[0][1], array2D[1][1], array2D[2][1], array2D[3][1], array2D[0][2], array2D[1][2], array2D[2][2], array2D[3][2], array2D[0][3], array2D[1][3], array2D[2][3], array2D[3][3]); } Matrix Matrix::operator - () const { return Matrix( -_0, -_1, -_2, -_3, -_4, -_5, -_6, -_7, -_8, -_9, -_A, -_B, -_C, -_D, -_E, -_F); } Vector &Matrix::operator [] (IDX i) { return (Vector &)array2D[i][0]; } const Vector &Matrix::operator [] (IDX i) const { return (Vector &)array2D[i][0]; } scalar &Matrix::operator () (IDX i) { return array1D[i]; } const scalar &Matrix::operator () (IDX i) const { return array1D[i]; } scalar &Matrix::operator () (IDX i, IDX j) { return array2D[i][j]; } const scalar &Matrix::operator () (IDX i, IDX j) const { return array2D[i][j]; } Matrix &Matrix::operator += (scalar _) { for (IDX i=0; i < 16; i++) this->operator () (i) += _; return *this; } Matrix &Matrix::operator -= (scalar _) { for (IDX i=0; i < 16; i++) this->operator () (i) -= _; return *this; } Matrix &Matrix::operator *= (scalar _) { for (IDX i=0; i < 16; i++) this->operator () (i) *= _; return *this; } Matrix &Matrix::operator /= (scalar _) { for (IDX i=0; i < 16; i++) this->operator () (i) /= _; return *this; } Matrix &Matrix::operator += (const Matrix &mat) { for (IDX i=0; i < 16; i++) this->operator () (i) += mat(i); return *this; } Matrix &Matrix::operator -= (const Matrix &mat) { for (IDX i=0; i < 16; i++) this->operator () (i) -= mat(i); return *this; } Matrix &Matrix::operator *= (const Matrix &mat) { return *this=*this*mat;//? } Matrix operator + (const Matrix &mat, scalar _) { return Matrix(mat)+=_; } Matrix operator - (const Matrix &mat, scalar _) { return Matrix(mat)-=_; } Matrix operator * (const Matrix &mat, scalar _) { return Matrix(mat)*=_; } Matrix operator / (const Matrix &mat, scalar _) { return Matrix(mat)/=_; } Matrix operator + (const Matrix &mat1, const Matrix &mat2) { return Matrix(mat1)+=mat2; } Matrix operator - (const Matrix &mat1, const Matrix &mat2) { return Matrix(mat1)-=mat2; } Matrix operator * (const Matrix &mat1, const Matrix &mat2) { Matrix product( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); for (IDX i=0; i < 4; i++) for (IDX j=0; j < 4; j++) for (IDX k=0; k < 4; k++) product(i, j)+=mat1(i, k)*mat2(k, j); return product; } Matrix identity() { return scale(1.0); } Matrix scale(scalar _) { return scale(Vector(_, _, _)); } Matrix scale(const Vector &vec) { return Matrix( vec.X, 0.0 , 0.0 , 0.0 , 0.0 , vec.Y, 0.0 , 0.0 , 0.0 , 0.0 , vec.Z, 0.0 , 0.0 , 0.0 , 0.0 , vec.W); } Matrix translate(const Vector &vec) { return Matrix( 1.0 , 0.0 , 0.0 , 0.0, 0.0 , 1.0 , 0.0 , 0.0, 0.0 , 0.0 , 1.0 , 0.0, vec.X, vec.Y, vec.Z, 1.0); } Matrix rotate(Vector axis, scalar angle) { axis.normalize3(); scalar &x=axis.X, &y=axis.Y, &z=axis.Z, sin_angle=sin(angle), cos_angle=cos(angle); return Matrix( (1.0-x*x)*cos_angle+x*x , z*sin_angle+x*y*(1.0-cos_angle), x*z*(1.0-cos_angle)-y*sin_angle, 0.0, x*y*(1.0-cos_angle)-z*sin_angle, (1.0-y*y)*cos_angle+y*y , y*z*(1.0-cos_angle)+x*sin_angle, 0.0, x*z*(1-cos_angle)+y*sin_angle , y*z*(1-cos_angle)-x*sin_angle , (1-z*z)*cos_angle+z*z , 0.0, 0.0 , 0.0 , 0.0 , 1.0); } raster scale.cpp // raster scale.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "resource.h" #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text // Foward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); FrameBuffer frame_buffer, smallBitmap, largeBitmap; RECT fb_rt; int large_width = 8, large_height = 16; scalar weight = sqrt(2)/2, line_offset = 0.0, curve_offset = 0.5; bool draw_curve = true, color_curve = false; void Init() { character ch={new scalar[4*4], new scalar[1*15], 4, 1}; ch.lines[0]=0+line_offset; ch.lines[1]=0+line_offset; ch.lines[2]=0+line_offset; ch.lines[3]=14+line_offset; ch.lines[4]=1+line_offset; ch.lines[5]=15+line_offset; ch.lines[6]=6+line_offset; ch.lines[7]=15+line_offset; ch.lines[8]=7+line_offset; ch.lines[9]=14+line_offset; ch.lines[10]=7+line_offset; ch.lines[11]=10+line_offset; ch.lines[12]=6+line_offset; ch.lines[13]=9+line_offset; ch.lines[14]=1+line_offset; ch.lines[15]=9+line_offset; ch.curves[0x0]=0+line_offset; //x ch.curves[0x1]=curve_offset; //offset ch.curves[0x2]=14+line_offset; //y ch.curves[0x3]=curve_offset; //offset ch.curves[0x4]=1; //weight ch.curves[0x5]=(0+line_offset)*weight; //x ch.curves[0x6]=curve_offset*weight; //offset ch.curves[0x7]=(15+line_offset)*weight; //y ch.curves[0x8]=curve_offset*weight; //offset ch.curves[0x9]=weight; //weight ch.curves[0xa]=1+line_offset; //x ch.curves[0xb]=curve_offset; //offset ch.curves[0xc]=15+line_offset; //y ch.curves[0xd]=curve_offset; //offset ch.curves[0xe]=1; //weight smallBitmap.Init(8, 16); smallBitmap.Clear(RGBA(255, 255, 255, 255)); /* smallBitmap.Line(0, 0, 0, 14, 0); smallBitmap.Line(1, 15, 6, 15, 0); smallBitmap.Line(7, 14, 7, 10, 0); smallBitmap.Line(6, 9, 1, 9, 0);*/ // largeBitmap=Up(smallBitmap, 16, 16); // largeBitmap = new FrameBuffer; largeBitmap.Init(large_width, large_height); largeBitmap.Clear(RGBA(255, 255, 255, 255)); /* largeBitmap->Line(0, 0, 0, 14*scale, 0); largeBitmap->Line(1*scale, 15*scale, 6*scale, 15*scale, 0); largeBitmap->Line(7*scale, 14*scale, 7*scale, 10*scale, 0); largeBitmap->Line(6*scale, 9*scale, 1*scale, 9*scale, 0); largeBitmap->Bezier( Vector(0, 14*scale, 0, 1)*weight, Vector(0, 15*scale, 0, 1)*weight, Vector(1*scale, 15*scale, 0, 1)*weight, 0);*/ smallBitmap.DrwaChar(&ch, 0, 1, 1); |
Реферат: Коваленко А. Е. Разработка системы научной визуализации.... Коваленко А. Е. Разработка системы научной визуализации. Квалификационная работа на степень магистра наук по направлению «Математика.... | Реферат Флягина Т. А. Проблемы разработки многооконных интерфейсов,... Флягина Т. А. Проблемы разработки многооконных интерфейсов, квалификационная работа на степень бакалавра наук | ||
Квалификационной работы на факультете математики и компьютерных наук В соответствии с действующими государственными образовательными стандартами выпускная квалификационная работа по специальности «Математика»... | Диссертация на степень магистра наук по направлению «Математика, компьютерные науки» Федеральное государственное автономное образовательное учреждение высшего профессионального образования | ||
Дипломная работа по направлению Математика. Прикладная математика студента гр. Мт 505 Федеральное государственное автономное образовательное учреждение высшего профессионального образования | Программа дисциплины Современные методы принятия решений для направления... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления подготовки 010400.... | ||
Программа дисциплины «Герменевтика» для направления 010400. 68 «Прикладная... Программа предназначена для преподавателей, ведущих данную дисциплину, и студентов направления подготовки 010400. 68 "Прикладная... | 1 Нормативные документы для разработки ооп впо по направлению подготовки... Общая характеристика вузовской основной образовательной программы высшего профессионального образования по направлению подготовки... | ||
Реферат Тычинин И. А. Разработка приложения для портативных устройств... Тычинин И. А. Разработка приложения для портативных устройств с использованием qt framework, квалификационная работа на степень бакалавра... | Основная образовательная программа (ооп) бакалавриата, реализуемая... Нормативные документы для разработки ооп бакалавриата по направлению подготовки «Прикладная математика и информатика» | ||
Программа дисциплины Архитектура ЭВМ для направления 010400. 68 «Прикладная... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направлений подготовки 010400.... | Образовательная программа высшего образования, реализуемая университетом... ... | ||
Литература Уросов А. П. Разработка методик визуализации для представления работы параллельных программ, квалификационная работа на степень бакалавра... | ЕН. Ф. 1 Математика и информатика: математика Учебная дисциплина Математика и информатика: "Математика" введена в процесс обучения для бакалавров по направлению подготовки "Художественное... | ||
Программа дисциплины «Модели корпусной лингвистики» для направления... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления 010400. 68 "Прикладная... | Программа дисциплины «История» для направления 231300. 62 и 230700.... Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления подготовки 231300.... |