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
| template <typename T>
class Vec3
{
private:
T m_values[3];
public:
Vec3(const T& _value1 = T(), const T& _value2 = T(), const T& _value3 = T());
Vec3(const Vec3<T>& _vector);
~Vec3();
T x() { return m_values[0]; }
T y() { return m_values[1]; }
T z() { return m_values[2]; }
void setX(T _value) { m_values[0] = _value; }
void setY(T _value) { m_values[1] = _value; }
void setZ(T _value) { m_values[2] = _value; }
void set(Vec3<T> _vector) { setX(_vector.x()); setY(_vector.y()); setZ(_vector.z()); }
T* toArray() { return m_values; }
static double distance(const Vec3<T>& _vec1, const Vec3<T>& _vec2);
static double dotProduct(const Vec3<T>& _vec1, const Vec3<T>& _vec2);
static Vec3<T> crossProduct(const Vec3<T>& _vec1, const Vec3<T>& _vec2);
};
// CONSTRUCTEURS
template <typename T>
Vec3<T>::Vec3(const T& _value1, const T& _value2, const T& _value3)
{
setX(_value1);
setY(_value2);
setZ(_value3);
}
template <typename T>
Vec3<T>::Vec3(const Vec3<T>& _vector)
{
set(_vector);
}
// DESTRUCTEUR
template <typename T>
Vec3<T>::~Vec3()
{
delete [] m_values;
}
// DISTANCE
template <typename T>
double distance(const Vec3<T>& _vec1, const Vec3<T>& _vec2)
{
return (sqrt(pow(_vec2.x() - _vec1.x(), 2)) + pow(_vec2.y() - _vec1.y(), 2) + pow(_vec2.z() - _vec1.z(), 2));
}
// PRODUIT SCALAIRE
template <typename T>
double dotProduct(const Vec3<T>& _vec1, const Vec3<T>& _vec2)
{
return (_vec1.x * _vec2.x + _vec1.y * _vec2.y + _vec1.z * _vec2.z);
}
// PRODUIT VECTORIEL
template <typename T>
Vec3<T> crossProduct(const Vec3<T>& _vec1, const Vec3<T>& _vec2)
{
Vec3<T> vector;
vector.setX((_vec1.y * _vec2.z) - (_vec1.z * _vec2.y));
vector.setY((_vec1.z * _vec2.x) - (_vec1.x * _vec2.z));
vector.setZ((_vec1.x * _vec2.y) - (_vec1.y * _vec2.x));
return vector;
}
typedef Vec3<int> Vec3i;
typedef Vec3<float> Vec3f;
typedef Vec3<double> Vec3d;
typedef Vec3<unsigned char> Vec3uc; |
Partager