Subversion Repositories spk

Rev

Blame | Last modification | View Log | RSS feed

#ifndef GEOMETRY_INCLUDED
#define GEOMETRY_INCLUDED

#include <math.h>

namespace geometry
{

template <class Ty>
class point3d
{
        public:
                typedef Ty value_type;
        
        public:
                Ty x, y, z;
                
                point3d()
                        : x(), y(), z()
                { }
                
                point3d(const Ty& x, const Ty& y, const Ty& z)
                        : x(x), y(y), z(z)
                { }
                
                double length() const
                {
                        return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
                }
                
                bool isZero() const { return x==0 && x==0 && z==0; }
                
                bool operator == (const point3d& other) const
                {
                        return x==other.x && y==other.y && z==other.z;
                }
                
                bool operator != (const point3d& other) const { return !(*this==other); }
                
                point3d operator - (const value_type& b) const { return point3d(x - b, y - b, z - b); }
                point3d operator + (const value_type& b) const { return point3d(x + b, y + b, z + b); }
                
                point3d operator - (const point3d& b) const { return point3d(x - b.x, y - b.y, z - b.z); }
                point3d operator + (const point3d& b) const { return point3d(x + b.x, y + b.y, z + b.z); }
                
                point3d& operator -= (const value_type& b) { x -= b; y -= b; z -= b; return *this; }
                point3d& operator += (const value_type& b) { x += b; y += b; z += b; return *this; }
                
                point3d& operator -= (const point3d& b) { x -= b.x; y -= b.y; z -= b.z; return *this; }
                point3d& operator += (const point3d& b) { x += b.x; y += b.y; z += b.z; return *this; }
                
                bool operator > (double b) const { return length() > b; }
                bool operator < (double b) const { return length() < b; }
                
                bool operator > (const point3d& b) const { return length() > b.length(); }
                bool operator < (const point3d& b) const { return length() < b.length(); }
                
                point3d& operator /= (const value_type& v) { x/=v;      y/=v;   z/=v;   return *this;   }
                point3d& operator /= (const point3d& v) {       x/=v.x; y/=v.y; z/=v.z; return *this;   }
                
                point3d operator / (const value_type& v) const { return point3d(x / v, y / v, z / v); }
                point3d operator / (const point3d& v) const { return point3d(x / v.x, y / v.y, z / v.z); }
                
                point3d& operator *= (const value_type& v) { x*=v;      y*=v;   z*=v;   return *this;   }
                point3d& operator *= (const point3d& v) {       x*=v.x; y*=v.y; z*=v.z; return *this;   }
                
                point3d operator * (const value_type& v) const { return point3d(x * v, y * v, z * v); }
                point3d operator * (const point3d& v) const { return point3d(x * v.x, y * v.y, z * v.x); }
                
                point3d normalize() const { return *this / length(); }
                
                value_type dot(const point3d& b) const { return (x * b.x + y * b.y + z * b.z); }
                
                double angle(const point3d& b) const // in radians!
                {
                        return acos(normalize().dot(b.normalize()));
                }
                
                point3d cross(const point3d& b) const
                {
                        return point3d(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
                }

};

template <class Ty>
class point2d
{
        public:
                typedef Ty value_type;
        
        public:
                Ty x, y;
                
                point2d()
                        : x(), y()
                { }
                
                point2d(const Ty& x, const Ty& y)
                        : x(x), y(y)
                { }
                
                double length() const { return sqrt(pow(x, 2) + pow(y, 2));     }
                
                bool operator == (const point2d& other) const   {       return x==other.x && y==other.y; }
                
                bool operator != (const point2d& other) const { return !(*this==other); }
                
                point2d operator - (const value_type& b) const { return point2d(x - b, y - b); }
                point2d operator + (const value_type& b) const { return point2d(x + b, y + b); }
                
                point2d operator - (const point2d& b) const { return point2d(x - b.x, y - b.y); }
                point2d operator + (const point2d& b) const { return point2d(x + b.x, y + b.y); }
                
                point2d& operator -= (const value_type& b) { x -= b; y -= b; return *this; }
                point2d& operator += (const value_type& b) { x += b; y += b; return *this; }
                
                point2d& operator -= (const point2d& b) { x -= b.x; y -= b.y; return *this; }
                point2d& operator += (const point2d& b) { x += b.x; y += b.y; return *this; }
                
                bool operator > (double b) const { return length() > b; }
                bool operator < (double b) const { return length() < b; }
                
                bool operator > (const point2d& b) const { return length() > b.length(); }
                bool operator < (const point2d& b) const { return length() < b.length(); }
                
                point2d& operator /= (const value_type& v) { x/=v;      y/=v;   return *this;   }
                point2d& operator /= (const point2d& v) {       x/=v.x; y/=v.y; return *this;   }
                
                point2d operator / (const value_type& v) const { return point2d(x / v, y / v); }
                point2d operator / (const point2d& v) const { return point2d(x / v.x, y / v.y); }
                
                point2d& operator *= (const value_type& v) { x*=v;      y*=v;   return *this;   }
                point2d& operator *= (const point2d& v) {       x*=v.x; y*=v.y; return *this;   }
                
                point2d operator * (const value_type& v) const { return point2d(x * v, y * v); }
                point2d operator * (const point2d& v) const { return point2d(x * v.x, y * v.y); }
                
                point2d normalize() const { return *this / length(); }
};

} // namespace geometry

#endif // !defined(GEOMETRY_INCLUDED)