Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1. #pragma once
  2.  
  3. // составляющие данного класса - все вещественные координаты х и у
  4. class vec2 {
  5. public:
  6.     float x, y;
  7.     vec2() {}
  8.     vec2(float a, float b) : x(a), y(b) {}
  9. };
  10.  
  11. // для однородных координат
  12. class vec3 {
  13. public:
  14.     float x, y, z;
  15.     vec3() {}
  16.     vec3(float a, float b, float c) : x(a), y(b), z(c) {}
  17.     vec3(vec2 v, float c) : vec3(v.x, v.y, c) {}
  18.  
  19.  
  20.     // покоординатное произведение
  21.     vec3& operator *= (const vec3& v) {
  22.         x *= v.x;
  23.         y *= v.y;
  24.         z *= v.z;
  25.         return *this;
  26.     }
  27.  
  28.     const vec3 operator * (const vec3& v) {
  29.         // делаем временную копию текущего объекта, которую
  30.         // домножаем на данный вектор и возвращаем как результат
  31.         return vec3(*this) *= v;
  32.     }
  33.  
  34.     float& operator[](int i) {
  35.         return ((float*)this)[i]; // ссылку на текущий объект рассматриваем как ссылку
  36.         // на нулевой элемент массива значений типа float,
  37.         // после чего обращаемся к его i-му элементу
  38.     }
  39. };
  40.  
  41. float dot(vec3 v1, vec3 v2) {
  42.     vec3 tmp = v1 * v2; // вычисляем произведения соответствующих координат
  43.     return tmp.x + tmp.y + tmp.z; // и возвращаем их сумму
  44. }
  45.  
  46. class mat3 {
  47. public:
  48.     vec3 row1, row2, row3;
  49.     mat3() {}
  50.     mat3(vec3 r1, vec3 r2, vec3 r3) : row1(r1), row2(r2), row3(r3) {}
  51.     // конструктор для диагональной матрицы с одинаковым числом на главной диагонали
  52.     mat3(float a) {
  53.         row1 = vec3(a, 0.f, 0.f);
  54.         row2 = vec3(0.f, a, 0.f);
  55.         row3 = vec3(0.f, 0.f, a);
  56.     }
  57.  
  58.     vec3& operator[](int i) {
  59.         return ((vec3*)this)[i]; // массив значений типа vec3
  60.     }
  61.  
  62.     // транспонирование матрицы
  63.     mat3 transpose() {
  64.         mat3 tmp(*this);
  65.  
  66.         for (int i = 0; i < 3; ++i) {
  67.             for (int j = 0; j < 3; ++j) {
  68.                 (*this)[i][j] = tmp[j][i];
  69.             }
  70.         }
  71.  
  72.         return *this;
  73.     }
  74.  
  75.     // умножение матрицы на вектор
  76.     const vec3 operator* (const vec3& v) {
  77.         vec3* res = new(vec3); // создаем новый вектор (для результата)
  78.         for (int i = 0; i < 3; i++) {
  79.             (*res)[i] = dot((*this)[i], v); // i-й элемент вектора - скалярное произведение
  80.         }
  81.         return *res;
  82.     }
  83.  
  84.     // произведение матриц
  85.     mat3& operator*= (const mat3& m) {
  86.         mat3 A(*this), B(m); // создаем копии исходных матриц
  87.         B.transpose(); // транспонируем вторую матрицу
  88.         for (int i = 0; i < 3; i++)
  89.             (*this)[i] = A * B[i]; // в i-ю строку текщего объекта записываем
  90.             // результат перемножения первой матрицы с i-й строкой
  91.             // транспонированной матрицы,
  92.         return (*this).transpose(); // транспонируем текущий объект, получаем результат
  93.     }
  94.  
  95.     const mat3 operator* (const mat3& m) {
  96.         return mat3(*this) *= m;
  97.     }
  98. };
  99.  
  100. // переход из однородных координат в евклидовы
  101. vec2 normalize(vec3 v) {
  102.     return vec2(v.x / v.z, v.y / v.z);
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement