File: vec3.h

package info (click to toggle)
esys-particle 2.3.5%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 13,132 kB
  • sloc: cpp: 81,480; python: 5,872; makefile: 1,259; sh: 313; perl: 225
file content (145 lines) | stat: -rw-r--r-- 4,450 bytes parent folder | download | duplicates (5)
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
/////////////////////////////////////////////////////////////
//                                                         //
// Copyright (c) 2003-2017 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

#define DO_INLINE_VEC3 1

#if DO_INLINE_VEC3 >= 1
#define VEC3_INLINE inline
#else
#define VEC3_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 Vec3
{
protected:
  double data[3];

public:
  static const Vec3 ZERO; //! The zero vector.
  // constructors
  VEC3_INLINE Vec3();
  VEC3_INLINE explicit Vec3(double s);
  VEC3_INLINE Vec3(double,double,double);
  VEC3_INLINE Vec3(const Vec3&);

  // vec-vec operators
  VEC3_INLINE Vec3& operator=(const Vec3&);
  VEC3_INLINE Vec3& operator=(double s);
  VEC3_INLINE Vec3& operator-=(const Vec3&);
  VEC3_INLINE Vec3& operator+=(const Vec3&);
  VEC3_INLINE Vec3 operator+(const Vec3&) const;
  VEC3_INLINE Vec3 operator-(const Vec3&) const;
//wangyc added !
  VEC3_INLINE Vec3 operator*(const Matrix3 &m) const;
  VEC3_INLINE double operator*(const Vec3&) const; 
  VEC3_INLINE Vec3 operator-() const;
  
  // vec-dbl ops
  VEC3_INLINE Vec3 operator*(double) const;
  VEC3_INLINE Vec3& operator*=(double);
  VEC3_INLINE Vec3 operator/(double) const;
  VEC3_INLINE Vec3 operator-(double) const;
  VEC3_INLINE Vec3 operator+(double) const;
  VEC3_INLINE Vec3& operator+=(double);
  VEC3_INLINE Vec3& operator-=(double);

// wangyc added !
  VEC3_INLINE Vec3& operator/=(double);
  VEC3_INLINE double norm() const;
  VEC3_INLINE double norm2() const;
  VEC3_INLINE Vec3 unit() const;
  VEC3_INLINE Vec3 unit_s() const; //safe version (throw exceptions)
  VEC3_INLINE double max() const;
  VEC3_INLINE double min() const;

  VEC3_INLINE Vec3 rotate(const Vec3 &axis, const Vec3 &axisPt) const;

  VEC3_INLINE bool operator==(const Vec3&) const;
  VEC3_INLINE bool operator!=(const Vec3&) const;

  VEC3_INLINE friend Vec3 cmax(const Vec3&,const Vec3&);
  VEC3_INLINE friend Vec3 cmin(const Vec3&,const Vec3&);

  VEC3_INLINE friend Vec3 cross(const Vec3&,const Vec3&);
  VEC3_INLINE friend double dot(const Vec3&,const Vec3&); 
  VEC3_INLINE friend Vec3 operator*(double,const Vec3&);

  //n+1-ary operators
  VEC3_INLINE void mul_add_and_assign(const Vec3*,const Vec3*,const double&);
  VEC3_INLINE void mul_and_assign(const Vec3*,const double&);

  VEC3_INLINE Vec3(const VDMulVadd&);
  VEC3_INLINE Vec3& operator=(const VDMulVadd&);

  VEC3_INLINE Vec3(const VDMul&);
  VEC3_INLINE Vec3& operator=(const VDMul&);

  //access stuff
// wangyc added ! 
  VEC3_INLINE void set_x(double x) {data[0] = x;}
  VEC3_INLINE void set_y(double y) {data[1] = y;}
  VEC3_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;}
  
  VEC3_INLINE double& X() {return data[0];};
  VEC3_INLINE double& Y() {return data[1];};
  VEC3_INLINE double& Z() {return data[2];};
  VEC3_INLINE double X() const {return data[0];};
  VEC3_INLINE double Y() const {return data[1];};
  VEC3_INLINE double Z() const {return data[2];};
  VEC3_INLINE const double &operator[](int i) const {return data[i];}
  VEC3_INLINE double& operator[](int i) {return data[i];}

  // in/output
  VEC3_INLINE friend ostream& operator << (ostream&,const Vec3&);
  VEC3_INLINE friend istream& operator >> (istream&,Vec3&);

  // comparison -> enable to use of Vec3 as key in STL map and set
  bool operator<(const Vec3&) const; 

  friend class Matrix3;
};

VEC3_INLINE Vec3 comp_max(const Vec3&,const Vec3&); //!< per component maximum
VEC3_INLINE Vec3 comp_min(const Vec3&,const Vec3&); //!< per component minimum

#if DO_INLINE_VEC3 >= 1
#include "Foundation/vec3.hpp"
#endif

#endif // __VEC3_H