/* * * $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 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