diff --git a/src/vector.h b/src/vector.h new file mode 100644 --- /dev/null +++ b/src/vector.h @@ -0,0 +1,162 @@ +/* + * + * $Id$ + * + * This file is part of the Virtual Leaf. + * + * The Virtual Leaf is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Virtual Leaf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Virtual Leaf. If not, see . + * + * Copyright 2010 Roeland Merks. + * + */ + + +#ifndef _VECTOR_H_ +#define _VECTOR_H_ + +#include +#include +#include "sqr.h" +#ifdef QTGRAPHICS + #include +#endif + +// three dimensional vector +using namespace std; + +class Vector { + +public: + inline Vector(const double cx=0,const double cy=0,const double cz=0) { + x=cx; + y=cy; + z=cz; + }; + explicit inline Vector(const double m[3]) { + x=m[0]; + y=m[1]; + z=m[2]; + } + + // should be taken over by default arguments of Vector constructor + /* inline Vector(void) { */ + /* x=0.; */ + /* y=0.; */ + /* z=0.; */ + /* } */ + + inline Vector(const Vector &source) { + + // copy constructor + + x=source.x; + y=source.y; + z=source.z; + + } + // type conversion from and to QPointF (2D vector class from Qt library; we throw away "z" here!!) + #ifdef QTGRAPHICS + inline operator QPointF() const { + return QPointF( x, y ); + } + inline Vector(const QPointF &p) { + x = p.x(); + y = p.y(); + z = 0.; + } + #endif + virtual ~Vector() { + + }; + + virtual ostream& print(ostream &os) const; + void operator=(const Vector &source); // assignment operator + void operator=(const double &s) { + x=s; + y=s; + z=s; + } + Vector operator+(const Vector &v) const; // addition + inline Vector operator-(const Vector &v) const { + + Vector result; + + result.x=x-v.x; + result.y=y-v.y; + result.z=z-v.z; + + return result; + + } + Vector &operator-=(const Vector &v); + + inline Vector &operator+=(const Vector &v) { + + x+=v.x; + y+=v.y; + z+=v.z; + + return *this; + + } + + Vector operator/(const double divisor) const; // division by a double + Vector operator*(const double multiplier) const; // multiply by a scalar (double) + Vector &operator/=(const double divisor); + Vector &operator*=(const double multiplier); + Vector operator*(const Vector &v) const; // cross product + bool operator==(const Vector &v) const; // comparison + bool operator< (const Vector &v) const; // order x,y,z + //double Norm(void) const; // gives the "norm" (| v |) of v + inline double Norm(void) const { + + return sqrt(DSQR(x)+DSQR(y)+DSQR(z)); + + } + + // Quick and dirty Norm (i.e. Manhattan distance) + // (e.g. useful if we want to see if the vec is (0,0,0); + inline double ManhattanNorm(void) const { + return x+y+z; + } + + double SqrNorm(void) const; // gives the square of |v| + void Normalise(void); // normalise myself + Vector Normalised(void) const; // return me normalised + double Angle(const Vector &angle) const; // gives the angle between me and another vector + double SignedAngle(const Vector &v) const; + bool SameDirP(const Vector &v); + double Max(void); // Find max, resp. min value of vector + double Min(void); + Vector Perp2D(void) const { + return Vector(y,-x,0); + } + // data members + double x,y,z; + + void Dump(ostream &os) const { + os << x << " " << y << " " << z << " "; + } + void ReadDump(istream &is) { + is >> x >> y >> z; + } +private: + +}; + +ostream &operator<<(ostream &os, const Vector &v); +Vector operator*(const double multiplier, const Vector &v); +double InnerProduct(const Vector &v1, const Vector &v2); + +#endif