File: vec3.h

package info (click to toggle)
esys-particle 2.3.4%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 13,036 kB
  • ctags: 10,805
  • sloc: cpp: 80,009; python: 5,872; makefile: 1,243; sh: 313; perl: 225
file content (139 lines) | stat: -rw-r--r-- 3,247 bytes parent folder | download
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