eleni@0: #include eleni@0: #include eleni@0: #include "vector.h" eleni@0: #include "matrix.h" eleni@0: eleni@0: Vector3::Vector3() { eleni@0: x = 0; eleni@0: y = 0; eleni@0: z = 0; eleni@0: } eleni@0: eleni@0: Vector3::Vector3(float x, float y, float z) { eleni@0: this->x = x; eleni@0: this->y = y; eleni@0: this->z = z; eleni@0: } eleni@0: eleni@0: void Vector3::transform(const Matrix4x4 &tm) { eleni@0: float x1 = tm.m[0][0]*x + tm.m[0][1]*y + tm.m[0][2]*z + tm.m[0][3]; eleni@0: float y1 = tm.m[1][0]*x + tm.m[1][1]*y + tm.m[1][2]*z + tm.m[1][3]; eleni@0: float z1 = tm.m[2][0]*x + tm.m[2][1]*y + tm.m[2][2]*z + tm.m[2][3]; eleni@0: x = x1; eleni@0: y = y1; eleni@0: z = z1; eleni@0: } eleni@0: eleni@0: void Vector3::printv() { eleni@0: printf("%f\t%f\t%f\n", x, y, z); eleni@0: } eleni@0: eleni@0: eleni@0: bool operator < (const Vector3 &a, const Vector3 &b) { eleni@0: return a.x < b.x && a.y < b.y && a.z < b.z; eleni@0: } eleni@0: eleni@0: bool operator > (const Vector3 &a, const Vector3 &b) { eleni@0: return a.x > b.x && a.y > b.y && a.z > b.z; eleni@0: } eleni@0: eleni@0: bool operator == (const Vector3 &a, const Vector3 &b) { eleni@0: return a.x == b.x && a.y == b.y && a.z == b.z; eleni@0: } eleni@0: eleni@0: Vector3 operator + (const Vector3 &a, const Vector3 &b) { eleni@0: return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); eleni@0: } eleni@0: eleni@0: Vector3 operator - (const Vector3 &a, const Vector3 &b) { eleni@0: return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); eleni@0: } eleni@0: eleni@0: Vector3 operator - (const Vector3 &a) { eleni@0: return Vector3(-a.x, -a.y, -a.z); eleni@0: } eleni@0: eleni@0: Vector3 operator * (const Vector3 &a, const Vector3 &b) { eleni@0: return Vector3(a.x * b.x, a.y * b.y, a.z * b.z); eleni@0: } eleni@0: eleni@0: Vector3 operator * (const Vector3 &a, float b) { eleni@0: return Vector3(a.x*b, a.y*b, a.z*b); eleni@0: } eleni@0: eleni@0: Vector3 operator * (float b, const Vector3 &a) { eleni@0: return Vector3(a.x*b, a.y*b, a.z*b); eleni@0: } eleni@0: eleni@0: Vector3 operator / (const Vector3 &a, float b) { eleni@0: return Vector3(a.x / b, a.y / b, a.z / b); eleni@0: } eleni@0: eleni@0: const Vector3 &operator += (Vector3 &a, const Vector3 &b) { eleni@0: a.x += b.x; eleni@0: a.y += b.y; eleni@0: a.z += b.z; eleni@0: return a; eleni@0: } eleni@0: eleni@0: float length(const Vector3 &a) { eleni@0: return sqrt(a.x*a.x + a.y*a.y + a.z*a.z); eleni@0: } eleni@0: eleni@0: float dot(const Vector3 &a, const Vector3 &b) { eleni@0: return a.x*b.x + a.y*b.y + a.z*b.z; eleni@0: } eleni@0: eleni@0: Vector3 cross(const Vector3 &a, const Vector3 &b) { eleni@0: return Vector3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x); eleni@0: } eleni@0: eleni@0: Vector3 normalize(const Vector3 &vec) { eleni@0: float mag = sqrt(vec.x*vec.x + vec.y*vec.y + vec.z*vec.z); eleni@0: return vec / mag; eleni@0: } eleni@0: eleni@0: Vector3 reflect(const Vector3 &v, const Vector3 &n) { eleni@0: return 2.0 * dot(v, n) * n - v; eleni@0: } eleni@0: eleni@0: ////// eleni@0: // eleni@0: ///// eleni@0: eleni@0: Vector4::Vector4() { eleni@0: x = 0; eleni@0: y = 0; eleni@0: z = 0; eleni@0: w = 0; eleni@0: } eleni@0: eleni@0: Vector4::Vector4(float x, float y, float z, float w) { eleni@0: this->x = x; eleni@0: this->y = y; eleni@0: this->z = z; eleni@0: this->w = w; eleni@0: } eleni@0: eleni@0: void Vector4::transform(const Matrix4x4 &tm) { eleni@0: float x1 = tm.m[0][0]*x + tm.m[0][1]*y + tm.m[0][2]*z + tm.m[0][3]; eleni@0: float y1 = tm.m[1][0]*x + tm.m[1][1]*y + tm.m[1][2]*z + tm.m[1][3]; eleni@0: float z1 = tm.m[2][0]*x + tm.m[2][1]*y + tm.m[2][2]*z + tm.m[2][3]; eleni@0: float w1 = tm.m[3][0]*x + tm.m[3][1]*y + tm.m[3][2]*z + tm.m[3][3]; eleni@0: x = x1; eleni@0: y = y1; eleni@0: z = z1; eleni@0: w = w1; eleni@0: } eleni@0: eleni@0: void Vector4::printv() { eleni@0: printf("%f\t%f\t%f\t%f\n", x, y, z, w); eleni@0: } eleni@0: eleni@0: eleni@0: bool operator < (const Vector4 &a, const Vector4 &b) { eleni@0: return a.x < b.x && a.y < b.y && a.z < b.z && a.w < b.w; eleni@0: } eleni@0: eleni@0: bool operator > (const Vector4 &a, const Vector4 &b) { eleni@0: return a.x > b.x && a.y > b.y && a.z > b.z && a.w > b.w; eleni@0: } eleni@0: eleni@0: bool operator == (const Vector4 &a, const Vector4 &b) { eleni@0: return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w; eleni@0: } eleni@0: eleni@0: Vector4 operator + (const Vector4 &a, const Vector4 &b) { eleni@0: return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); eleni@0: } eleni@0: eleni@0: Vector4 operator - (const Vector4 &a, const Vector4 &b) { eleni@0: return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); eleni@0: } eleni@0: eleni@0: Vector4 operator - (const Vector4 &a) { eleni@0: return Vector4(-a.x, -a.y, -a.z, -a.w); eleni@0: } eleni@0: eleni@0: Vector4 operator * (const Vector4 &a, const Vector4 &b) { eleni@0: return Vector4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); eleni@0: } eleni@0: eleni@0: Vector4 operator * (const Vector4 &a, float b) { eleni@0: return Vector4(a.x*b, a.y*b, a.z*b, a.w*b); eleni@0: } eleni@0: eleni@0: Vector4 operator * (float b, const Vector4 &a) { eleni@0: return Vector4(a.x * b, a.y * b, a.z * b, a.w * b); eleni@0: } eleni@0: eleni@0: Vector4 operator / (const Vector4 &a, float b) { eleni@0: return Vector4(a.x / b, a.y / b, a.z / b, a.w / b); eleni@0: } eleni@0: eleni@0: const Vector4 &operator += (Vector4 &a, const Vector4 &b) { eleni@0: a.x += b.x; eleni@0: a.y += b.y; eleni@0: a.z += b.z; eleni@0: a.w += b.w; eleni@0: return a; eleni@0: } eleni@0: eleni@0: float length(const Vector4 &a) { eleni@0: return sqrt(a.x*a.x + a.y*a.y + a.z*a.z + a.w*a.w); eleni@0: } eleni@0: eleni@0: float dot(const Vector4 &a, const Vector4 &b) { eleni@0: return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; eleni@0: } eleni@0: eleni@0: Vector4 cross(const Vector4 &v1, const Vector4 &v2, const Vector4 &v3) { eleni@0: float a = (v2.x * v3.y) - (v2.y * v3.x); eleni@0: float b = (v2.x * v3.z) - (v2.z * v3.x); eleni@0: float c = (v2.x * v3.w) - (v2.w * v3.x); eleni@0: float d = (v2.y * v3.z) - (v2.z * v3.y); eleni@0: float e = (v2.y * v3.w) - (v2.w * v3.y); eleni@0: float f = (v2.z * v3.w) - (v2.w * v3.z); eleni@0: eleni@0: Vector4 result; eleni@0: result.x = (v1.y * f) - (v1.z * e) + (v1.w * d); eleni@0: result.y = - (v1.x * f) + (v1.z * c) - (v1.w * b); eleni@0: result.z = (v1.x * e) - (v1.y * c) + (v1.w * a); eleni@0: result.w = - (v1.x * d) + (v1.y * b) - (v1.z * a); eleni@0: return result; eleni@0: } eleni@0: eleni@0: Vector4 normalize(const Vector4 &vec) { eleni@0: float mag = sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z + vec.w * vec.w); eleni@0: return vec / mag; eleni@0: } eleni@0: eleni@0: Vector4 reflect(const Vector4 &v, const Vector4 &n) { eleni@0: return 2.0 * dot(v, n) * n - v; eleni@0: }