1 /*
2 Orion's Standard Library
3 Orion Sky Lawlor, 2/22/2000
4 NAME:           vector2d.h
6 DESCRIPTION:    C++ 2-Dimentional vector library (no templates)
8 This file provides various utility routines for easily
9 manipulating 2-D vectors-- included are arithmetic,
10 dot product, magnitude and normalization terms.
11 All routines are provided right in the header file (for inlining).
13 Converted from vector3d.h.
15 */
17 #ifndef __OSL_VECTOR_2D_H
18 #define __OSL_VECTOR_2D_H
20 #include <math.h>
22 typedef double real;
24 //vector2d is a cartesian vector in 2-space-- an x and y.
25 class vector2d {
26 public:
27         real x,y;
28         vector2d(void) {}//Default consructor
29         //Simple 1-value constructor
30         explicit vector2d(const real init) {x=y=init;}
31         //Simple 1-value constructor
32         explicit vector2d(int init) {x=y=init;}
33         //2-value constructor
34         vector2d(const real Nx,const real Ny) {x=Nx;y=Ny;}
35         //Copy constructor
36         vector2d(const vector2d &copy) {x=copy.x;y=copy.y;}
38         //Cast-to-real * operators (treat vector as array)
39         operator real *() {return &x;}
40         operator const real *() const {return &x;}
42 /*Arithmetic operations: these are carefully restricted to just those
43  that make unambiguous sense (to me... now...  ;-)
44 Counterexamples: vector*vector makes no sense (use .dot()) because
45 real/vector is meaningless (and we'd want a*b/b==a for b!=0),
46 ditto for vector&vector (dot?), vector|vector (projection?),
47 vector^vector (cross?),real+vector, vector+=real, etc.
48 */
49         vector2d &operator=(const vector2d &b) {x=b.x;y=b.y;return *this;}
50         int operator==(const vector2d &b) const {return (x==b.x)&&(y==b.y);}
51         int operator!=(const vector2d &b) const {return (x!=b.x)||(y!=b.y);}
52         vector2d operator+(const vector2d &b) const {return vector2d(x+b.x,y+b.y);}
53         vector2d operator-(const vector2d &b) const {return vector2d(x-b.x,y-b.y);}
54         vector2d operator*(const real scale) const
55                 {return vector2d(x*scale,y*scale);}
56         friend vector2d operator*(const real scale,const vector2d &v)
57                 {return vector2d(v.x*scale,v.y*scale);}
58         vector2d operator/(const real &div) const
59                 {real scale=1.0/div;return vector2d(x*scale,y*scale);}
60         vector2d operator-(void) const {return vector2d(-x,-y);}
61         void operator+=(const vector2d &b) {x+=b.x;y+=b.y;}
62         void operator-=(const vector2d &b) {x-=b.x;y-=b.y;}
63         void operator*=(const real scale) {x*=scale;y*=scale;}
64         void operator/=(const real div) {real scale=1.0/div;x*=scale;y*=scale;}
66 //Vector-specific operations
67         //Return the square of the magnitude of this vector
68         real magSqr(void) const {return x*x+y*y;}
69         //Return the magnitude (length) of this vector
70         real mag(void) const {return sqrt(magSqr());}
72         //Return the square of the distance to the vector b
73         real distSqr(const vector2d &b) const
74                 {return (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y);}
75         //Return the distance to the vector b
76         real dist(const vector2d &b) const {return sqrt(distSqr(b));}
78         //Return the dot product of this vector and b
79         real dot(const vector2d &b) const {return x*b.x+y*b.y;}
80         //Return the cosine of the angle between this vector and b
81         real cosAng(const vector2d &b) const {return dot(b)/(mag()*b.mag());}
83         //Return the "direction" (unit vector) of this vector
84         vector2d dir(void) const {return (*this)/mag();}
86         //Return the CCW perpendicular vector
87         vector2d perp(void) const {return vector2d(-y,x);}
89         //Return this vector scaled by that
90         vector2d &scale(const vector2d &b) {x*=b.x;y*=b.y;return *this;}
92         //Return the largest coordinate in this vector
93         real max(void) {return (x>y)?x:y;}
94         //Make each of this vector's coordinates at least as big
95         // as the given vector's coordinates.
96         void enlarge(const vector2d &by)
97         {if (by.x>x) x=by.x; if (by.y>y) y=by.y;}
98 };
100 #endif //__OSL_VECTOR2D_H