-
Notifications
You must be signed in to change notification settings - Fork 0
/
GeneralLib.h
184 lines (134 loc) · 10.7 KB
/
GeneralLib.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
//----------------------------------------------------------------------------//
// *** КВАТЕРНИОННО-ВЕКТОРНО-МАТРИЧНАЯ БИБЛИОТЕКА *** //
// //
// Файл GeneralLib.h //
// //
// Общематематические сущности //
// //
// Автор ГЛУЩЕНКО Сергей //
// //
// Москва //
//----------------------------------------------------------------------------//
#ifndef GeneralLibH
#define GeneralLibH
#include <math.h>
//--- Вектор трёхмерный ---
struct Vector
{
public:
Vector() : x(0.0), y(0.0), z(0.0) {}
//--- Метаданные ---
double x, y, z;
//--- Перегруженные операции ---
friend struct Vector operator+(struct Vector A, struct Vector B); //Сложение двух векторов [ + ]
friend struct Vector operator-(struct Vector A, struct Vector B); //Вычитание двух векторов [ - ]
friend double operator*(struct Vector A, struct Vector B); //Скалярное умножение векторов [ * ]
friend struct Vector operator^(struct Vector A, struct Vector B); //Векторное умножение векторов [ ^ ]
friend struct Vector operator*(struct Vector V, double S); //Умножение вектора на скаляр [ * ]
//--- Инициализирующие методы ---
//Инициализирует вектор нулями
void Empty(void);
//Инициализирует вектор заданными значениями
void Data(double ValueX, double ValueY, double ValueZ);
//--- Свойства только для чтения ---
//Возвращает модуль вектора
double getModul(void);
//Возвращает единичный вектор по направлению заданного
struct Vector getBasis(void);
};
typedef struct Vector TVector;
//--- Матрица 3х3 ---
struct Matrix
{
public:
//--- Метаданные ---
TVector FirstString, SecondString, ThirdString;
//--- Перегруженные операции ---
friend TVector operator*(struct Matrix M, TVector V); //Произведение матрицы на вектор [ * ]
friend struct Matrix operator+(struct Matrix A, struct Matrix B); //Сложение двух матриц [ + ]
friend struct Matrix operator-(struct Matrix A, struct Matrix B); //Вычитание двух матриц [ - ]
friend struct Matrix operator*(struct Matrix A, struct Matrix B); //Произведение двух матриц [ * ]
//--- Инициализирующие методы ---
//Инициализирует матрицу нулями
void Empty(void);
//Инициализирует матрицу заданными значениями (запись по строкам)
void Data(double a, double b, double c, double d, double e, double f, double g, double h, double k);
//Инициализирует матрицу заданными значениями
void DataVect(TVector FirstStr, TVector SecondStr, TVector ThirdStr);
//Матрица вращения вокруг оси OX на заданный угол. Угол вращения считается положительным, если он виден из
// конца оси, вокруг которой происходит вращение, против часовой стрелки
void OXMatrix(double Angle);
//Матрица вращения вокруг оси OY на заданный угол. Угол вращения считается положительным, если он виден из
// конца оси, вокруг которой происходит вращение, против часовой стрелки
void OYMatrix(double Angle);
//Матрица вращения вокруг оси OZ на заданный угол. Угол вращения считается положительным, если он виден из
// конца оси, вокруг которой происходит вращение, против часовой стрелки
void OZMatrix(double Angle);
//Получает матрицу вращения по заданным трем углам поворота вокруг осей OX, OY, OZ. О знаках углов поворота
// смотри комментарии для функций OXMatrix, OYMatrix, OZMatrix
// Order задает порядок поворота системы координат вокруг базовых осей
// 1 - "xyz" - поворот вокруг оси OX, затем вокруг оси OY, затем вокруг оси OZ
// 2 - "xzy" - поворот вокруг оси OX, затем вокруг оси OZ, затем вокруг оси OY
// 3 - "yxz" - поворот вокруг оси OY, затем вокруг оси OX, затем вокруг оси OZ
// 4 - "yzx" - поворот вокруг оси OY, затем вокруг оси OZ, затем вокруг оси OX
// 5 - "zyx" - поворот вокруг оси OZ, затем вокруг оси OY, затем вокруг оси OX
// 6 - "zxy" - поворот вокруг оси OZ, затем вокруг оси OX, затем вокруг оси OY
void ThreeAnglesMatrix(double OXAngle, double OYAngle, double OZAngle, int Order);
//--- Свойства только для чтения ---
//Возвращает транспонированную матрицу
struct Matrix getTrans(void);
};
typedef struct Matrix TMatrix;
//--- Кватернион ---
struct Quaternion
{
public:
Quaternion() : q0(0.0), q1(0.0), q2(0.0), q3(0.0) {}
//--- Метаданные ---
double q0; //Скалярная составляющая w
double q1; //Векторная составляющая x
double q2; //Векторная составляющая y
double q3; //Векторная составляющая z
//--- Перегруженные операции ---
//Поворот вектора с помощью заданного кватерниона. Положительным считается поворот, выполненный по правилу
// буравчика: большой палец указывает направление вектора кватерниона, а согнутая на 90 градусов ладонь
// указывает направление положительного поворота (поворота на положительный угол). Произведение кватерниона на
// вектор [ * ]
friend TVector operator*(struct Quaternion Q, TVector V);
friend struct Quaternion operator+(struct Quaternion A, struct Quaternion B); //Сложение двух кватернионов [ + ]
friend struct Quaternion operator-(struct Quaternion A, struct Quaternion B); //Вычитание двух кватернионов [ - ]
friend struct Quaternion operator*(struct Quaternion Q1, struct Quaternion Q2); //Произведение двух кватернионов [ * ]
//--- Инициализирующие методы ---
//Инициализирует кватернион нулями
void Empty(void);
//Инициализирует кватернион заданными значениями
void Data(double Valueq0, double Valueq1, double Valueq2, double Valueq3);
//Создаёт кватернион вращения из вектора, вокруг которого надо выполнить вращение, и угла, на который надо
// выполнить вращение. Знак величины угла определяется по правилу буравчика
void MakeQuat(double Angle, TVector V);
//Получает кватернион вращения из матрицы поворотов по алгоритму Стенли
void QuatFromMatrixStanley(TMatrix M);
//Получает кватернион по заданным трем углам поворота вокруг осей OX, OY, OZ. О знаках углов поворота
// смотри комментарии для функций OXMatrix, OYMatrix, OZMatrix
// Order задает порядок поворота системы координат вокруг базовых осей
// 1 - "xyz" - поворот вокруг оси OX, затем вокруг оси OY, затем вокруг оси OZ
// 2 - "xzy" - поворот вокруг оси OX, затем вокруг оси OZ, затем вокруг оси OY
// 3 - "yxz" - поворот вокруг оси OY, затем вокруг оси OX, затем вокруг оси OZ
// 4 - "yzx" - поворот вокруг оси OY, затем вокруг оси OZ, затем вокруг оси OX
// 5 - "zyx" - поворот вокруг оси OZ, затем вокруг оси OY, затем вокруг оси OX
// 6 - "zxy" - поворот вокруг оси OZ, затем вокруг оси OX, затем вокруг оси OY
void ThreeAnglesQuat(double OXAngle, double OYAngle, double OZAngle, int Order);
//--- Свойства только для чтения ---
//Возвращает модуль угла поворота
double getModulAngle(void);
//Возвращает норму (модуль) кватерниона
double getNorm(void);
//Возвращает единичный кватернион по направлению заданного
struct Quaternion getBasis(void);
//Возвращает обратный кватернион
struct Quaternion getOpposite(void);
//Возвращает матрицу поворотов
TMatrix getMatrix(void);
};
typedef struct Quaternion TQuaternion;
#endif