DavidNorgren

Untitled

Apr 3rd, 2015
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.11 KB | None | 0 0
  1. // algebra.h
  2. // Declaration and implementation of vector and matrix functionality.
  3. // By David Norgren (dnn13002), April 2015 for DVA304 Computer Graphics
  4.  
  5. #pragma once
  6.  
  7. #include <iostream>
  8. #include <math.h>
  9.  
  10. #define PI  3.1415926535897932f
  11.  
  12. template <int size>
  13.  
  14. // A vector with 2 to 4 elements.
  15. class vec {
  16. public:
  17.     vec() {
  18.         for (int i = 0; i < size; i++)
  19.             e[i] = 0;
  20.     }
  21.     vec(float u, float v) {
  22.         e[0] = u; e[1] = v;
  23.     }
  24.     vec(float x, float y, float z) {
  25.         e[0] = x; e[1] = y; e[2] = z;
  26.     }
  27.     vec(float r, float g, float b, float a) {
  28.         e[0] = r; e[1] = g; e[2] = b; e[3] = a;
  29.     }
  30.  
  31.     // Get
  32.     float u() { return e[0]; }
  33.     float v() { return e[1]; }
  34.     float x() { return e[0]; }
  35.     float y() { return e[1]; }
  36.     float z() { return e[2]; }
  37.     float w() { return e[3]; }
  38.     float r() { return e[0]; }
  39.     float g() { return e[1]; }
  40.     float b() { return e[2]; }
  41.     float a() { return e[3]; }
  42.  
  43.     // Returns the length of the vector.
  44.     float length() {
  45.         float a = 0;
  46.         for (int i = 0; i < size; i++)
  47.             a += e[i] * e[i];
  48.         return sqrt(a);
  49.     }
  50.  
  51.     // Returns the new vector with length 1.
  52.     vec<size> normalize() {
  53.         vec<size> normal;
  54.         float len = length();
  55.         for (int i = 0; i < size; i++)
  56.             normal[i] = e[i] / len;
  57.         return normal;
  58.     }
  59.  
  60.     // Elements
  61.     float e[size];
  62.  
  63.     // Operators
  64.     float& operator [] (int index) {
  65.         return e[index];
  66.     }
  67.     bool operator == (vec<size>& right) {
  68.         for (int i = 0; i < size; i++)
  69.             if (e[i] != right[i])
  70.                 return false;
  71.         return true;
  72.     }
  73.     bool operator != (vec<size>& right) {
  74.         for (int i = 0; i < size; i++)
  75.             if (e[i] != right[i])
  76.                 return true;
  77.         return false;
  78.     }
  79.     void operator += (vec<size>& right) {
  80.         for (int i = 0; i < size; i++)
  81.             e[i] += right[i];
  82.     }
  83.     void operator -= (vec<size>& right) {
  84.         for (int i = 0; i < size; i++)
  85.             e[i] -= right[i];
  86.     }
  87.     void operator *= (float& s) {
  88.         for (int i = 0; i < size; i++)
  89.             e[i] *= s;
  90.     }
  91.     void operator /= (float& s) {
  92.         for (int i = 0; i < size; i++)
  93.             e[i] /= s;
  94.     }
  95.     vec<size> operator + (vec<size>& right) {
  96.         vec<size> sum;
  97.         for (int i = 0; i < size; i++)
  98.             sum.e[i] = e[i] + right[i];
  99.         return sum;
  100.     }
  101.     vec<size> operator - () {
  102.         vec<size> neg;
  103.         for (int i = 0; i < size; i++)
  104.             neg.e[i] = -e[i];
  105.         return neg;
  106.     }
  107.     vec<size> operator - (vec<size>& right) {
  108.         vec<size> dif;
  109.         for (int i = 0; i < size; i++)
  110.             dif.e[i] = e[i] - right[i];
  111.         return dif;
  112.     }
  113.     vec<size> operator * (float s) {
  114.         vec<size> scaled;
  115.         for (int i = 0; i < size; i++)
  116.             scaled.e[i] = e[i] * s;
  117.         return scaled;
  118.     }
  119.     vec<size> operator / (float s) {
  120.         vec<size> scaled;
  121.         for (int i = 0; i < size; i++)
  122.             scaled.e[i] = e[i] / s;
  123.         return scaled;
  124.     }
  125. };
  126.  
  127. // Additional operators
  128. template <int size> vec<size> operator * (float s, vec<size>& right) {
  129.     vec<size> scaled;
  130.     for (int i = 0; i < size; i++)
  131.         scaled.e[i] = s * right[i];
  132.     return scaled;
  133. }
  134. template <int size> std::ostream& operator << (std::ostream& os, vec<size>& print) {
  135.     for (int i = 0; i < size; i++)
  136.         os << print[i] << (i < size - 1 ? "," : "");
  137.     return os;
  138. }
  139.  
  140. // User friendly names
  141. typedef vec<2> vec2;
  142. typedef vec<3> vec3;
  143. typedef vec<4> vec4;
  144.  
  145. // Returns the dot product of two vectors.
  146. template <int size> inline float dot(vec<size>& left, vec<size>& right) {
  147.     float p = 0;
  148.     for (int i = 0; i < size; i++)
  149.         p += left[i] * right[i];
  150.     return p;
  151. }
  152.  
  153. // Returns the cross product of two vectors.
  154. inline vec3 cross(vec3& left, vec3& right) {
  155.     return vec3(
  156.         left.y() * right.z() - left.z() * right.y(),
  157.         left.z() * right.x() - left.x() * right.z(),
  158.         left.x() * right.y() - left.y() * right.x()
  159.     );
  160. }
  161.  
  162. template <int size>
  163.  
  164. // A matrix with 2x2 to 4x4 elements
  165. class mat {
  166. public:
  167.     mat() {
  168.         for (int i = 0; i < size * size; i++)
  169.             e[i] = 0;
  170.     }
  171.     mat(float x1, float y1,
  172.         float x2, float y2) {
  173.         e[0] = x1; e[1] = x2;
  174.         e[2] = y1; e[3] = y2;
  175.     }
  176.     mat(float x1, float y1, float z1,
  177.         float x2, float y2, float z2,
  178.         float x3, float y3, float z3) {
  179.         e[0] = x1; e[1] = x2; e[1] = x3;
  180.         e[2] = y1; e[3] = y2; e[4] = y3;
  181.         e[5] = z1; e[6] = z2; e[7] = z3;
  182.     }
  183.     mat(float x1, float y1, float z1, float w1,
  184.         float x2, float y2, float z2, float w2,
  185.         float x3, float y3, float z3, float w3,
  186.         float x4, float y4, float z4, float w4) {
  187.         e[0] = x1; e[1] = x2; e[2] = x3; e[3] = x4;
  188.         e[4] = y1; e[5] = y2; e[6] = y3; e[7] = y4;
  189.         e[8] = z1; e[9] = z2; e[10] = z3; e[11] = z4;
  190.         e[12] = w1; e[13] = w2; e[14] = w3; e[15] = w4;
  191.     }
  192.  
  193.     // Elements
  194.     float e[size * size];
  195.  
  196.     // Operators
  197.     float* operator[] (int x) {
  198.         static float col[size];
  199.         for (int i = 0; i < size; i++)
  200.             col[i] = e[i * size + x];
  201.         return col;
  202.     }
  203.     bool operator == (mat<size>& right) {
  204.         for (int i = 0; i < size * size; i++)
  205.             if (e[i] != right.e[i])
  206.                 return false;
  207.         return true;
  208.     }
  209.     bool operator != (mat<size>& right) {
  210.         for (int i = 0; i < size * size; i++)
  211.             if (e[i] != right.e[i])
  212.                 return true;
  213.         return false;
  214.     }
  215.     void operator += (mat<size>& right) {
  216.         for (int i = 0; i < size * size; i++)
  217.             e[i] += right.e[i];
  218.     }
  219.     void operator -= (mat<size>& right) {
  220.         for (int i = 0; i < size * size; i++)
  221.             e[i] -= right.e[i];
  222.     }
  223.     void operator *= (mat<size>& right) {
  224.         mat<size> product;
  225.         for (int i = 0; i < 4; i++) {
  226.             for (int j = 0; j < 4; j++) {
  227.                 product.e[j * 4 + i] = 0;
  228.                 for (int k = 0; k < 4; k++)
  229.                     product.e[j * 4 + i] += e[k * 4 + i] * right.e[j * 4 + k];
  230.             }
  231.         }
  232.         for (int i = 0; i < size; i++)
  233.             e[i] = product.e[i];
  234.     }
  235.     void operator *= (float& s) {
  236.         for (int i = 0; i < size * size; i++)
  237.             e[i] *= s;
  238.     }
  239.     void operator /= (float& s) {
  240.         for (int i = 0; i < size * size; i++)
  241.             e[i] /= s;
  242.     }
  243.     mat<size> operator + (mat<size>& right) {
  244.         mat<size> sum;
  245.         for (int i = 0; i < size * size; i++)
  246.             sum.e[i] = e[i] + right.e[i];
  247.         return sum;
  248.     }
  249.     mat<size> operator - () {
  250.         mat<size> neg;
  251.         for (int i = 0; i < size * size; i++)
  252.             neg.e[i] = -e[i];
  253.         return neg;
  254.     }
  255.     mat<size> operator - (mat<size>& right) {
  256.         mat<size> dif;
  257.         for (int i = 0; i < size * size; i++)
  258.             dif.e[i] = e[i] - right.e[i];
  259.         return dif;
  260.     }
  261.     mat<size> operator * (mat<size>& right) {
  262.         mat<size> product;
  263.         for (int i = 0; i < 4; i++) {
  264.             for (int j = 0; j < 4; j++) {
  265.                 product.e[j * 4 + i] = 0;
  266.                 for (int k = 0; k < 4; k++)
  267.                     product.e[j * 4 + i] += e[k * 4 + i] * right.e[j * 4 + k];
  268.             }
  269.         }
  270.         return product;
  271.     }
  272.     mat<size> operator * (float s) {
  273.         mat<size> scaled;
  274.         for (int i = 0; i < size * size; i++)
  275.             scaled.e[i] = e[i] * s;
  276.         return scaled;
  277.     }
  278.     mat<size> operator / (float s) {
  279.         mat<size> scaled;
  280.         for (int i = 0; i < size * size; i++)
  281.             scaled.e[i] = e[i] / s;
  282.         return scaled;
  283.     }
  284. };
  285.  
  286. // User friendly names
  287. typedef mat<2> mat2;
  288. typedef mat<3> mat3;
  289. typedef mat<4> mat4;
  290.  
  291. // Additional operators
  292. template <int size> mat<size> operator * (float s, mat<size>& right) {
  293.     mat<size> scaled;
  294.     for (int i = 0; i < size * size; i++)
  295.         scaled.e[i] = s * right.e[i];
  296.     return scaled;
  297. }
  298. template <int size> std::ostream& operator << (std::ostream& os, mat<size>& print) {
  299.     for (int i = 0; i < size; i++) {
  300.         for (int j = 0; j < size; j++)
  301.             os << print[i][j] << (j < size - 1 ? "," : "");
  302.         os << endl;
  303.     }
  304.     return os;
  305. }
  306.  
  307. // Build a matrix for translation.
  308. inline mat4 buildTranslation(vec3& translate) {
  309.     return mat4(
  310.         1, 0, 0, translate[0],
  311.         0, 1, 0, translate[1],
  312.         0, 0, 1, translate[2],
  313.         0, 0, 0, 1
  314.     );
  315. }
  316.  
  317. // Build a matrix for X rotation.
  318. inline mat4 buildRotationX(float angle) {
  319.     return mat4(
  320.         1, 0, 0, 0,
  321.         0, cos(angle), -sin(angle), 0,
  322.         0, sin(angle), cos(angle), 0,
  323.         0, 0, 0, 1
  324.     );
  325. }
  326.  
  327. // Build a matrix for Y rotation.
  328. inline mat4 buildRotationY(float angle) {
  329.     return mat4(
  330.         cos(angle), 0, sin(angle), 0,
  331.         0, 1, 0, 0,
  332.         -sin(angle), 0, cos(angle), 0,
  333.         0, 0, 0, 1
  334.     );
  335. }
  336.  
  337. // Build a matrix for Z rotation.
  338. inline mat4 buildRotationZ(float angle) {
  339.     return mat4(
  340.         cos(angle), -sin(angle), 0, 0,
  341.         sin(angle), cos(angle), 0, 0,
  342.         0, 0, 1, 0,
  343.         0, 0, 0, 1
  344.     );
  345. }
  346.  
  347. // Build a matrix for scaling.
  348. inline mat4 buildScale(vec3& scale) {
  349.     return mat4(
  350.         scale.x(), 0, 0, 0,
  351.         0, scale.y(), 0, 0,
  352.         0, 0, scale.z(), 0,
  353.         0, 0, 0, 1
  354.     );
  355. }
Advertisement
Add Comment
Please, Sign In to add comment