Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/mount_points/src/lib/math/vector.h @ 10174

Last change on this file since 10174 was 10174, checked in by patrick, 17 years ago

upgraded vector class to support some more actions, bubble sort algorithm almost finished

File size: 7.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Christian Meyer
13   co-programmer: ...
14*/
15
16/*!
17 * @file vector.h
18 * A basic 3D math framework
19 *
20 * Contains classes to handle vectors, lines, rotations and planes
21*/
22
23#ifndef __VECTOR_H_
24#define __VECTOR_H_
25
26#include <cmath>
27#include "compiler.h"
28//! PI the circle-constant
29#define PI 3.14159265359f
30
31
32//! this is a small and performant 3D vector
33typedef float sVec3D[3];
34
35
36//! 3D Vector
37/**
38        Class to handle 3D Vectors
39*/
40class Vector {
41 public:
42  Vector (float x, float y, float z) : x(x), y(y), z(z) {}  //!< assignment constructor
43  Vector () : x(0), y(0), z(0) {}
44
45  /** @param v: the Vecor to compare with this one @returns true, if the Vecors are the same, false otherwise */
46  inline bool operator== (const Vector& v) const { return (this->x==v.x&&this->y==v.y&&this->z==v.z)?true:false; };
47  /** @param v: the Vecor to compare with this one @returns true, if the Vecors are different, false otherwise */
48  inline bool operator!= (const Vector& v) const { return (this->x!=v.x||this->y!=v.y||this->z!=v.z)?true:false; };
49  inline bool operator> (const Vector& v)  { return (this->len() > v.len()); }
50  inline bool operator< (const Vector& v)  { return (this->len() < v.len()); }
51
52  /** @param index The index of the "array" @returns the x/y/z coordinate */
53  inline float operator[] (float index) const {if( index == 0) return this->x; if( index == 1) return this->y; if( index == 2) return this->z; }
54  /** @param v The vector to add @returns the addition between two vectors (this + v) */
55  inline Vector operator+ (const Vector& v) const { return Vector(x + v.x, y + v.y, z + v.z); };
56  /** @param v The vector to add @returns the addition between two vectors (this + v) */
57  inline Vector operator+ (const sVec3D& v) const { return Vector(x + v[0], y + v[1], z + v[2]); };
58  /** @param v The vector to add  @returns the addition between two vectors (this += v) */
59  inline const Vector& operator+= (const Vector& v) { this->x += v.x; this->y += v.y; this->z += v.z; return *this; };
60  /** @param v The vector to substract  @returns the substraction between two vectors (this - v) */
61  inline const Vector& operator+= (const sVec3D& v) { this->x += v[0]; this->y += v[1]; this->z += v[2]; return *this; };
62  /** @param v The vector to substract  @returns the substraction between two vectors (this - v) */
63  inline Vector operator- (const Vector& v) const { return Vector(x - v.x, y - v.y, z - v.z); }
64  /** @param v The vector to substract  @returns the substraction between two vectors (this - v) */
65  inline Vector operator- (const sVec3D& v) const { return Vector(x - v[0], y - v[1], z - v[2]); }
66  /** @param v The vector to substract  @returns the substraction between two vectors (this -= v) */
67  inline const Vector& operator-= (const Vector& v) { this->x -= v.x; this->y -= v.y; this->z -= v.z; return *this; };
68  /** @param v The vector to substract  @returns the substraction between two vectors (this -= v) */
69  inline const Vector& operator-= (const sVec3D& v) { this->x -= v[0]; this->y -= v[1]; this->z -= v[2]; return *this; };
70  /** @param v the second vector  @returns The dotProduct between two vector (this (dot) v) */
71  inline float operator* (const Vector& v) const { return x * v.x + y * v.y + z * v.z; };
72  /** @todo strange */
73  inline const Vector& operator*= (const Vector& v) { this->x *= v.x; this->y *= v.y; this->z *= v.z; return *this; };
74  /** @param f a factor to multiply the vector with @returns the vector multiplied by f (this * f) */
75  inline Vector operator* (float f) const { return Vector(x * f, y * f, z * f); };
76  /** @param f a factor to multiply the vector with @returns the vector multiplied by f (this *= f) */
77  inline const Vector& operator*= (float f) { this->x *= f; this->y *= f; this->z *= f; return *this; };
78  /** @param f a factor to divide the vector with @returns the vector divided by f (this / f) */
79  inline Vector operator/ (float f) const { return (unlikely(f == 0.0))?Vector(0,0,0):Vector(this->x / f, this->y / f, this->z / f); };
80  /** @param f a factor to divide the vector with @returns the vector divided by f (this /= f) */
81  inline const Vector& operator/= (float f) {if (unlikely(f == 0.0)) {this->x=0;this->y=0;this->z=0;} else {this->x /= f; this->y /= f; this->z /= f;} return *this; };
82  /**  copy constructor @todo (i do not know it this is faster) @param v the vector to assign to this vector. @returns the vector v */
83  inline const Vector& operator= (const Vector& v) { this->x = v.x; this->y = v.y; this->z = v.z; return *this; };
84  /** copy constructor* @param v the sVec3D to assign to this vector. @returns the vector v */
85  inline const Vector& operator= (const sVec3D& v) { this->x = v[0]; this->y = v[1]; this->z = v[2]; return *this; }
86  inline const Vector& operator= (const float* v) { this->x = v[0]; this->y = v[1]; this->z = v[2]; return *this; }
87
88  /** this operator can be used to assign values to the vector */
89  inline void operator() (float x, float y, float z) { this->x = x; this->y = y; this->z = z;}
90
91
92
93
94  /** @param v: the other vector \return the dot product of the vectors */
95  float dot (const Vector& v) const { return x*v.x+y*v.y+z*v.z; };
96  /** @param v: the corss-product partner @returns the cross-product between this and v (this (x) v) */
97  inline Vector cross (const Vector& v) const { return Vector(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); }
98  /** scales the this vector with v* @param v the vector to scale this with */
99  void scale(const Vector& v) {   x *= v.x;  y *= v.y; z *= v.z; };
100  /** @returns the length of the vector */
101  inline float len() const { return sqrt (x*x + y*y + z*z); }
102  /** normalizes the vector */
103  inline void normalize() { float l = len(); if( unlikely(l == 0.0))return; this->x=this->x/l; this->y=this->y/l; this->z=this->z/l; };
104  Vector getNormalized() const;
105  Vector abs();
106
107  /** @param toVec nears this Vector to... @param t how much to advance (0.0: not at all; 1.0: fully) */
108  inline void slerpTo(const Vector& toVec, float t) { *this + (toVec - *this) * t; };
109
110  /** @returns a Null Vector */
111  inline static const Vector& nullVector() { static Vector nullVector; return nullVector; }
112  void debug() const;
113
114 public:
115  float    x;     //!< The x Coordinate of the Vector.
116  float    y;     //!< The y Coordinate of the Vector.
117  float    z;     //!< The z Coordinate of the Vector.
118};
119
120/**
121 *  calculate the angle between two vectors in radiances
122 * @param v1: a vector
123 * @param v2: another vector
124 * @return the angle between the vectors in radians
125*/
126inline float angleDeg (const Vector& v1, const Vector& v2) { return acos( v1 * v2 / (v1.len() * v2.len())); };
127/**
128 *  calculate the angle between two vectors in degrees
129 * @param v1: a vector
130 * @param v2: another vector
131 * @return the angle between the vectors in degrees
132*/
133inline float angleRad (const Vector& v1, const Vector& v2) { return acos( v1 * v2 / (v1.len() * v2.len())) * 180/M_PI; };
134
135/** an easy way to create a Random Vector @param sideLength the length of the Vector (x not sqrt(x^2...)) */
136#define VECTOR_RAND(sideLength)  (Vector((float)rand()/RAND_MAX -.5, (float)rand()/RAND_MAX -.5, (float)rand()/RAND_MAX -.5) * sideLength)
137
138#endif /* __VECTOR_H_ */
139
Note: See TracBrowser for help on using the repository browser.