1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/////////////////////////////////////////////////////////////
// //
// Copyright (c) 2007-2014 by The University of Queensland //
// Centre for Geoscience Computing //
// http://earth.uq.edu.au/centre-geoscience-computing //
// //
// Primary Business: Brisbane, Queensland, Australia //
// Licensed under the Open Software License version 3.0 //
// http://www.opensource.org/licenses/osl-3.0.php //
// //
/////////////////////////////////////////////////////////////
#ifndef __VECTOR3_H
#define __VECTOR3_H
#define DO_INLINE_VECTOR3 1
#if DO_INLINE_VECTOR3 >= 1
#define VECTOR3_INLINE inline
#else
#define VECTOR3_INLINE
#endif
#include <iostream>
#include <math.h>
#include <string>
//#include "Foundation/Error.h"
using std::ostream;
using std::istream;
using std::string;
//class Matrix3;
/*
class VecErr:public MError
{
public:
VecErr(const string&);
virtual ~VecErr(){};
};
*/
struct VDMulVadd;
struct VDMul;
class Vector3
{
protected:
double data[3];
public:
static const Vector3 ZERO; //! The zero vector.
// constructors
VECTOR3_INLINE Vector3();
VECTOR3_INLINE explicit Vector3(double s);
VECTOR3_INLINE Vector3(double,double,double);
VECTOR3_INLINE Vector3(const Vector3&);
// vec-vec operators
VECTOR3_INLINE Vector3& operator=(const Vector3&);
VECTOR3_INLINE Vector3& operator=(double s);
VECTOR3_INLINE Vector3& operator-=(const Vector3&);
VECTOR3_INLINE Vector3& operator+=(const Vector3&);
VECTOR3_INLINE Vector3 operator+(const Vector3&) const;
VECTOR3_INLINE Vector3 operator-(const Vector3&) const;
//wangyc added !
// VECTOR3_INLINE Vector3 operator*(const Matrix3 &m) const;
VECTOR3_INLINE double operator*(const Vector3&) const;
VECTOR3_INLINE Vector3 operator-() const;
// vec-dbl ops
VECTOR3_INLINE Vector3 operator*(double) const;
VECTOR3_INLINE Vector3& operator*=(double);
VECTOR3_INLINE Vector3 operator/(double) const;
VECTOR3_INLINE Vector3 operator-(double) const;
VECTOR3_INLINE Vector3 operator+(double) const;
VECTOR3_INLINE Vector3& operator+=(double);
VECTOR3_INLINE Vector3& operator-=(double);
// wangyc added !
VECTOR3_INLINE Vector3& operator/=(double);
VECTOR3_INLINE double norm() const;
VECTOR3_INLINE double wnorm(double,double,double) const;
VECTOR3_INLINE double norm2() const;
VECTOR3_INLINE double wnorm2(double,double,double) const;
VECTOR3_INLINE Vector3 unit() const;
// VECTOR3_INLINE Vector3 unit_s() const; //safe version (throw exceptions)
VECTOR3_INLINE double max() const;
VECTOR3_INLINE double min() const;
VECTOR3_INLINE Vector3 rotate(const Vector3 &axis, const Vector3 &axisPt) const;
VECTOR3_INLINE bool operator==(const Vector3&) const;
VECTOR3_INLINE bool operator!=(const Vector3&) const;
VECTOR3_INLINE friend Vector3 cmax(const Vector3&,const Vector3&);
VECTOR3_INLINE friend Vector3 cmin(const Vector3&,const Vector3&);
VECTOR3_INLINE friend Vector3 cross(const Vector3&,const Vector3&);
VECTOR3_INLINE friend double dot(const Vector3&,const Vector3&);
VECTOR3_INLINE friend Vector3 operator*(double,const Vector3&);
//n+1-ary operators
VECTOR3_INLINE void mul_add_and_assign(const Vector3*,const Vector3*,const double&);
VECTOR3_INLINE void mul_and_assign(const Vector3*,const double&);
VECTOR3_INLINE Vector3(const VDMulVadd&);
VECTOR3_INLINE Vector3& operator=(const VDMulVadd&);
VECTOR3_INLINE Vector3(const VDMul&);
VECTOR3_INLINE Vector3& operator=(const VDMul&);
//access stuff
VECTOR3_INLINE void set_x(double x) {data[0] = x;}
VECTOR3_INLINE void set_y(double y) {data[1] = y;}
VECTOR3_INLINE void set_z(double z) {data[2] = z;}
// void set_xyz(double x, double y, double z)
// { data[0] = x; data[1] = y; data[2] = z;}
VECTOR3_INLINE double& X() {return data[0];};
VECTOR3_INLINE double& Y() {return data[1];};
VECTOR3_INLINE double& Z() {return data[2];};
VECTOR3_INLINE double x() const {return data[0];};
VECTOR3_INLINE double y() const {return data[1];};
VECTOR3_INLINE double z() const {return data[2];};
VECTOR3_INLINE const double &operator[](int i) const {return data[i];}
VECTOR3_INLINE double& operator[](int i) {return data[i];}
// in/output
VECTOR3_INLINE friend ostream& operator << (ostream&,const Vector3&);
VECTOR3_INLINE friend istream& operator >> (istream&,Vector3&);
// comparison -> enable to use of Vector3 as key in STL map and set
bool operator<(const Vector3&) const;
// friend class Matrix3;
};
VECTOR3_INLINE Vector3 comp_max(const Vector3&,const Vector3&); //!< per component maximum
VECTOR3_INLINE Vector3 comp_min(const Vector3&,const Vector3&); //!< per component minimum
#if DO_INLINE_VECTOR3 >= 1
#include "vector3.hh"
#endif
#endif // __VECTOR3_H
|