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
|
/////////////////////////////////////////////////////////////
// //
// Copyright (c) 2003-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.apache.org/licenses/LICENSE-2.0 //
// //
/////////////////////////////////////////////////////////////
#ifndef __VEC3_H
#define __VEC3_H
#include <iostream>
#include <math.h>
#include <string>
#include "Error.h"
using std::ostream;
using std::istream;
using std::string;
class Mat3;
class VecErr:public MError
{
public:
VecErr(const string&);
virtual ~VecErr(){};
};
struct VDMulVadd;
struct VDMul;
class Vec3
{
protected:
double data[3];
public:
// constructors
Vec3();
Vec3(double,double,double);
Vec3(const Vec3&);
// vec-vec operators
Vec3& operator=(const Vec3&);
Vec3& operator-=(const Vec3&);
Vec3& operator+=(const Vec3&);
Vec3 operator+(const Vec3&) const;
Vec3 operator-(const Vec3&) const;
double operator*(const Vec3&) const;
inline Vec3 operator-() { return Vec3(-data[0],-data[1],-data[2]); } ;
// vec-dbl ops
Vec3 operator*(double) const;
Vec3 operator/(double) const;
double norm() const;
double norm2() const;
Vec3 unit() const;
Vec3 unit_s() const; //safe version (throw exceptions)
double max() const;
double min() const;
bool operator==(const Vec3&);
bool operator!=(const Vec3&);
friend Vec3 cmax(const Vec3&,const Vec3&);
friend Vec3 cmin(const Vec3&,const Vec3&);
friend Vec3 cross(const Vec3&,const Vec3&);
friend Vec3 operator*(double,const Vec3&);
//n+1-ary operators
void mul_add_and_assign(const Vec3*,const Vec3*,const double&);
void mul_and_assign(const Vec3*,const double&);
Vec3(const VDMulVadd&);
Vec3& operator=(const VDMulVadd&);
Vec3(const VDMul&);
Vec3& operator=(const VDMul&);
//access stuff
inline double X() const {return data[0];};
inline double Y() const {return data[1];};
inline double Z() const {return data[2];};
inline double operator[](int i) const {return data[i];};
inline double& operator[](int i) {return data[i];};
// in/output
friend ostream& operator << (ostream&,const Vec3&);
friend istream& operator >> (istream&,Vec3&);
friend class Mat3;
};
//------------------------------
// stuff for 'n+1-ary' ops
// see Stroustrup, p.675 f.
//------------------------------
struct VDMul
{
const Vec3& v;
const double d;
VDMul(const Vec3& vv, const double& dd):v(vv),d(dd){}
// operator Vec3(){return Vec3(v.x*d,v.y*d,v.z*d);};
};
inline VDMul operator*(const Vec3& vv, const double& dd)
{
return VDMul(vv,dd);
}
struct VDMulVadd
{
const Vec3& v1;
const Vec3& v2;
const double& d;
VDMulVadd(const VDMul vd,const Vec3& vv):v1(vd.v),v2(vv),d(vd.d){}
//operator Vec3();
};
inline VDMulVadd operator+(const VDMul vd,const Vec3& vv)
{
return VDMulVadd(vd,vv);
}
#endif
|