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)