Subversion Repositories spk

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
114 cycrow 1
#ifndef GEOMETRY_INCLUDED
2
#define GEOMETRY_INCLUDED
3
 
4
#include <math.h>
5
 
6
namespace geometry
7
{
8
 
9
template <class Ty>
10
class point3d
11
{
12
	public:
13
		typedef Ty value_type;
14
 
15
	public:
16
		Ty x, y, z;
17
 
18
		point3d()
19
			: x(), y(), z()
20
		{ }
21
 
22
		point3d(const Ty& x, const Ty& y, const Ty& z)
23
			: x(x), y(y), z(z)
24
		{ }
25
 
26
		double length() const
27
		{
28
			return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
29
		}
30
 
31
		bool isZero() const { return x==0 && x==0 && z==0; }
32
 
33
		bool operator == (const point3d& other) const
34
		{
35
			return x==other.x && y==other.y && z==other.z;
36
		}
37
 
38
		bool operator != (const point3d& other) const { return !(*this==other);	}
39
 
40
		point3d operator - (const value_type& b) const { return point3d(x - b, y - b, z - b); }
41
		point3d operator + (const value_type& b) const { return point3d(x + b, y + b, z + b); }
42
 
43
		point3d operator - (const point3d& b) const { return point3d(x - b.x, y - b.y, z - b.z); }
44
		point3d operator + (const point3d& b) const { return point3d(x + b.x, y + b.y, z + b.z); }
45
 
46
		point3d& operator -= (const value_type& b) { x -= b; y -= b; z -= b; return *this; }
47
		point3d& operator += (const value_type& b) { x += b; y += b; z += b; return *this; }
48
 
49
		point3d& operator -= (const point3d& b) { x -= b.x; y -= b.y; z -= b.z; return *this; }
50
		point3d& operator += (const point3d& b) { x += b.x; y += b.y; z += b.z; return *this; }
51
 
52
		bool operator > (double b) const { return length() > b; }
53
		bool operator < (double b) const { return length() < b; }
54
 
55
		bool operator > (const point3d& b) const { return length() > b.length(); }
56
		bool operator < (const point3d& b) const { return length() < b.length(); }
57
 
58
		point3d& operator /= (const value_type& v) { x/=v;	y/=v;	z/=v;	return *this;	}
59
		point3d& operator /= (const point3d& v)	{	x/=v.x;	y/=v.y;	z/=v.z;	return *this;	}
60
 
61
		point3d operator / (const value_type& v) const { return point3d(x / v, y / v, z / v); }
62
		point3d operator / (const point3d& v) const { return point3d(x / v.x, y / v.y, z / v.z); }
63
 
64
		point3d& operator *= (const value_type& v) { x*=v;	y*=v;	z*=v;	return *this;	}
65
		point3d& operator *= (const point3d& v) {	x*=v.x;	y*=v.y;	z*=v.z;	return *this;	}
66
 
67
		point3d operator * (const value_type& v) const { return point3d(x * v, y * v, z * v); }
68
		point3d operator * (const point3d& v) const { return point3d(x * v.x, y * v.y, z * v.x); }
69
 
70
		point3d normalize() const { return *this / length(); }
71
 
72
		value_type dot(const point3d& b) const { return (x * b.x + y * b.y + z * b.z); }
73
 
74
		double angle(const point3d& b) const // in radians!
75
		{
76
			return acos(normalize().dot(b.normalize()));
77
		}
78
 
79
		point3d cross(const point3d& b) const
80
		{
81
			return point3d(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
82
		}
83
 
84
};
85
 
86
template <class Ty>
87
class point2d
88
{
89
	public:
90
		typedef Ty value_type;
91
 
92
	public:
93
		Ty x, y;
94
 
95
		point2d()
96
			: x(), y()
97
		{ }
98
 
99
		point2d(const Ty& x, const Ty& y)
100
			: x(x), y(y)
101
		{ }
102
 
103
		double length() const {	return sqrt(pow(x, 2) + pow(y, 2));	}
104
 
105
		bool operator == (const point2d& other) const	{	return x==other.x && y==other.y; }
106
 
107
		bool operator != (const point2d& other) const {	return !(*this==other);	}
108
 
109
		point2d operator - (const value_type& b) const { return point2d(x - b, y - b); }
110
		point2d operator + (const value_type& b) const { return point2d(x + b, y + b); }
111
 
112
		point2d operator - (const point2d& b) const { return point2d(x - b.x, y - b.y); }
113
		point2d operator + (const point2d& b) const { return point2d(x + b.x, y + b.y); }
114
 
115
		point2d& operator -= (const value_type& b) { x -= b; y -= b; return *this; }
116
		point2d& operator += (const value_type& b) { x += b; y += b; return *this; }
117
 
118
		point2d& operator -= (const point2d& b) { x -= b.x; y -= b.y; return *this; }
119
		point2d& operator += (const point2d& b) { x += b.x; y += b.y; return *this; }
120
 
121
		bool operator > (double b) const { return length() > b; }
122
		bool operator < (double b) const { return length() < b; }
123
 
124
		bool operator > (const point2d& b) const { return length() > b.length(); }
125
		bool operator < (const point2d& b) const { return length() < b.length(); }
126
 
127
		point2d& operator /= (const value_type& v) { x/=v;	y/=v;	return *this;	}
128
		point2d& operator /= (const point2d& v)	{	x/=v.x;	y/=v.y;	return *this;	}
129
 
130
		point2d operator / (const value_type& v) const { return point2d(x / v, y / v); }
131
		point2d operator / (const point2d& v) const { return point2d(x / v.x, y / v.y); }
132
 
133
		point2d& operator *= (const value_type& v) { x*=v;	y*=v;	return *this;	}
134
		point2d& operator *= (const point2d& v) {	x*=v.x;	y*=v.y;	return *this;	}
135
 
136
		point2d operator * (const value_type& v) const { return point2d(x * v, y * v); }
137
		point2d operator * (const point2d& v) const { return point2d(x * v.x, y * v.y); }
138
 
139
		point2d normalize() const { return *this / length(); }
140
};
141
 
142
} // namespace geometry
143
 
144
#endif // !defined(GEOMETRY_INCLUDED)